RegularSchedulesLoop::buildArray()   F
last analyzed

Complexity

Conditions 20
Paths 384

Size

Total Lines 105

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 105
rs 0.8266
c 0
b 0
f 0
cc 20
nc 384
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 RegularSchedulesLoop 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('ID', $schedules['ID'])
32
                ->set('DEALER_ID', $schedules['DEALER_ID'])
33
                ->set('DAY', $schedules['DAY'])
34
                ->set('DAY_LABEL', $schedules['DAY_LABEL'])
35
                ->set('BEGIN', $schedules['BEGIN'])
36
                ->set('END', $schedules['END'])
37
                ->set('FORMATTED_HOURS', $schedules['FORMATTED_HOURS'])
38
            ;
39
40
            $loopResult->addRow($loopResultRow);
41
        }
42
43
        return $loopResult;
44
    }
45
46
    protected function getArgDefinitions()
47
    {
48
        return new ArgumentCollection(
49
50
            Argument::createIntListTypeArgument('id'),
51
            Argument::createIntListTypeArgument('dealer_id'),
52
            Argument::createIntListTypeArgument('day'),
53
            Argument::createAnyTypeArgument('hour_separator', ' - '),
54
            Argument::createAnyTypeArgument('half_day_separator', ' / '),
55
            Argument::createBooleanTypeArgument('merge_day', true),
56
            Argument::createEnumListTypeArgument('order', [
57
                'id',
58
                'id-reverse',
59
                'day',
60
                'day-reverse',
61
                'begin',
62
                'begin-reverse',
63
            ], 'day')
64
65
        );
66
    }
67
68
    public function buildArray()
69
    {
70
        $results = array();
71
72
        $query = DealerShedulesQuery::create();
73
74
        // this is the sql feature for regular schedule
75
        $query->filterByPeriodNull();
76
        $query->filterByClosed(false);
77
78
        if ($id = $this->getId()) {
79
            $query->filterById($id);
80
        }
81
82
        if ($day = $this->getDay()) {
83
            $query->filterByDay($day);
84
        }
85
86
        if ($dealer_id = $this->getDealerId()) {
87
            $query->filterByDealerId($dealer_id);
88
        }
89
90
        foreach ($this->getOrder() as $order) {
91
            switch ($order) {
92
                case 'id':
93
                    $query->orderById();
94
                    break;
95
                case 'id-reverse':
96
                    $query->orderById(Criteria::DESC);
97
                    break;
98
                case 'day':
99
                    $query->orderByDay();
100
                    break;
101
                case 'day-reverse':
102
                    $query->orderByDay(Criteria::DESC);
103
                    break;
104
                case 'begin':
105
                    $query->orderByBegin();
106
                    break;
107
                case 'begin-reverse':
108
                    $query->orderByBegin(Criteria::DESC);
109
                    break;
110
                default:
111
                    break;
112
            }
113
        }
114
115
        if ($this->getMergeDay()) {
116
            $query->orderByBegin();
117
        }
118
119
        $dealerSchedules = $query->find();
120
121
        if ($this->getMergeDay()) {
122
            $dealerCount = count($dealerSchedules);
123
124
            for ($i = 0; $i < $dealerCount; $i++) {
125
126
                if (isset($dealerSchedules[$i])) {
127
128
                    // if the next result has the same dates, same day, then concat the morning and afternoon hours
129
                    if (
130
                        ($dealerSchedules[$i+1] !== null)
131
                        && ($dealerSchedules[$i]->getDay() == $dealerSchedules[$i+1]->getDay())
132
                        && ($dealerSchedules[$i]->getDealerId() == $dealerSchedules[$i+1]->getDealerId())
133
                    ) {
134
                        $end = $dealerSchedules[$i+1]->getEnd();
135
                        if ($dealerSchedules[$i]->getEnd()->format('H\hi') === $dealerSchedules[$i+1]->getBegin()->format('H\hi')) {
136
                            $formattedHours = date_format($dealerSchedules[$i]->getBegin(), 'H\hi') . $this->getHourSeparator() . date_format($dealerSchedules[$i+1]->getEnd(), 'H\hi');
137
                        } else {
138
                            $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');
139
                        }
140
                        unset($dealerSchedules[$i+1]);
141
                    } else {
142
                        $end = $dealerSchedules[$i]->getEnd();
143
                        $formattedHours = date_format($dealerSchedules[$i]->getBegin(), 'H\hi') . $this->getHourSeparator() . date_format($dealerSchedules[$i]->getEnd(), 'H\hi');
144
                    }
145
146
                    $results[] = array(
147
                        'ID' => $dealerSchedules[$i]->getId(),
148
                        'DEALER_ID' => $dealerSchedules[$i]->getDealerId(),
149
                        'DAY' => $dealerSchedules[$i]->getDay(),
150
                        'DAY_LABEL' => $this->getDayLabel($dealerSchedules[$i]->getDay()),
151
                        'BEGIN' => $dealerSchedules[$i]->getBegin(),
152
                        'END' => $end,
153
                        'FORMATTED_HOURS' => $formattedHours,
154
                    );
155
                }
156
            }
157
        } else {
158
            foreach ($dealerSchedules as $dealerSchedule) {
159
                $results[] = array(
160
                    'DEALER_ID' => $dealerSchedule->getDealerId(),
161
                    'ID' => $dealerSchedule->getId(),
162
                    'DAY' => $dealerSchedule->getDay(),
163
                    'DAY_LABEL' => $this->getDayLabel($dealerSchedule->getDay()),
164
                    'BEGIN' => $dealerSchedule->getBegin(),
165
                    'END' => $dealerSchedule->getEnd(),
166
                    'FORMATTED_HOURS' => date_format($dealerSchedule->getBegin(), 'H\hi') . $this->getHourSeparator() . date_format($dealerSchedule->getEnd(), 'H\hi')
167
                );
168
            }
169
        }
170
171
        return $results;
172
    }
173
174
    protected function getDayLabel($int = 0)
175
    {
176
        return [
177
            $this->translator->trans("Monday", [], Dealer::MESSAGE_DOMAIN),
178
            $this->translator->trans("Tuesday", [], Dealer::MESSAGE_DOMAIN),
179
            $this->translator->trans("Wednesday", [], Dealer::MESSAGE_DOMAIN),
180
            $this->translator->trans("Thursday", [], Dealer::MESSAGE_DOMAIN),
181
            $this->translator->trans("Friday", [], Dealer::MESSAGE_DOMAIN),
182
            $this->translator->trans("Saturday", [], Dealer::MESSAGE_DOMAIN),
183
            $this->translator->trans("Sunday", [], Dealer::MESSAGE_DOMAIN)
184
        ][$int];
185
    }
186
}