Passed
Push — master ( 22a4bb...4eeb09 )
by Francimar
05:29
created

Produto::getDesconto()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 7
Code Lines 4

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 4
CRAP Score 2

Importance

Changes 0
Metric Value
dl 0
loc 7
ccs 4
cts 4
cp 1
rs 9.4285
c 0
b 0
f 0
cc 2
eloc 4
nc 2
nop 1
crap 2

1 Method

Rating   Name   Duplication   Size   Complexity  
A Produto::setExcecao() 0 5 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\Core\SEFAZ;
31
use NFe\Common\Node;
32
use NFe\Common\Util;
33
34
/**
35
 * Produto ou serviço que está sendo vendido ou prestado e será adicionado
36
 * na nota fiscal
37
 */
38
class Produto extends Total
0 ignored issues
show
Complexity introduced by
This class has 45 public methods and attributes which exceeds the configured maximum of 45.

The number of this metric differs depending on the chosen design (inheritance vs. composition). For inheritance, the number should generally be a bit lower.

A high number indicates a reusable class. It might also make the class harder to change without breaking other classes though.

Loading history...
Complexity introduced by
This class has 16 fields which exceeds the configured maximum of 15.

Too many fields generally indicate a class which does too much and does not follow the single responsibility principle.

We suggest taking a look at the “Code” section for further suggestions on how to fix this.

