Test Failed
Push — master ( f8eb03...8feb3a )
by Francimar
06:03
created

Imposto::toArray()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 11

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 9
CRAP Score 1

Importance

Changes 0
Metric Value
dl 0
loc 11
ccs 9
cts 9
cp 1
rs 9.9
c 0
b 0
f 0
cc 1
nc 1
nop 1
crap 1
1
<?php
2
/**
3
 * MIT License
4
 *
5
 * Copyright (c) 2016 MZ Desenvolvimento de Sistemas LTDA
6
 *
7
 * @author Francimar Alves <[email protected]>
8
 *
9
 * Permission is hereby granted, free of charge, to any person obtaining a copy
10
 * of this software and associated documentation files (the "Software"), to deal
11
 * in the Software without restriction, including without limitation the rights
12
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
13
 * copies of the Software, and to permit persons to whom the Software is
14
 * furnished to do so, subject to the following conditions:
15
 *
16
 * The above copyright notice and this permission notice shall be included in all
17
 * copies or substantial portions of the Software.
18
 *
19
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
20
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
22
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
23
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
24
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
25
 * SOFTWARE.
26
 *
27
 */
28
namespace NFe\Entity;
29
30
use NFe\Common\Node;
31
use NFe\Common\Util;
32
33
/**
34
 * Classe base dos impostos
35
 */
36
abstract class Imposto implements Node
0 ignored issues
show
Complexity introduced by
This class has a complexity of 86 which exceeds the configured maximum of 50.

The class complexity is the sum of the complexity of all methods. A very high value is usually an indication that your class does not follow the single reponsibility principle and does more than one job.

Some resources for further reading:

You can also find more detailed suggestions for refactoring in the “Code” section of your repository.

