Completed
Push — master ( 8acc04...458fbe )
by Laurent
02:26
created

FlightValidator::checkBillingInformation()   B

Complexity

Conditions 10
Paths 9

Size

Total Lines 23

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 10
nc 9
nop 2
dl 0
loc 23
rs 7.6666
c 0
b 0
f 0

How to fix   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
require_once __DIR__ . '/AbstractValidator.php';
4
require_once __DIR__ . '/../class/bbcvols.class.php';
5
6
/**
7
 * Validates a flight
8
 *
9
 * @author Laurent De Coninck <[email protected]>
10
 */
11
class FlightValidator extends AbstractValidator
12
{
13
    /**
14
     * @var Product
15
     */
16
    private $defaultService;
17
18
    /**
19
     * @inheritDoc
20
     */
21
    public function __construct(Translate $langs, DoliDB $db, $defaultServiceId)
22
    {
23
        parent::__construct($langs, $db);
24
        $this->fetchService($defaultServiceId);
25
    }
26
27
    /**
28
     * {@inheritdoc}
29
     */
30
    public function isValid($vol, $context = [])
31
    {
32
        if (!($vol instanceof Bbcvols)) {
33
            throw new \InvalidArgumentException('Flight validator only accepts a flight');
34
        }
35
36
        $this->valid = true;
37
38
        $this->checkFlightInformation($vol)
39
            ->checkPassengersInformation($vol)
40
            ->checkInstructionInformation($vol, $context)
41
            ->checkBillingInformation($vol, $context)
42
            ->checkKilometers($vol);
43
44
        return $this->valid;
45
    }
46
47
    /**
48
     * @param array $context
49
     *
50
     * @return bool
51
     */
52
    private function isGroupedFlight($context)
53
    {
54
        return key_exists('grouped_flight', $context) && !empty($context['grouped_flight']);
55
    }
56
57
    /**
58
     * @param string $hour
59
     *
60
     * @return bool
61
     */
62
    private function isHourValid($hour)
63
    {
64
        $patern = '#[0-9]{4}#';
65
        return !(preg_match($patern, $hour) == 0 || strlen($hour) != 4);
66
    }
67
68
    /**
69
     * @param $defaultServiceId
70
     */
71
    private function fetchService($defaultServiceId)
72
    {
73
        $this->defaultService = new Product($this->db);
74
        $this->defaultService->fetch($defaultServiceId);
75
    }
76
77
    /**
78
     * Returns the minimum price.
79
     *
80
     * @return int
81
     */
82
    private function getMinPrice()
83
    {
84
        if ($this->defaultService->price_base_type == 'TTC') {
85
            return $this->defaultService->price_min;
86
        }
87
        return $this->defaultService->price_min_ttc;
88
    }
89
90
    /**
91
     * @param Bbcvols $vol
92
     * @param array   $context
93
     *
94
     * @return $this
95
     */
96
    private function checkBillingInformation($vol, $context)
97
    {
98
        if($vol->isLinkedToOrder()){
99
            return $this;
100
        }
101
102
        if ($this->isGroupedFlight($context) && $vol->getFlightType()->isBillingRequired() && $vol->isFree()) {
103
            $this->addError('cost', 'Erreur ce type de vol doit être payant.');
104
        }
105
106
        if ($vol->getFlightType()->isBillingRequired() && !$vol->hasReceiver()) {
107
            $this->addError('cost',
108
                'Erreur ce type de vol doit être payant, mais personne n\'a été signalé comme recepteur d\'argent.');
109
        }
110
111
        if (!$this->isGroupedFlight($context) && $vol->getFlightType()->isBillingRequired() && ($vol->getAmountPerPassenger()) < $this->getMinPrice()) {
112
            $this->addError('cost',
113
                sprintf('Le montant demandé pour ce vol n\'est pas suffisant un minimum de %s euros est demandé',
114
                    $this->getMinPrice()));
115
        }
116
117
        return $this;
118
    }
119
120
    /**
121
     * @param Bbcvols $vol
122
     * @param array $context
123
     *
124
     * @return $this
125
     */
126
    private function checkInstructionInformation($vol, $context)
127
    {
128
        if ($vol->isInstruction()) {
129
            if ($vol->getPilotId() === $vol->getOrganisatorId()) {
130
                $this->addError('organisator',
131
                    'l\'organisateur d\'un vol d\'instruction doit être l\'instructeur et non le pilote');
132
            }
133
134
            if ($this->isGroupedFlight($context)) {
135
                $this->addError('alone', "Le vol d'instruction est un vol à un seul ballon.");
136
            }
137
        }
138
139
        return $this;
140
    }
141
142
    /**
143
     * @param Bbcvols $vol
144
     *
145
     * @return $this
146
     */
147
    private function checkPassengersInformation($vol)
148
    {
149
        if (!is_numeric($vol->nbrPax) || (int) $vol->nbrPax < 0) {
150
            $this->addError('nbrPax', 'Erreur le nombre de passager est un nombre négatif.');
151
        }
152
153
        if ($vol->mustHavePax()) {
154
            if (!$vol->hasPax()) {
155
                $this->addError('nbrPax', 'Erreur ce type de vol doit etre fait avec des passagers.');
156
            }
157
158
            if (empty(trim($vol->getPassengerNames()))) {
159
                $this->addError('passenger_names', 'Le nom des passagers est obligatoire.');
160
            }
161
162
            $passengers = explode(';', $vol->getPassengerNames());
163
            if (count($passengers) !== $vol->getNumberOfPassengers()) {
164
                $this->addError('passenger_names',
165
                    'Le nombre de noms des passagers doit être égale au nombre de passagers.');
166
            }
167
168
        }
169
170
        return $this;
171
    }
172
173
    /**
174
     * @param Bbcvols $vol
175
     *
176
     * @return $this
177
     */
178
    private function checkKilometers($vol)
179
    {
180
        if ($vol->hasKilometers() && !$vol->getKilometers() > 0) {
181
            $this->addError('kilometers',
182
                'Les kilometres doivent être un nombre positif');
183
        }
184
185
        if ($vol->hasKilometers() && !$vol->hasKilometersDescription()) {
186
            $this->addError('justif_kilometers',
187
                'Vous essayez d\'encoder des kilometres sans justificatif.');
188
        }
189
190
        return $this;
191
    }
192
193
    /**
194
     * @param Bbcvols $vol
195
     *
196
     * @return $this
197
     */
198
    private function checkFlightInformation($vol)
199
    {
200
        if (!$this->isHourValid($vol->heureD)) {
201
            $this->addError('heureD', "L'heure depart n'est pas correcte'");
202
        }
203
204
        if (!$this->isHourValid($vol->heureA)) {
205
            $this->addError('heureA', 'L\'heure d\'arrivee n\'est pas correcte');
206
        }
207
208
        if (empty($this->errors) && ($vol->heureA - $vol->heureD) <= 0) {
209
            $this->addError('heures', 'L\'heure de depart est plus grande  que l\'heure d\'arrivee');
210
        }
211
212
        if (empty($vol->lieuD)) {
213
            $this->addError('lieuD', 'Le lieu de départ est vide');
214
        }
215
216
        if (empty($vol->lieuA)) {
217
            $this->addError('lieuA', 'Le lieu d\'arrivée est vide');
218
        }
219
220
        return $this;
221
    }
222
}