Loading history...
Complexity introduced by
This class has a complexity of 135 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...
39
{
40
41
    /**
42
     * Unidade do produto, Não informar a grandeza
43
     */
44
    const UNIDADE_UNIDADE = 'unidade';
45
    const UNIDADE_PECA = 'peca';
46
    const UNIDADE_METRO = 'metro';
47
    const UNIDADE_GRAMA = 'grama';
48
    const UNIDADE_LITRO = 'litro';
49
50
    private $item;
51
    private $pedido;
52
    private $codigo;
53
    private $codigo_tributario;
54
    private $codigo_barras;
55
    private $descricao;
56
    private $unidade;
57
    private $multiplicador;
58
    private $quantidade;
59
    private $tributada;
60
    private $peso;
61
    private $excecao;
62
    private $cfop;
63
    private $ncm;
64
    private $cest;
65
    private $impostos;
66
67 8
    public function __construct($produto = array())
68
    {
69 8
        $this->fromArray($produto);
70 8
    }
71
72
    /**
73
     * Número do Item do Pedido de Compra - Identificação do número do item do
74
     * pedido de Compra
75
     */
76 7
    public function getItem($normalize = false)
77
    {
78 7
        if (!$normalize) {
79 6
            return $this->item;
80
        }
81 7
        return $this->item;
82
    }
83
84 8
    public function setItem($item)
85
    {
86 8
        if (trim($item) != '') {
87 7
            $item = intval($item);
88
        }
89 8
        $this->item = $item;
90 8
        return $this;
91
    }
92
93
    /**
94
     * informar o número do pedido de compra, o campo é de livre uso do emissor
95
     */
96 7
    public function getPedido($normalize = false)
97
    {
98 7
        if (!$normalize) {
99 7
            return $this->pedido;
100
        }
101 2
        return $this->pedido;
102
    }
103
104 8
    public function setPedido($pedido)
105
    {
106 8
        $this->pedido = $pedido;
107 8
        return $this;
108
    }
109
110
    /**
111
     * Código do produto ou serviço. Preencher com CFOP caso se trate de itens
112
     * não relacionados com mercadorias/produto e que o contribuinte não possua
113
     * codificação própria
114
     * Formato ”CFOP9999”.
115
     */
116 7
    public function getCodigo($normalize = false)
117
    {
118 7
        if (!$normalize) {
119 3
            return $this->codigo;
120
        }
121 7
        return $this->codigo;
122
    }
123
124 8
    public function setCodigo($codigo)
125
    {
126 8
        $this->codigo = $codigo;
127 8
        return $this;
128
    }
129
130
    /**
131
     * Código do produto ou serviço. Preencher com CFOP caso se trate de itens
132
     * não relacionados com mercadorias/produto e que o contribuinte não possua
133
     * codificação própria
134
     * Formato ”CFOP9999”.
135
     */
136 7
    public function getCodigoTributario($normalize = false)
137
    {
138 7
        if (!$normalize) {
139 3
            return $this->codigo_tributario;
140
        }
141 7
        return $this->codigo_tributario;
142
    }
143
144 8
    public function setCodigoTributario($codigo_tributario)
145
    {
146 8
        $this->codigo_tributario = $codigo_tributario;
147 8
        return $this;
148
    }
149
150
    /**
151
     * GTIN (Global Trade Item Number) do produto, antigo código EAN ou código
152
     * de barras
153
     */
154 7
    public function getCodigoBarras($normalize = false)
155
    {
156 7
        if (!$normalize) {
157 3
            return $this->codigo_barras;
158
        }
159 7
        return $this->codigo_barras;
160
    }
161
162 8
    public function setCodigoBarras($codigo_barras)
163
    {
164 8
        $this->codigo_barras = $codigo_barras;
165 8
        return $this;
166
    }
167
168
    /**
169
     * Descrição do produto ou serviço
170
     */
171 7
    public function getDescricao($normalize = false)
172
    {
173 7
        if (!$normalize) {
174 3
            return $this->descricao;
175
        }
176 7
        return $this->descricao;
177
    }
178
179 8
    public function setDescricao($descricao)
180
    {
181 8
        $this->descricao = $descricao;
182 8
        return $this;
183
    }
184
185
    /**
186
     * Unidade do produto, Não informar a grandeza
187
     */
188 7
    public function getUnidade($normalize = false)
189
    {
190 7
        if (!$normalize) {
191 3
            return $this->unidade;
192
        }
193 7
        switch ($this->unidade) {
194 7
            case self::UNIDADE_UNIDADE:
195 7
                return 'UN';
196
            case self::UNIDADE_PECA:
197
                return 'PC';
198
            case self::UNIDADE_METRO:
199
                return 'm';
200
            case self::UNIDADE_GRAMA:
201
                return 'g';
202
            case self::UNIDADE_LITRO:
203
                return 'L';
204
        }
205
        return $this->unidade;
206
    }
207
208 8
    public function setUnidade($unidade)
209
    {
210
        switch ($unidade) {
211 8
            case 'UN':
212 4
                $unidade = self::UNIDADE_UNIDADE;
213 4
                break;
214 8
            case 'PC':
215
                $unidade = self::UNIDADE_PECA;
216
                break;
217 8
            case 'm':
218
                $unidade = self::UNIDADE_METRO;
219
                break;
220 8
            case 'g':
221
                $unidade = self::UNIDADE_GRAMA;
222
                break;
223 8
            case 'L':
224
                $unidade = self::UNIDADE_LITRO;
225
                break;
226
        }
227 8
        $this->unidade = $unidade;
228 8
        return $this;
229
    }
230
231 7
    public function getMultiplicador($normalize = false)
232
    {
233 7
        if (!$normalize) {
234 6
            return $this->multiplicador;
235
        }
236 7
        return $this->multiplicador;
237
    }
238
239 8
    public function setMultiplicador($multiplicador)
240
    {
241 8
        if (trim($multiplicador) != '') {
242 8
            $multiplicador = intval($multiplicador);
243
        }
244 8
        $this->multiplicador = $multiplicador;
245 8
        return $this;
246
    }
247
248
    /**
249
     * Valor unitário de comercialização  - alterado para aceitar 0 a 10 casas
250
     * decimais e 11 inteiros
251
     */
252 7
    public function getPreco($normalize = false)
253
    {
254 7
        return parent::getProdutos($normalize);
0 ignored issues
show
Comprehensibility Bug introduced by
It seems like you call parent on a different method (getProdutos() instead of getPreco()). Are you sure this is correct? If so, you might want to change this to $this->getProdutos().

This check looks for a call to a parent method whose name is different than the method from which it is called.

Consider the following code:

class Daddy
{
    protected function getFirstName()
    {
        return "Eidur";
    }

    protected function getSurName()
    {
        return "Gudjohnsen";
    }
}

class Son
{
    public function getFirstName()
    {
        return parent::getSurname();
    }
}

The getFirstName() method in the Son calls the wrong method in the parent class.

Loading history...
255
    }
256
257
    /**
258
     * Altera o preço total do produto para o informado no parâmetro
259
     * @param mixed $preco novo preço para o Produto
260
     * @return Produto A própria instância da classe
261
     */
262 8
    public function setPreco($preco)
263
    {
264 8
        return parent::setProdutos($preco);
0 ignored issues
show
Comprehensibility Bug introduced by
It seems like you call parent on a different method (setProdutos() instead of setPreco()). Are you sure this is correct? If so, you might want to change this to $this->setProdutos().

This check looks for a call to a parent method whose name is different than the method from which it is called.

Consider the following code:

class Daddy
{
    protected function getFirstName()
    {
        return "Eidur";
    }

    protected function getSurName()
    {
        return "Gudjohnsen";
    }
}

class Son
{
    public function getFirstName()
    {
        return parent::getSurname();
    }
}

The getFirstName() method in the Son calls the wrong method in the parent class.

Loading history...
265
    }
266
267
    /**
268
     * Quantidade Comercial  do produto, alterado para aceitar de 0 a 4 casas
269
     * decimais e 11 inteiros.
270
     */
271 7
    public function getQuantidade($normalize = false)
272
    {
273 7
        if (!$normalize) {
274 7
            return $this->quantidade;
275
        }
276 7
        return Util::toFloat($this->quantidade);
277
    }
278
279 8
    public function setQuantidade($quantidade)
280
    {
281 8
        if (trim($quantidade) != '') {
282 7
            $quantidade = floatval($quantidade);
283
        }
284 8
        $this->quantidade = $quantidade;
285 8
        return $this;
286
    }
287
288
    /**
289
     * Informa a quantidade tributada
290
     */
291 7
    public function getTributada($normalize = false)
292
    {
293 7
        if (!$normalize) {
294 7
            return is_null($this->tributada)?$this->getQuantidade():$this->tributada;
295
        }
296 7
        return Util::toFloat($this->getTributada());
297
    }
298
299 8
    public function setTributada($tributada)
300
    {
301 8
        if (trim($tributada) != '') {
302 7
            $tributada = floatval($tributada);
303
        }
304 8
        $this->tributada = $tributada;
305 8
        return $this;
306
    }
307
308 3
    public function getPeso()
309
    {
310 3
        return $this->peso;
311
    }
312
313 8
    public function setPeso($peso)
314
    {
315 8
        $this->peso = $peso;
316 8
        return $this;
317
    }
318
319
    /**
320
     * Código EX TIPI
321
     */
322 7
    public function getExcecao($normalize = false)
323
    {
324 7
        if (!$normalize) {
325 7
            return $this->excecao;
326
        }
327
        return Util::padDigit($this->excecao, 2);
328
    }
329
330 8
    public function setExcecao($excecao)
331
    {
332 8
        $this->excecao = $excecao;
333 8
        return $this;
334
    }
335
336 7
    public function getCFOP($normalize = false)
337
    {
338 7
        if (!$normalize) {
339 3
            return $this->cfop;
340
        }
341 7
        return $this->cfop;
342
    }
343
344 8
    public function setCFOP($cfop)
345
    {
346 8
        if (trim($cfop) != '') {
347 7
            $cfop = intval($cfop);
348
        }
349 8
        $this->cfop = $cfop;
350 8
        return $this;
351
    }
352
353
    /**
354
     * Código NCM (8 posições), será permitida a informação do gênero (posição
355
     * do capítulo do NCM) quando a operação não for de comércio exterior
356
     * (importação/exportação) ou o produto não seja tributado pelo IPI. Em
357
     * caso de item de serviço ou item que não tenham produto (Ex.
358
     * transferência de crédito, crédito do ativo imobilizado, etc.), informar
359
     * o código 00 (zeros) (v2.0)
360
     */
361 7
    public function getNCM($normalize = false)
362
    {
363 7
        if (!$normalize) {
364 7
            return $this->ncm;
365
        }
366 7
        return $this->ncm;
367
    }
368
369 8
    public function setNCM($ncm)
370
    {
371 8
        $this->ncm = $ncm;
372 8
        return $this;
373
    }
374
375 7
    public function getCEST($normalize = false)
376
    {
377 7
        if (!$normalize) {
378 7
            return $this->cest;
379
        }
380 7
        return $this->cest;
381
    }
382
383 8
    public function setCEST($cest)
384
    {
385 8
        $this->cest = $cest;
386 8
        return $this;
387
    }
388
389 7
    public function getImpostos()
390
    {
391 7
        return $this->impostos;
392
    }
393
394 8
    public function setImpostos($impostos)
395
    {
396 8
        $this->impostos = $impostos;
397 8
        return $this;
398
    }
399
400 3
    public function addImposto($imposto)
401
    {
402 3
        $this->impostos[] = $imposto;
403 3
        return $this;
404
    }
405
406
    /**
407
     * Valor unitário
408
     */
409 7
    public function getPrecoUnitario($normalize = false)
410
    {
411 7
        if (!$normalize) {
412 7
            return $this->getPreco() / $this->getQuantidade();
413
        }
414 7
        return Util::toCurrency($this->getPrecoUnitario(), 10);
415
    }
416
417
    /**
418
     * Valor tributável
419
     */
420 7
    public function getPrecoTributavel($normalize = false)
421
    {
422 7
        if (!$normalize) {
423 7
            return $this->getPreco() / $this->getTributada();
424
        }
425 7
        return Util::toCurrency($this->getPrecoTributavel(), 10);
426
    }
427
428 7
    public function getBase($normalize = false)
429
    {
430 7
        if (!$normalize) {
431 7
            return $this->getPreco() - $this->getDesconto();
432
        }
433
        return Util::toCurrency($this->getBase());
434
    }
435
436 7
    public function getImpostoInfo()
437
    {
438 7
        $config = SEFAZ::getInstance()->getConfiguracao();
439 7
        $db = $config->getBanco();
0 ignored issues
show
Comprehensibility introduced by
Avoid variables with short names like $db. Configured minimum length is 3.

Short variable names may make your code harder to understand. Variable names should be self-descriptive. This check looks for variable names who are shorter than a configured minimum.

Loading history...
440 7
        $endereco = $config->getEmitente()->getEndereco();
441 7
        $info = array('total' => 0.00);
442
        $tipos = array(
443
            // Imposto::TIPO_IMPORTADO, // TODO: determinar quando usar
444 7
            Imposto::TIPO_NACIONAL,
445 7
            Imposto::TIPO_ESTADUAL,
446 7
            Imposto::TIPO_MUNICIPAL
447
        );
448 7
        $imposto = new \NFe\Entity\Imposto\Total();
449 7
        $imposto->setBase($this->getBase());
450 7
        $aliquota = $db->getImpostoAliquota(
451 7
            $this->getNCM(),
452 7
            $endereco->getMunicipio()->getEstado()->getUF(),
453 7
            $this->getExcecao(),
454 7
            $config->getEmitente()->getCNPJ(),
455 7
            $config->getTokenIBPT()
456
        );
457 7
        if ($aliquota === false) {
458
            throw new \Exception('Não foi possível obter o tributo aproximado do produto "'.
459
                $this->getDescricao().'" e item '.$this->getItem(), 404);
460
        }
461 7
        foreach ($tipos as $tipo) {
462 7
            $imposto->setAliquota($aliquota[$tipo]);
463 7
            $tributo = round($imposto->getTotal(), 2);
464 7
            $info[$tipo] = $tributo;
465 7
            $info['total'] += $tributo;
466
        }
467 7
        $info['info'] = $aliquota['info'];
468 7
        return $info;
469
    }
470
471 3
    public function toArray($recursive = false)
472
    {
473 3
        $produto = parent::toArray($recursive);
474 3
        unset($produto['produtos']);
475 3
        $produto['item'] = $this->getItem();
476 3
        $produto['pedido'] = $this->getPedido();
477 3
        $produto['codigo'] = $this->getCodigo();
478 3
        $produto['codigo_tributario'] = $this->getCodigoTributario();
479 3
        $produto['codigo_barras'] = $this->getCodigoBarras();
480 3
        $produto['descricao'] = $this->getDescricao();
481 3
        $produto['unidade'] = $this->getUnidade();
482 3
        $produto['multiplicador'] = $this->getMultiplicador();
483 3
        $produto['preco'] = $this->getPreco();
484 3
        $produto['quantidade'] = $this->getQuantidade();
485 3
        $produto['tributada'] = $this->getTributada();
486 3
        if (!is_null($this->getPeso()) && $recursive) {
487
            $produto['peso'] = $this->getPeso()->toArray($recursive);
488
        } else {
489 3
            $produto['peso'] = $this->getPeso();
490
        }
491 3
        $produto['excecao'] = $this->getExcecao();
492 3
        $produto['cfop'] = $this->getCFOP();
493 3
        $produto['ncm'] = $this->getNCM();
494 3
        $produto['cest'] = $this->getCEST();
495 3
        if ($recursive) {
496
            $impostos = array();
497
            $_impostos = $this->getImpostos();
498
            foreach ($_impostos as $_imposto) {
499
                $impostos[] = $_imposto->toArray($recursive);
500
            }
501
            $produto['impostos'] = $impostos;
502
        } else {
503 3
            $produto['impostos'] = $this->getImpostos();
504
        }
505 3
        return $produto;
506
    }
507
508 8
    public function fromArray($produto = array())
0 ignored issues
show
Complexity introduced by
This operation has 1990656 execution paths which exceeds the configured maximum of 200.

A high number of execution paths generally suggests many nested conditional statements and make the code less readible. This can usually be fixed by splitting the method into several smaller methods.

You can also find more information in the “Code” section of your repository.

Loading history...
509
    {
510 8
        if ($produto instanceof Produto) {
511 3
            $produto = $produto->toArray();
512 8
        } elseif (!is_array($produto)) {
513 3
            return $this;
514
        }
515 8
        parent::fromArray($produto);
516 8
        if (isset($produto['item'])) {
517 1
            $this->setItem($produto['item']);
518
        } else {
519 8
            $this->setItem(null);
520
        }
521 8
        if (isset($produto['pedido'])) {
522 1
            $this->setPedido($produto['pedido']);
523
        } else {
524 8
            $this->setPedido(null);
525
        }
526 8
        if (isset($produto['codigo'])) {
527 3
            $this->setCodigo($produto['codigo']);
528
        } else {
529 8
            $this->setCodigo(null);
530
        }
531 8
        if (isset($produto['codigo_tributario'])) {
532 1
            $this->setCodigoTributario($produto['codigo_tributario']);
533
        } else {
534 8
            $this->setCodigoTributario(null);
535
        }
536 8
        if (isset($produto['codigo_barras'])) {
537 3
            $this->setCodigoBarras($produto['codigo_barras']);
538
        } else {
539 8
            $this->setCodigoBarras(null);
540
        }
541 8
        if (isset($produto['descricao'])) {
542 3
            $this->setDescricao($produto['descricao']);
543
        } else {
544 8
            $this->setDescricao(null);
545
        }
546 8
        if (!isset($produto['unidade']) || is_null($produto['unidade'])) {
547 8
            $this->setUnidade(self::UNIDADE_UNIDADE);
548
        } else {
549 3
            $this->setUnidade($produto['unidade']);
550
        }
551 8
        if (!isset($produto['multiplicador']) || is_null($produto['multiplicador'])) {
552 8
            $this->setMultiplicador(1);
553
        } else {
554 3
            $this->setMultiplicador($produto['multiplicador']);
555
        }
556 8
        if (isset($produto['preco'])) {
557 3
            $this->setPreco($produto['preco']);
558
        } else {
559 8
            $this->setPreco(null);
560
        }
561 8
        if (isset($produto['quantidade'])) {
562 3
            $this->setQuantidade($produto['quantidade']);
563
        } else {
564 8
            $this->setQuantidade(null);
565
        }
566 8
        if (isset($produto['tributada'])) {
567 3
            $this->setTributada($produto['tributada']);
568
        } else {
569 8
            $this->setTributada(null);
570
        }
571 8
        if (!isset($produto['peso']) || is_null($produto['peso'])) {
572 8
            $this->setPeso(new Peso());
573
        } else {
574 3
            $this->setPeso($produto['peso']);
575
        }
576 8
        if (isset($produto['excecao'])) {
577
            $this->setExcecao($produto['excecao']);
578
        } else {
579 8
            $this->setExcecao(null);
580
        }
581 8
        if (isset($produto['cfop'])) {
582 3
            $this->setCFOP($produto['cfop']);
583
        } else {
584 8
            $this->setCFOP(null);
585
        }
586 8
        if (isset($produto['ncm'])) {
587 3
            $this->setNCM($produto['ncm']);
588
        } else {
589 8
            $this->setNCM(null);
590
        }
591 8
        if (isset($produto['cest'])) {
592 3
            $this->setCEST($produto['cest']);
593
        } else {
594 8
            $this->setCEST(null);
595
        }
596 8
        if (!isset($produto['impostos']) || is_null($produto['impostos'])) {
597 8
            $this->setImpostos(array());
598
        } else {
599 3
            $this->setImpostos($produto['impostos']);
600
        }
601 8
        return $this;
602
    }
603
604 7
    public static function addNodeInformacoes($tributos, $element, $name = null)
605
    {
606 7
        $detalhes = array();
607
        $formatos = array(
608 7
            Imposto::TIPO_IMPORTADO => '%s Importado',
609 7
            Imposto::TIPO_NACIONAL => '%s Federal',
610 7
            Imposto::TIPO_ESTADUAL => '%s Estadual',
611 7
            Imposto::TIPO_MUNICIPAL => '%s Municipal'
612
        );
613 7
        foreach ($formatos as $tipo => $formato) {
614 7
            if (!isset($tributos[$tipo])) {
615 7
                continue;
616
            }
617 7
            if (!Util::isGreater($tributos[$tipo], 0.00)) {
618 7
                continue;
619
            }
620 7
            $detalhes[] = sprintf($formato, Util::toMoney($tributos[$tipo]));
621
        }
622 7
        if (count($detalhes) == 0) {
623
            return null;
624
        }
625 7
        $dom = $element->ownerDocument;
626 7
        $fonte = 'Fonte: '.$tributos['info']['fonte'].' '.$tributos['info']['chave'];
627 7
        $ultimo = '';
628 7
        if (count($detalhes) > 1) {
629 7
            $ultimo = ' e '.array_pop($detalhes);
630
        }
631 7
        $texto = 'Trib. aprox.: '.implode(', ', $detalhes).$ultimo.'. '.$fonte;
632 7
        $info = $dom->createElement(is_null($name)?'infAdProd':$name, $texto);
633 7
        $element->appendChild($info);
634 7
        return $texto;
635
    }
636
637 7
    public function getNode($name = null)
0 ignored issues
show
Complexity introduced by
This operation has 5760 execution paths which exceeds the configured maximum of 200.

A high number of execution paths generally suggests many nested conditional statements and make the code less readible. This can usually be fixed by splitting the method into several smaller methods.

You can also find more information in the “Code” section of your repository.

Loading history...
638
    {
639 7
        $dom = new \DOMDocument('1.0', 'UTF-8');
640 7
        $element = $dom->createElement(is_null($name)?'det':$name);
641 7
        $attr = $dom->createAttribute('nItem');
642 7
        $attr->value = $this->getItem(true);
643 7
        $element->appendChild($attr);
644
645 7
        $produto = $dom->createElement('prod');
646 7
        Util::appendNode($produto, 'cProd', $this->getCodigo(true));
647 7
        Util::appendNode($produto, 'cEAN', $this->getCodigoBarras(true));
648 7
        Util::appendNode($produto, 'xProd', $this->getDescricao(true));
649 7
        Util::appendNode($produto, 'NCM', $this->getNCM(true));
650
//		Util::appendNode($produto, 'NVE', $this->getNVE(true));
651 7
        if (!is_null($this->getCEST())) {
652 7
            Util::appendNode($produto, 'CEST', $this->getCEST(true));
653
        }
654 7
        if (!is_null($this->getExcecao())) {
655
            Util::appendNode($produto, 'EXTIPI', $this->getExcecao(true));
656
        }
657 7
        Util::appendNode($produto, 'CFOP', $this->getCFOP(true));
658 7
        Util::appendNode($produto, 'uCom', $this->getUnidade(true));
659 7
        Util::appendNode($produto, 'qCom', $this->getQuantidade(true));
660 7
        Util::appendNode($produto, 'vUnCom', $this->getPrecoUnitario(true));
661 7
        Util::appendNode($produto, 'vProd', $this->getPreco(true));
662 7
        Util::appendNode($produto, 'cEANTrib', $this->getCodigoTributario(true));
663 7
        Util::appendNode($produto, 'uTrib', $this->getUnidade(true));
664 7
        Util::appendNode($produto, 'qTrib', $this->getTributada(true));
665 7
        Util::appendNode($produto, 'vUnTrib', $this->getPrecoTributavel(true));
666 7
        if (Util::isGreater($this->getFrete(), 0.00)) {
667 2
            Util::appendNode($produto, 'vFrete', $this->getFrete(true));
668
        }
669 7
        if (Util::isGreater($this->getSeguro(), 0.00)) {
670 2
            Util::appendNode($produto, 'vSeg', $this->getSeguro(true));
671
        }
672 7
        if (Util::isGreater($this->getDesconto(), 0.00)) {
673 7
            Util::appendNode($produto, 'vDesc', $this->getDesconto(true));
674
        }
675 7
        if (Util::isGreater($this->getDespesas(), 0.00)) {
676 2
            Util::appendNode($produto, 'vOutro', $this->getDespesas(true));
677
        }
678 7
        Util::appendNode($produto, 'indTot', $this->getMultiplicador(true));
679
//		Util::appendNode($produto, 'DI', $this->getImportacoes(true));
680
//		Util::appendNode($produto, 'detExport', $this->getDetalhes(true));
681 7
        if (!is_null($this->getPedido())) {
682 2
            Util::appendNode($produto, 'xPed', $this->getPedido(true));
683
        }
684 7
        Util::appendNode($produto, 'nItemPed', $this->getItem(true));
685
//		Util::appendNode($produto, 'nFCI', $this->getControle(true));
686 7
        $element->appendChild($produto);
687
688 7
        $imposto = $dom->createElement('imposto');
689 7
        $grupos = array();
690 7
        $_impostos = $this->getImpostos();
691 7
        foreach ($_impostos as $_imposto) {
692 7
            if (is_null($_imposto->getBase())) {
693 2
                $_imposto->setBase($this->getBase());
694
            }
695 7
            $grupos[$_imposto->getGrupo(true)][] = $_imposto;
696
        }
697 7
        $imposto_info = $this->getImpostoInfo();
698 7
        $this->setTributos($imposto_info['total']);
699 7
        $imp_total = $dom->createElement('vTotTrib', Util::toCurrency($imposto_info['total']));
700 7
        $imposto->appendChild($imp_total);
701 7
        foreach ($grupos as $tag => $_grupo) {
702 7
            $grupo = $dom->createElement($tag);
703 7
            foreach ($_grupo as $_imposto) {
704 7
                $node = $_imposto->getNode();
705 7
                $node = $dom->importNode($node, true);
706 7
                $grupo->appendChild($node);
707
            }
708 7
            $imposto->appendChild($grupo);
709
        }
710 7
        $element->appendChild($imposto);
711
        // TODO: verificar se é obrigatório a informação adicional abaixo
712 7
        $complemento = self::addNodeInformacoes($imposto_info, $element);
713 7
        $this->setComplemento($complemento);
714 7
        return $element;
715
    }
716
717 4
    public function loadNode($element, $name = null)
0 ignored issues
show
Complexity introduced by
This operation has 480 execution paths which exceeds the configured maximum of 200.

A high number of execution paths generally suggests many nested conditional statements and make the code less readible. This can usually be fixed by splitting the method into several smaller methods.

You can also find more information in the “Code” section of your repository.

Loading history...
718
    {
719 4
        $name = is_null($name)?'det':$name;
720 4
        if ($element->tagName != $name) {
721
            $_fields = $element->getElementsByTagName($name);
722
            if ($_fields->length == 0) {
723
                throw new \Exception('Tag "'.$name.'" do Produto não encontrada', 404);
724
            }
725
            $element = $_fields->item(0);
726
        }
727 4
        $root = $element;
728 4
        $element = parent::loadNode($element, $name);
729 4
        $this->setItem(Util::loadNode($element, 'nItemPed'));
730 4
        $this->setPedido(Util::loadNode($element, 'xPed'));
731 4
        $this->setCodigo(
732 4
            Util::loadNode(
733
                $element,
734 4
                'cProd',
735 4
                'Tag "cProd" do campo "Codigo" não encontrada no Produto'
736
            )
737
        );
738 4
        $this->setCodigoTributario(
739 4
            Util::loadNode(
740
                $element,
741 4
                'cEANTrib',
742 4
                'Tag "cEANTrib" do campo "CodigoTributario" não encontrada no Produto'
743
            )
744
        );
745 4
        $this->setCodigoBarras(
746 4
            Util::loadNode(
747
                $element,
748 4
                'cEAN',
749 4
                'Tag "cEAN" do campo "CodigoBarras" não encontrada no Produto'
750
            )
751
        );
752 4
        $this->setDescricao(
753 4
            Util::loadNode(
754
                $element,
755 4
                'xProd',
756 4
                'Tag "xProd" do campo "Descricao" não encontrada no Produto'
757
            )
758
        );
759 4
        $this->setUnidade(
760 4
            Util::loadNode(
761
                $element,
762 4
                'uCom',
763 4
                'Tag "uCom" do campo "Unidade" não encontrada no Produto'
764
            )
765
        );
766 4
        $this->setMultiplicador(
767 4
            Util::loadNode(
768
                $element,
769 4
                'indTot',
770 4
                'Tag "indTot" do campo "Multiplicador" não encontrada no Produto'
771
            )
772
        );
773 4
        $this->setQuantidade(
774 4
            Util::loadNode(
775
                $element,
776 4
                'qCom',
777 4
                'Tag "qCom" do campo "Quantidade" não encontrada no Produto'
778
            )
779
        );
780 4
        $this->setTributada(
781 4
            Util::loadNode(
782
                $element,
783 4
                'qTrib',
784 4
                'Tag "qTrib" do campo "Tributada" não encontrada no Produto'
785
            )
786
        );
787 4
        $this->setExcecao(Util::loadNode($element, 'EXTIPI'));
788 4
        $this->setCFOP(
789 4
            Util::loadNode(
790
                $element,
791 4
                'CFOP',
792 4
                'Tag "CFOP" do campo "CFOP" não encontrada no Produto'
793
            )
794
        );
795 4
        $this->setNCM(
796 4
            Util::loadNode(
797
                $element,
798 4
                'NCM',
799 4
                'Tag "NCM" do campo "NCM" não encontrada no Produto'
800
            )
801
        );
802 4
        $this->setCEST(Util::loadNode($element, 'CEST'));
803 4
        $impostos = array();
804 4
        $_fields = $root->getElementsByTagName('imposto');
805 4
        if ($_fields->length == 0) {
806
            throw new \Exception('Tag "imposto" da lista de "Impostos" não encontrada no Produto', 404);
807
        }
808 4
        $imposto_node = $_fields->item(0);
809 4
        $this->setTributos(Util::loadNode($imposto_node, 'vTotTrib'));
810 4
        $_items = $imposto_node->childNodes;
811 4
        $total = new \NFe\Entity\Imposto\Total();
812 4
        foreach ($_items as $_item) {
813 4
            if (!$_item->hasChildNodes() || $_item->nodeType !== XML_ELEMENT_NODE) {
814 1
                continue;
815
            }
816 4
            $total->setGrupo($_item->tagName);
817 4
            foreach ($_item->childNodes as $_subitem) {
818 4
                if ($_subitem->nodeType !== XML_ELEMENT_NODE) {
819 4
                    continue;
820
                }
821 4
                $imposto = Imposto::loadImposto($_subitem, $total->getGrupo());
822 4
                if ($imposto === false) {
823
                    continue;
824
                }
825 4
                $imposto->setGrupo($total->getGrupo());
826 4
                $impostos[] = $imposto;
827
            }
828
        }
829 4
        $this->setImpostos($impostos);
830 4
        $this->setComplemento(Util::loadNode($root, 'infAdProd'));
831 4
        return $element;
832
    }
833
}
834