ExtraSchedulesLoop::buildArray()   F
last analyzed

Complexity

Conditions 29
Paths 1280

Size

Total Lines 124

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 124
rs 0
c 0
b 0
f 0
cc 29
nc 1280
nop 0

How to fix   Long Method    Complexity   

Long Method

Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.

For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.

Commonly applied refactorings include:

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())->add(\DateInterval::createFromDateString('yesterday')), 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
        if ($this->getMergeDay()) {
132
            $query->orderByBegin();
133
        }
134
135
        $dealerSchedules = $query->find();
136
137
        if ($this->getMergeDay()) {
138
            $dealerCount = count($dealerSchedules);
139
140
            for ($i = 0; $i < $dealerCount; $i++) {
141
142
                if (isset($dealerSchedules[$i])) {
143
144
                    $formattedHours = null;
145
146
                    // if the next result has the same dates, same day, then concat the morning and afternoon hours
147
                    if (
148
                        ($dealerSchedules[$i+1] !== null)
149
                        && ($dealerSchedules[$i]->getDay() == $dealerSchedules[$i+1]->getDay())
150
                        && ($dealerSchedules[$i]->getDealerId() == $dealerSchedules[$i+1]->getDealerId())
151
                        && ($dealerSchedules[$i]->getPeriodBegin() == $dealerSchedules[$i+1]->getPeriodBegin())
152
                        && ($dealerSchedules[$i]->getPeriodEnd() == $dealerSchedules[$i+1]->getPeriodEnd())
153
                    ) {
154
                        $end = $dealerSchedules[$i+1]->getEnd();
155
                        if ($dealerSchedules[$i]->getEnd()->format('H\hi') === $dealerSchedules[$i+1]->getBegin()->format('H\hi')) {
156
                            $formattedHours = date_format($dealerSchedules[$i]->getBegin(), 'H\hi') . $this->getHourSeparator() . date_format($dealerSchedules[$i+1]->getEnd(), 'H\hi');
157
                        } else {
158
                            $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');
159
                        }
160
                        unset($dealerSchedules[$i+1]);
161
                    } else {
162
                        $end = $dealerSchedules[$i]->getEnd();
163
                        if ($dealerSchedules[$i]->getBegin() && $dealerSchedules[$i]->getEnd()) {
164
                            $formattedHours = date_format($dealerSchedules[$i]->getBegin(), 'H\hi') . $this->getHourSeparator() . date_format($dealerSchedules[$i]->getEnd(), 'H\hi');
165
                        }
166
                    }
167
168
                    $results[] = array(
169
                        'ID' => $dealerSchedules[$i]->getId(),
170
                        'DEALER_ID' => $dealerSchedules[$i]->getDealerId(),
171
                        'DAY' => $dealerSchedules[$i]->getDay(),
172
                        'DAY_LABEL' => ($dealerSchedules[$i]->getDay() === null) ? null : $this->getDayLabel($dealerSchedules[$i]->getDay()),
173
                        'PERIOD_BEGIN' => $dealerSchedules[$i]->getPeriodBegin(),
174
                        'PERIOD_END' => $dealerSchedules[$i]->getPeriodEnd(),
175
                        'BEGIN' => $dealerSchedules[$i]->getBegin(),
176
                        'END' => $end,
177
                        'FORMATTED_HOURS' => $formattedHours
178
                    );
179
                }
180
            }
181
        } else {
182
            foreach ($dealerSchedules as $dealerSchedule) {
183
                $results[] = array(
184
                    'DEALER_ID' => $dealerSchedule->getDealerId(),
185
                    'ID' => $dealerSchedule->getId(),
186
                    'DAY' => $dealerSchedule->getDay(),
187
                    'DAY_LABEL' => ($dealerSchedule->getDay() === null) ? null : $this->getDayLabel($dealerSchedule->getDay()),
188
                    'BEGIN' => $dealerSchedule->getBegin(),
189
                    'END' => $dealerSchedule->getEnd(),
190
                    'PERIOD_BEGIN' => $dealerSchedule->getPeriodBegin(),
191
                    'PERIOD_END' => $dealerSchedule->getPeriodEnd(),
192
                    'FORMATTED_HOURS' => date_format($dealerSchedule->getBegin(), 'H\hi') . $this->getHourSeparator() . date_format($dealerSchedule->getEnd(), 'H\hi')
193
                );
194
            }
195
        }
196
197
        return $results;
198
    }
199
200
    protected function getDayLabel($int = 0)
201
    {
202
        return [
203
            $this->translator->trans("Monday", [], Dealer::MESSAGE_DOMAIN),
204
            $this->translator->trans("Tuesday", [], Dealer::MESSAGE_DOMAIN),
205
            $this->translator->trans("Wednesday", [], Dealer::MESSAGE_DOMAIN),
206
            $this->translator->trans("Thursday", [], Dealer::MESSAGE_DOMAIN),
207
            $this->translator->trans("Friday", [], Dealer::MESSAGE_DOMAIN),
208
            $this->translator->trans("Saturday", [], Dealer::MESSAGE_DOMAIN),
209
            $this->translator->trans("Sunday", [], Dealer::MESSAGE_DOMAIN)
210
        ][$int];
211
    }
212
}