Loading history...
Complexity introduced by
The class Imposto has a coupling between objects value of 35. Consider to reduce the number of dependencies under 13.
Loading history...
37
{
38
39
    /**
40
     * Tipo de imposto
41
     */
42
    const TIPO_IMPORTADO = 'importado';
43
    const TIPO_NACIONAL = 'nacional';
44
    const TIPO_ESTADUAL = 'estadual';
45
    const TIPO_MUNICIPAL = 'municipal';
46
47
    /**
48
     * Grupo do imposto
49
     */
50
    const GRUPO_ICMS = 'icms';
51
    const GRUPO_PIS = 'pis';
52
    const GRUPO_COFINS = 'cofins';
53
    const GRUPO_IPI = 'ipi';
54
    const GRUPO_II = 'ii';
55
    const GRUPO_PISST = 'pisst';
56
    const GRUPO_COFINSST = 'cofinsst';
57
    const GRUPO_ISSQN = 'issqn';
58
    const GRUPO_ICMSUFDEST = 'icmsufdest';
59
60
    private $tipo;
61
    private $grupo;
62
    private $tributacao;
63
    private $aliquota;
64
    private $base;
65
66 141
    public function __construct($imposto = [])
67
    {
68 141
        $this->fromArray($imposto);
69 141
    }
70
71
    /**
72
     * Tipo de imposto
73
     */
74 57
    public function getTipo($normalize = false)
75
    {
76 57
        if (!$normalize) {
77 57
            return $this->tipo;
78
        }
79
        return $this->tipo;
80
    }
81
82 141
    public function setTipo($tipo)
83
    {
84 141
        $this->tipo = $tipo;
85 141
        return $this;
86
    }
87
88
    /**
89
     * Grupo do imposto
90
     */
91 84
    public function getGrupo($normalize = false)
92
    {
93 84
        if (!$normalize) {
94 84
            return $this->grupo;
95
        }
96 34
        switch ($this->grupo) {
97 34
            case self::GRUPO_ICMS:
98 34
                return 'ICMS';
99 32
            case self::GRUPO_PIS:
100 32
                return 'PIS';
101 32
            case self::GRUPO_COFINS:
102 32
                return 'COFINS';
103
            case self::GRUPO_IPI:
104
                return 'IPI';
105
            case self::GRUPO_II:
106
                return 'II';
107
            case self::GRUPO_PISST:
108
                return 'PISST';
109
            case self::GRUPO_COFINSST:
110
                return 'COFINSST';
111
            case self::GRUPO_ISSQN:
112
                return 'ISSQN';
113
            case self::GRUPO_ICMSUFDEST:
114
                return 'ICMSUFDest';
115
        }
116
        return $this->grupo;
117
    }
118
119 141
    public function setGrupo($grupo)
120
    {
121 141
        switch ($grupo) {
122 141
            case 'ICMS':
123 29
                $grupo = self::GRUPO_ICMS;
124 29
                break;
125 141
            case 'PIS':
126 27
                $grupo = self::GRUPO_PIS;
127 27
                break;
128 141
            case 'COFINS':
129 27
                $grupo = self::GRUPO_COFINS;
130 27
                break;
131 141
            case 'IPI':
132
                $grupo = self::GRUPO_IPI;
133
                break;
134 141
            case 'II':
135
                $grupo = self::GRUPO_II;
136
                break;
137 141
            case 'PISST':
138
                $grupo = self::GRUPO_PISST;
139
                break;
140 141
            case 'COFINSST':
141
                $grupo = self::GRUPO_COFINSST;
142
                break;
143 141
            case 'ISSQN':
144
                $grupo = self::GRUPO_ISSQN;
145
                break;
146 141
            case 'ICMSUFDest':
147
                $grupo = self::GRUPO_ICMSUFDEST;
148
                break;
149
        }
150 141
        $this->grupo = $grupo;
151 141
        return $this;
152
    }
153
154
    /**
155
     * Código da situação tributária
156
     */
157 126
    public function getTributacao($normalize = false)
158
    {
159 126
        if (!$normalize) {
160 90
            return $this->tributacao;
161
        }
162 105
        return $this->tributacao;
163
    }
164
165 141
    public function setTributacao($tributacao)
166
    {
167 141
        $this->tributacao = $tributacao;
168 141
        return $this;
169
    }
170
171
    /**
172
     * Porcentagem do imposto
173
     */
174 117
    public function getAliquota($normalize = false)
175
    {
176 117
        if (!$normalize) {
177 117
            return $this->aliquota;
178
        }
179 96
        return Util::toFloat($this->aliquota);
180
    }
181
182 141
    public function setAliquota($aliquota)
183
    {
184 141
        $this->aliquota = $aliquota;
185 141
        return $this;
186
    }
187
188
    /**
189
     * Valor base para cálculo do imposto
190
     */
191 119
    public function getBase($normalize = false)
192
    {
193 119
        if (!$normalize) {
194 116
            return $this->base;
195
        }
196 88
        return Util::toCurrency($this->base);
197
    }
198
199
    /**
200
     * Altera o valor do Base para o informado no parâmetro
201
     * @param mixed $base novo valor para Base
202
     * @return Imposto A própria instância da classe
203
     */
204 141
    public function setBase($base)
205
    {
206 141
        $this->base = $base;
207 141
        return $this;
208
    }
209
210
    /**
211
     * Calcula o valor do imposto com base na aliquota e valor base
212
     */
213 97
    public function getValor($normalize = false)
214
    {
215 97
        if (!$normalize) {
216 97
            return ($this->getBase() * $this->getAliquota()) / 100.0;
217
        }
218 82
        return Util::toCurrency($this->getValor());
219
    }
220
221
    /**
222
     * Obtém o valor total do imposto
223
     */
224 36
    public function getTotal($normalize = false)
225
    {
226 36
        return $this->getValor($normalize);
227
    }
228
229 57
    public function toArray($recursive = false)
230
    {
231 57
        $imposto = [];
232 57
        $imposto['tipo'] = $this->getTipo();
233 57
        $imposto['grupo'] = $this->getGrupo();
234 57
        $imposto['tributacao'] = $this->getTributacao();
235 57
        $imposto['aliquota'] = $this->getAliquota();
236 57
        $imposto['base'] = $this->getBase();
237 57
        $imposto['valor'] = $this->getValor();
238 57
        return $imposto;
239
    }
240
241 141
    public function fromArray($imposto = [])
242
    {
243 141
        if ($imposto instanceof Imposto) {
244
            $imposto = $imposto->toArray();
245 141
        } elseif (!is_array($imposto)) {
246
            return $this;
247
        }
248 141
        if (isset($imposto['tipo'])) {
249
            $this->setTipo($imposto['tipo']);
250
        } else {
251 141
            $this->setTipo(null);
252
        }
253 141
        if (isset($imposto['grupo'])) {
254 50
            $this->setGrupo($imposto['grupo']);
255
        } else {
256 141
            $this->setGrupo(null);
257
        }
258 141
        if (isset($imposto['tributacao'])) {
259 48
            $this->setTributacao($imposto['tributacao']);
260
        } else {
261 141
            $this->setTributacao(null);
262
        }
263 141
        if (isset($imposto['aliquota'])) {
264 40
            $this->setAliquota($imposto['aliquota']);
265
        } else {
266 141
            $this->setAliquota(null);
267
        }
268 141
        if (isset($imposto['base'])) {
269 49
            $this->setBase($imposto['base']);
270
        } else {
271 141
            $this->setBase(null);
272
        }
273 141
        return $this;
274
    }
275
276 59
    public static function criaPeloNome($nome, $quantitativo = false)
277
    {
278 59
        switch ($nome) {
279
            /* Grupo COFINS */
280 59
            case 'COFINSAliq':
281 27
                $imposto = new Imposto\COFINS\Aliquota();
282 27
                break;
283 59
            case 'COFINSOutr':
284 1
                $imposto = new Imposto\COFINS\Generico();
285 1
                break;
286 58
            case 'COFINSNT':
287 1
                $imposto = new Imposto\COFINS\Isento();
288 1
                break;
289 57
            case 'COFINSQtde':
290 1
                $imposto = new Imposto\COFINS\Quantidade();
291 1
                break;
292
            /* Grupo COFINSST */
293 56
            case 'COFINSST':
294 2
                if ($quantitativo) {
295 1
                    $imposto = new Imposto\COFINS\ST\Quantidade();
296
                } else {
297 1
                    $imposto = new Imposto\COFINS\ST\Aliquota();
298
                }
299 2
                break;
300
            /* Grupo ICMS */
301 54
            case 'ICMS60':
302 27
                $imposto = new Imposto\ICMS\Cobrado();
303 27
                break;
304 54
            case 'ICMS10':
305 1
                $imposto = new Imposto\ICMS\Cobranca();
306 1
                break;
307 53
            case 'ICMS51':
308 1
                $imposto = new Imposto\ICMS\Diferido();
309 1
                break;
310 52
            case 'ICMS90':
311 1
                $imposto = new Imposto\ICMS\Generico();
312 1
                break;
313 51
            case 'ICMS00':
314 1
                $imposto = new Imposto\ICMS\Integral();
315 1
                break;
316 50
            case 'ICMS40':
317 1
                $imposto = new Imposto\ICMS\Isento();
318 1
                break;
319 49
            case 'ICMS70':
320 1
                $imposto = new Imposto\ICMS\Mista();
321 1
                break;
322 48
            case 'ICMS30':
323 1
                $imposto = new Imposto\ICMS\Parcial();
324 1
                break;
325 47
            case 'ICMSPart':
326 1
                $imposto = new Imposto\ICMS\Partilha();
327 1
                break;
328 46
            case 'ICMS20':
329 1
                $imposto = new Imposto\ICMS\Reducao();
330 1
                break;
331 45
            case 'ICMSST':
332 1
                $imposto = new Imposto\ICMS\Substituto();
333 1
                break;
334
            /* Grupo ICMS Simples */
335 44
            case 'ICMSSN500':
336 2
                $imposto = new Imposto\ICMS\Simples\Cobrado();
337 2
                break;
338 42
            case 'ICMSSN201':
339 1
                $imposto = new Imposto\ICMS\Simples\Cobranca();
340 1
                break;
341 41
            case 'ICMSSN900':
342 1
                $imposto = new Imposto\ICMS\Simples\Generico();
343 1
                break;
344 40
            case 'ICMSSN102':
345 1
                $imposto = new Imposto\ICMS\Simples\Isento();
346 1
                break;
347 39
            case 'ICMSSN101':
348 1
                $imposto = new Imposto\ICMS\Simples\Normal();
349 1
                break;
350 38
            case 'ICMSSN202':
351 1
                $imposto = new Imposto\ICMS\Simples\Parcial();
352 1
                break;
353
            /* Grupo IPI */
354 37
            case 'IPITrib':
355 2
                if ($quantitativo) {
356 1
                    $imposto = new Imposto\IPI\Quantidade();
357
                } else {
358 1
                    $imposto = new Imposto\IPI\Aliquota();
359
                }
360 2
                break;
361 36
            case 'IPINT':
362 1
                $imposto = new Imposto\IPI\Isento();
363 1
                break;
364
            /* Grupo PIS */
365 35
            case 'PISAliq':
366 27
                $imposto = new Imposto\PIS\Aliquota();
367 27
                break;
368 8
            case 'PISOutr':
369 1
                $imposto = new Imposto\PIS\Generico();
370 1
                break;
371 7
            case 'PISNT':
372 1
                $imposto = new Imposto\PIS\Isento();
373 1
                break;
374 6
            case 'PISQtde':
375 1
                $imposto = new Imposto\PIS\Quantidade();
376 1
                break;
377
            /* Grupo PISST */
378 5
            case 'PISST':
379 2
                if ($quantitativo) {
380 1
                    $imposto = new Imposto\PIS\ST\Quantidade();
381
                } else {
382 1
                    $imposto = new Imposto\PIS\ST\Aliquota();
383
                }
384 2
                break;
385
            /* Grupo II básico */
386 3
            case 'II':
387 1
                $imposto = new Imposto\II();
388 1
                break;
389
            /* Grupo IPI básico */
390 2
            case 'IPI':
391 1
                $imposto = new Imposto\IPI();
392 1
                break;
393
            default:
394 1
                return false;
395
        }
396 58
        return $imposto;
397
    }
398
399 59
    public static function loadImposto($element)
400
    {
401 59
        $quantitativo = false;
402 59
        switch ($element->nodeName) {
403
            /* Grupo COFINSST */
404 59
            case 'COFINSST':
405 2
                $_fields = $element->getElementsByTagName('pCOFINS');
406 2
                $quantitativo = $_fields->length == 0;
407 2
                break;
408
            /* Grupo IPI */
409 57
            case 'IPITrib':
410 2
                $_fields = $element->getElementsByTagName('pIPI');
411 2
                $quantitativo = $_fields->length == 0;
412 2
                break;
413
            /* Grupo PISST */
414 56
            case 'PISST':
415 2
                $_fields = $element->getElementsByTagName('pPIS');
416 2
                $quantitativo = $_fields->length == 0;
417 2
                break;
418
        }
419 59
        $imposto = self::criaPeloNome($element->nodeName, $quantitativo);
420 59
        if ($imposto === false) {
421 1
            return false;
422
        }
423 58
        $imposto->loadNode($element, $element->nodeName);
424 58
        return $imposto;
425
    }
426
}
427