Complex classes like Nota often do a lot of different things. To break such a class down, we need to identify a cohesive component within that class. A common approach to find such a component is to look for fields/methods that share the same prefixes, or suffixes. You can also have a look at the cohesion graph to spot any un-connected, or weakly-connected components.
Once you have determined the fields that belong together, you can apply the Extract Class refactoring. If the component makes sense as a sub-class, Extract Subclass is also a candidate, and is often faster.
While breaking up the class, it is a good idea to analyze how other classes use Nota, and based on these observations, apply Extract Interface, too.
1 | <?php |
||
47 | abstract class Nota implements Node |
||
48 | { |
||
49 | |||
50 | /** |
||
51 | * Versão da nota fiscal |
||
52 | */ |
||
53 | const VERSAO = '4.00'; |
||
54 | |||
55 | /** |
||
56 | * Versão do aplicativo gerador da nota |
||
57 | */ |
||
58 | const APP_VERSAO = '1.0'; |
||
59 | |||
60 | /** |
||
61 | * Portal da nota fiscal |
||
62 | */ |
||
63 | const PORTAL = 'http://www.portalfiscal.inf.br/nfe'; |
||
64 | |||
65 | /** |
||
66 | * Código do modelo do Documento Fiscal. 55 = NF-e; 65 = NFC-e. |
||
67 | */ |
||
68 | const MODELO_NFE = 'nfe'; |
||
69 | const MODELO_NFCE = 'nfce'; |
||
70 | |||
71 | /** |
||
72 | * Tipo do Documento Fiscal (0 - entrada; 1 - saída) |
||
73 | */ |
||
74 | const TIPO_ENTRADA = 'entrada'; |
||
75 | const TIPO_SAIDA = 'saida'; |
||
76 | |||
77 | /** |
||
78 | * Identificador de Local de destino da operação |
||
79 | * (1-Interna;2-Interestadual;3-Exterior) |
||
80 | */ |
||
81 | const DESTINO_INTERNA = 'interna'; |
||
82 | const DESTINO_INTERESTADUAL = 'interestadual'; |
||
83 | const DESTINO_EXTERIOR = 'exterior'; |
||
84 | |||
85 | /** |
||
86 | * Formato de impressão do DANFE (0-sem DANFE;1-DANFe Retrato; 2-DANFe |
||
87 | * Paisagem;3-DANFe Simplificado;4-DANFe NFC-e;5-DANFe NFC-e em mensagem |
||
88 | * eletrônica) |
||
89 | */ |
||
90 | const FORMATO_NENHUMA = 'nenhuma'; |
||
91 | const FORMATO_RETRATO = 'retrato'; |
||
92 | const FORMATO_PAISAGEM = 'paisagem'; |
||
93 | const FORMATO_SIMPLIFICADO = 'simplificado'; |
||
94 | const FORMATO_CONSUMIDOR = 'consumidor'; |
||
95 | const FORMATO_MENSAGEM = 'mensagem'; |
||
96 | |||
97 | /** |
||
98 | * Forma de emissão da NF-e |
||
99 | */ |
||
100 | const EMISSAO_NORMAL = 'normal'; |
||
101 | const EMISSAO_CONTINGENCIA = 'contingencia'; |
||
102 | |||
103 | /** |
||
104 | * Identificação do Ambiente: 1 - Produção, 2 - Homologação |
||
105 | */ |
||
106 | const AMBIENTE_PRODUCAO = 'producao'; |
||
107 | const AMBIENTE_HOMOLOGACAO = 'homologacao'; |
||
108 | |||
109 | /** |
||
110 | * Finalidade da emissão da NF-e: 1 - NFe normal, 2 - NFe complementar, 3 - |
||
111 | * NFe de ajuste, 4 - Devolução/Retorno |
||
112 | */ |
||
113 | const FINALIDADE_NORMAL = 'normal'; |
||
114 | const FINALIDADE_COMPLEMENTAR = 'complementar'; |
||
115 | const FINALIDADE_AJUSTE = 'ajuste'; |
||
116 | const FINALIDADE_RETORNO = 'retorno'; |
||
117 | |||
118 | /** |
||
119 | * Indicador de presença do comprador no estabelecimento comercial no |
||
120 | * momento da operação (0-Não se aplica ex.: Nota Fiscal complementar ou de |
||
121 | * ajuste;1-Operação presencial;2-Não presencial, internet;3-Não |
||
122 | * presencial, teleatendimento;4-NFC-e entrega em domicílio;5-Operação |
||
123 | * presencial, fora do estabelecimento;9-Não presencial, outros) |
||
124 | */ |
||
125 | const PRESENCA_NENHUM = 'nenhum'; |
||
126 | const PRESENCA_PRESENCIAL = 'presencial'; |
||
127 | const PRESENCA_INTERNET = 'internet'; |
||
128 | const PRESENCA_TELEATENDIMENTO = 'teleatendimento'; |
||
129 | const PRESENCA_ENTREGA = 'entrega'; |
||
130 | const PRESENCA_AMBULANTE = 'ambulante'; |
||
131 | const PRESENCA_OUTROS = 'outros'; |
||
132 | |||
133 | /** |
||
134 | * Chave da nota fiscal |
||
135 | */ |
||
136 | private $id; |
||
137 | /** |
||
138 | * Número do Documento Fiscal |
||
139 | */ |
||
140 | private $numero; |
||
141 | /** |
||
142 | * Emitente da nota fiscal |
||
143 | */ |
||
144 | private $emitente; |
||
145 | /** |
||
146 | * Destinatário que receberá os produtos |
||
147 | */ |
||
148 | private $destinatario; |
||
149 | /** |
||
150 | * Produtos adicionados na nota |
||
151 | */ |
||
152 | private $produtos; |
||
153 | /** |
||
154 | * Informações de trasnporte da mercadoria |
||
155 | */ |
||
156 | private $transporte; |
||
157 | /** |
||
158 | * Pagamentos realizados |
||
159 | */ |
||
160 | private $pagamentos; |
||
161 | /** |
||
162 | * Data e Hora da saída ou de entrada da mercadoria / produto |
||
163 | */ |
||
164 | private $data_movimentacao; |
||
165 | /** |
||
166 | * Informar a data e hora de entrada em contingência |
||
167 | */ |
||
168 | private $data_contingencia; |
||
169 | /** |
||
170 | * Informar a Justificativa da entrada em contingência |
||
171 | */ |
||
172 | private $justificativa; |
||
173 | /** |
||
174 | * Código do modelo do Documento Fiscal. 55 = NF-e; 65 = NFC-e. |
||
175 | */ |
||
176 | private $modelo; |
||
177 | /** |
||
178 | * Tipo do Documento Fiscal (0 - entrada; 1 - saída) |
||
179 | */ |
||
180 | private $tipo; |
||
181 | /** |
||
182 | * Identificador de Local de destino da operação |
||
183 | * (1-Interna;2-Interestadual;3-Exterior) |
||
184 | */ |
||
185 | private $destino; |
||
186 | /** |
||
187 | * Descrição da Natureza da Operação |
||
188 | */ |
||
189 | private $natureza; |
||
190 | /** |
||
191 | * Código numérico que compõe a Chave de Acesso. Número aleatório gerado |
||
192 | * pelo emitente para cada NF-e. |
||
193 | */ |
||
194 | private $codigo; |
||
195 | /** |
||
196 | * Data e Hora de emissão do Documento Fiscal |
||
197 | */ |
||
198 | private $data_emissao; |
||
199 | /** |
||
200 | * Série do Documento Fiscal: série normal 0-889, Avulsa Fisco 890-899, |
||
201 | * SCAN 900-999 |
||
202 | */ |
||
203 | private $serie; |
||
204 | /** |
||
205 | * Formato de impressão do DANFE (0-sem DANFE;1-DANFe Retrato; 2-DANFe |
||
206 | * Paisagem;3-DANFe Simplificado;4-DANFe NFC-e;5-DANFe NFC-e em mensagem |
||
207 | * eletrônica) |
||
208 | */ |
||
209 | private $formato; |
||
210 | /** |
||
211 | * Forma de emissão da NF-e |
||
212 | */ |
||
213 | private $emissao; |
||
214 | /** |
||
215 | * Digito Verificador da Chave de Acesso da NF-e |
||
216 | */ |
||
217 | private $digito_verificador; |
||
218 | /** |
||
219 | * Identificação do Ambiente: 1 - Produção, 2 - Homologação |
||
220 | */ |
||
221 | private $ambiente; |
||
222 | /** |
||
223 | * Finalidade da emissão da NF-e: 1 - NFe normal, 2 - NFe complementar, 3 - |
||
224 | * NFe de ajuste, 4 - Devolução/Retorno |
||
225 | */ |
||
226 | private $finalidade; |
||
227 | /** |
||
228 | * Indica operação com consumidor final (0-Não;1-Consumidor Final) |
||
229 | */ |
||
230 | private $consumidor_final; |
||
231 | /** |
||
232 | * Indicador de presença do comprador no estabelecimento comercial no |
||
233 | * momento da oepração (0-Não se aplica, ex.: Nota Fiscal complementar ou |
||
234 | * de ajuste;1-Operação presencial;2-Não presencial, internet;3-Não |
||
235 | * presencial, teleatendimento;4-NFC-e entrega em domicílio;9-Não |
||
236 | * presencial, outros) |
||
237 | */ |
||
238 | private $presenca; |
||
239 | /** |
||
240 | * Dados dos totais da NF-e |
||
241 | */ |
||
242 | private $total; |
||
243 | /** |
||
244 | * Informações adicionais de interesse do Fisco |
||
245 | */ |
||
246 | private $adicionais; |
||
247 | /** |
||
248 | * Campo de uso livre do contribuinte informar o nome do campo no atributo |
||
249 | * xCampo e o conteúdo do campo no xTexto |
||
250 | */ |
||
251 | private $observacoes; |
||
252 | /** |
||
253 | * Campo de uso exclusivo do Fisco informar o nome do campo no atributo |
||
254 | * xCampo e o conteúdo do campo no xTexto |
||
255 | */ |
||
256 | private $informacoes; |
||
257 | /** |
||
258 | * Protocolo de autorização da nota, informado apenas quando a nota for |
||
259 | * enviada e autorizada |
||
260 | */ |
||
261 | private $protocolo; |
||
262 | |||
263 | /** |
||
264 | * Constroi uma instância de Nota vazia |
||
265 | * @param array $nota Array contendo dados da Nota |
||
266 | */ |
||
267 | 34 | public function __construct($nota = []) |
|
271 | |||
272 | /** |
||
273 | * Chave da nota fiscal |
||
274 | * @param boolean $normalize informa se o id deve estar no formato do XML |
||
275 | * @return mixed id da Nota |
||
276 | */ |
||
277 | 32 | public function getID($normalize = false) |
|
284 | |||
285 | /** |
||
286 | * Altera o valor do ID para o informado no parâmetro |
||
287 | * @param mixed $id novo valor para ID |
||
288 | * @return Nota A própria instância da classe |
||
289 | */ |
||
290 | 34 | public function setID($id) |
|
295 | |||
296 | /** |
||
297 | * Número do Documento Fiscal |
||
298 | * @param boolean $normalize informa se o numero deve estar no formato do XML |
||
299 | * @return mixed numero da Nota |
||
300 | */ |
||
301 | 32 | public function getNumero($normalize = false) |
|
308 | |||
309 | /** |
||
310 | * Altera o valor do Numero para o informado no parâmetro |
||
311 | * @param mixed $numero novo valor para Numero |
||
312 | * @return Nota A própria instância da classe |
||
313 | */ |
||
314 | 34 | public function setNumero($numero) |
|
319 | |||
320 | /** |
||
321 | * Emitente da nota fiscal |
||
322 | * @return mixed emitente da Nota |
||
323 | */ |
||
324 | 32 | public function getEmitente() |
|
328 | |||
329 | /** |
||
330 | * Altera o valor do Emitente para o informado no parâmetro |
||
331 | * @param mixed $emitente novo valor para Emitente |
||
332 | * @return Nota A própria instância da classe |
||
333 | */ |
||
334 | 34 | public function setEmitente($emitente) |
|
339 | |||
340 | /** |
||
341 | * Destinatário que receberá os produtos |
||
342 | * @return mixed destinatario da Nota |
||
343 | */ |
||
344 | 32 | public function getDestinatario() |
|
348 | |||
349 | /** |
||
350 | * Altera o valor do Destinatario para o informado no parâmetro |
||
351 | * @param mixed $destinatario novo valor para Destinatario |
||
352 | * @return Nota A própria instância da classe |
||
353 | */ |
||
354 | 34 | public function setDestinatario($destinatario) |
|
359 | |||
360 | /** |
||
361 | * Produtos adicionados na nota |
||
362 | * @return \NFe\Entity\Produto[] produtos da Nota |
||
363 | */ |
||
364 | 32 | public function getProdutos() |
|
368 | |||
369 | /** |
||
370 | * Altera o valor do Produtos para o informado no parâmetro |
||
371 | * @param mixed $produtos novo valor para Produtos |
||
372 | * @return Nota A própria instância da classe |
||
373 | */ |
||
374 | 34 | public function setProdutos($produtos) |
|
379 | |||
380 | /** |
||
381 | * Adiciona um(a) Produto para a lista de produto |
||
382 | * @param Produto $produto Instância do Produto que será adicionada |
||
383 | * @return Nota A própria instância da classe |
||
384 | */ |
||
385 | 6 | public function addProduto($produto) |
|
390 | |||
391 | /** |
||
392 | * Informações de trasnporte da mercadoria |
||
393 | * @return mixed transporte da Nota |
||
394 | */ |
||
395 | 32 | public function getTransporte() |
|
399 | |||
400 | /** |
||
401 | * Altera o valor da Transporte para o informado no parâmetro |
||
402 | * @param mixed $transporte novo valor para Transporte |
||
403 | * @return Nota A própria instância da classe |
||
404 | */ |
||
405 | 34 | public function setTransporte($transporte) |
|
410 | |||
411 | /** |
||
412 | * Pagamentos realizados |
||
413 | * @return mixed pagamentos da Nota |
||
414 | */ |
||
415 | 32 | public function getPagamentos() |
|
419 | |||
420 | /** |
||
421 | * Altera o valor do Pagamentos para o informado no parâmetro |
||
422 | * @param mixed $pagamentos novo valor para Pagamentos |
||
423 | * @return Nota A própria instância da classe |
||
424 | */ |
||
425 | 34 | public function setPagamentos($pagamentos) |
|
430 | |||
431 | /** |
||
432 | * Adiciona um(a) Pagamento para a lista de pagamento |
||
433 | * @param Pagamento $pagamento Instância do Pagamento que será adicionada |
||
434 | * @return Nota A própria instância da classe |
||
435 | */ |
||
436 | 5 | public function addPagamento($pagamento) |
|
441 | |||
442 | /** |
||
443 | * Data e Hora da saída ou de entrada da mercadoria / produto |
||
444 | * @param boolean $normalize informa se a data_movimentacao deve estar no formato do XML |
||
445 | * @return mixed data_movimentacao da Nota |
||
446 | */ |
||
447 | 32 | public function getDataMovimentacao($normalize = false) |
|
454 | |||
455 | /** |
||
456 | * Altera o valor da DataMovimentacao para o informado no parâmetro |
||
457 | * @param mixed $data_movimentacao novo valor para DataMovimentacao |
||
458 | * @return Nota A própria instância da classe |
||
459 | */ |
||
460 | 34 | public function setDataMovimentacao($data_movimentacao) |
|
468 | |||
469 | /** |
||
470 | * Informar a data e hora de entrada em contingência |
||
471 | * @param boolean $normalize informa se a data_contingencia deve estar no formato do XML |
||
472 | * @return mixed data_contingencia da Nota |
||
473 | */ |
||
474 | 7 | public function getDataContingencia($normalize = false) |
|
475 | { |
||
476 | 7 | if (!$normalize || is_null($this->data_contingencia)) { |
|
477 | 7 | return $this->data_contingencia; |
|
478 | } |
||
479 | 1 | return Util::toDateTime($this->data_contingencia); |
|
480 | } |
||
481 | |||
482 | /** |
||
483 | * Altera o valor da DataContingencia para o informado no parâmetro |
||
484 | * @param mixed $data_contingencia novo valor para DataContingencia |
||
485 | * @return Nota A própria instância da classe |
||
486 | */ |
||
487 | 34 | public function setDataContingencia($data_contingencia) |
|
495 | |||
496 | /** |
||
497 | * Informar a Justificativa da entrada em contingência |
||
498 | * @param boolean $normalize informa se a justificativa deve estar no formato do XML |
||
499 | * @return mixed justificativa da Nota |
||
500 | */ |
||
501 | 9 | public function getJustificativa($normalize = false) |
|
502 | { |
||
503 | 9 | if (!$normalize) { |
|
504 | 9 | return $this->justificativa; |
|
505 | } |
||
506 | 1 | return $this->justificativa; |
|
507 | } |
||
508 | |||
509 | /** |
||
510 | * Altera o valor da Justificativa para o informado no parâmetro |
||
511 | * @param mixed $justificativa novo valor para Justificativa |
||
512 | * @return Nota A própria instância da classe |
||
513 | */ |
||
514 | 34 | public function setJustificativa($justificativa) |
|
519 | |||
520 | /** |
||
521 | * Código do modelo do Documento Fiscal. 55 = NF-e; 65 = NFC-e. |
||
522 | * @param boolean $normalize informa se o modelo deve estar no formato do XML |
||
523 | * @return mixed modelo da Nota |
||
524 | */ |
||
525 | 32 | public function getModelo($normalize = false) |
|
538 | |||
539 | /** |
||
540 | * Altera o valor do Modelo para o informado no parâmetro |
||
541 | * @param mixed $modelo novo valor para Modelo |
||
542 | * @return Nota A própria instância da classe |
||
543 | */ |
||
544 | 34 | public function setModelo($modelo) |
|
557 | |||
558 | /** |
||
559 | * Tipo do Documento Fiscal (0 - entrada; 1 - saída) |
||
560 | * @param boolean $normalize informa se o tipo deve estar no formato do XML |
||
561 | * @return mixed tipo da Nota |
||
562 | */ |
||
563 | 32 | public function getTipo($normalize = false) |
|
576 | |||
577 | /** |
||
578 | * Altera o valor do Tipo para o informado no parâmetro |
||
579 | * @param mixed $tipo novo valor para Tipo |
||
580 | * @return Nota A própria instância da classe |
||
581 | */ |
||
582 | 34 | public function setTipo($tipo) |
|
595 | |||
596 | /** |
||
597 | * Identificador de Local de destino da operação |
||
598 | * (1-Interna;2-Interestadual;3-Exterior) |
||
599 | * @param boolean $normalize informa se o destino deve estar no formato do XML |
||
600 | * @return mixed destino da Nota |
||
601 | */ |
||
602 | 32 | public function getDestino($normalize = false) |
|
617 | |||
618 | /** |
||
619 | * Altera o valor do Destino para o informado no parâmetro |
||
620 | * @param mixed $destino novo valor para Destino |
||
621 | * @return Nota A própria instância da classe |
||
622 | */ |
||
623 | 34 | public function setDestino($destino) |
|
639 | |||
640 | /** |
||
641 | * Descrição da Natureza da Operação |
||
642 | * @param boolean $normalize informa se a natureza deve estar no formato do XML |
||
643 | * @return mixed natureza da Nota |
||
644 | */ |
||
645 | 32 | public function getNatureza($normalize = false) |
|
652 | |||
653 | /** |
||
654 | * Altera o valor da Natureza para o informado no parâmetro |
||
655 | * @param mixed $natureza novo valor para Natureza |
||
656 | * @return Nota A própria instância da classe |
||
657 | */ |
||
658 | 34 | public function setNatureza($natureza) |
|
663 | |||
664 | /** |
||
665 | * Código numérico que compõe a Chave de Acesso. Número aleatório gerado |
||
666 | * pelo emitente para cada NF-e. |
||
667 | * @param boolean $normalize informa se o codigo deve estar no formato do XML |
||
668 | * @return mixed codigo da Nota |
||
669 | */ |
||
670 | 32 | public function getCodigo($normalize = false) |
|
677 | |||
678 | /** |
||
679 | * Altera o valor do Codigo para o informado no parâmetro |
||
680 | * @param mixed $codigo novo valor para Codigo |
||
681 | * @return Nota A própria instância da classe |
||
682 | */ |
||
683 | 34 | public function setCodigo($codigo) |
|
688 | |||
689 | /** |
||
690 | * Data e Hora de emissão do Documento Fiscal |
||
691 | * @param boolean $normalize informa se o data_emissao deve estar no formato do XML |
||
692 | * @return mixed data_emissao da Nota |
||
693 | */ |
||
694 | 32 | public function getDataEmissao($normalize = false) |
|
701 | |||
702 | /** |
||
703 | * Altera o valor do DataEmissao para o informado no parâmetro |
||
704 | * @param mixed $data_emissao novo valor para DataEmissao |
||
705 | * @return Nota A própria instância da classe |
||
706 | */ |
||
707 | 34 | public function setDataEmissao($data_emissao) |
|
715 | |||
716 | /** |
||
717 | * Série do Documento Fiscal: série normal 0-889, Avulsa Fisco 890-899, |
||
718 | * SCAN 900-999 |
||
719 | * @param boolean $normalize informa se o serie deve estar no formato do XML |
||
720 | * @return mixed serie da Nota |
||
721 | */ |
||
722 | 32 | public function getSerie($normalize = false) |
|
729 | |||
730 | /** |
||
731 | * Altera o valor do Serie para o informado no parâmetro |
||
732 | * @param mixed $serie novo valor para Serie |
||
733 | * @return Nota A própria instância da classe |
||
734 | */ |
||
735 | 34 | public function setSerie($serie) |
|
740 | |||
741 | /** |
||
742 | * Formato de impressão do DANFE (0-sem DANFE;1-DANFe Retrato; 2-DANFe |
||
743 | * Paisagem;3-DANFe Simplificado;4-DANFe NFC-e;5-DANFe NFC-e em mensagem |
||
744 | * eletrônica) |
||
745 | * @param boolean $normalize informa se o formato deve estar no formato do XML |
||
746 | * @return mixed formato da Nota |
||
747 | */ |
||
748 | 32 | public function getFormato($normalize = false) |
|
769 | |||
770 | /** |
||
771 | * Altera o valor do Formato para o informado no parâmetro |
||
772 | * @param mixed $formato novo valor para Formato |
||
773 | * @return Nota A própria instância da classe |
||
774 | */ |
||
775 | 34 | public function setFormato($formato) |
|
800 | |||
801 | /** |
||
802 | * Forma de emissão da NF-e |
||
803 | * @param boolean $normalize informa se o emissao deve estar no formato do XML |
||
804 | * @return mixed emissao da Nota |
||
805 | */ |
||
806 | 32 | public function getEmissao($normalize = false) |
|
807 | { |
||
808 | 32 | if (!$normalize) { |
|
809 | 32 | return $this->emissao; |
|
810 | } |
||
811 | 32 | switch ($this->emissao) { |
|
812 | 32 | case self::EMISSAO_NORMAL: |
|
813 | 32 | return '1'; |
|
814 | 1 | case self::EMISSAO_CONTINGENCIA: |
|
815 | 1 | return '9'; |
|
816 | } |
||
817 | return $this->emissao; |
||
818 | } |
||
819 | |||
820 | /** |
||
821 | * Altera o valor do Emissao para o informado no parâmetro |
||
822 | * @param mixed $emissao novo valor para Emissao |
||
823 | * @return Nota A própria instância da classe |
||
824 | */ |
||
825 | 34 | public function setEmissao($emissao) |
|
838 | |||
839 | /** |
||
840 | * Digito Verificador da Chave de Acesso da NF-e |
||
841 | * @param boolean $normalize informa se o digito_verificador deve estar no formato do XML |
||
842 | * @return mixed digito_verificador da Nota |
||
843 | */ |
||
844 | 32 | public function getDigitoVerificador($normalize = false) |
|
851 | |||
852 | /** |
||
853 | * Altera o valor do DigitoVerificador para o informado no parâmetro |
||
854 | * @param mixed $digito_verificador novo valor para DigitoVerificador |
||
855 | * @return Nota A própria instância da classe |
||
856 | */ |
||
857 | 34 | public function setDigitoVerificador($digito_verificador) |
|
862 | |||
863 | /** |
||
864 | * Identificação do Ambiente: 1 - Produção, 2 - Homologação |
||
865 | * @param boolean $normalize informa se o ambiente deve estar no formato do XML |
||
866 | * @return mixed ambiente da Nota |
||
867 | */ |
||
868 | 32 | public function getAmbiente($normalize = false) |
|
881 | |||
882 | /** |
||
883 | * Altera o valor do Ambiente para o informado no parâmetro |
||
884 | * @param mixed $ambiente novo valor para Ambiente |
||
885 | * @return Nota A própria instância da classe |
||
886 | */ |
||
887 | 34 | public function setAmbiente($ambiente) |
|
900 | |||
901 | /** |
||
902 | * Finalidade da emissão da NF-e: 1 - NFe normal, 2 - NFe complementar, 3 - |
||
903 | * NFe de ajuste, 4 - Devolução/Retorno |
||
904 | * @param boolean $normalize informa se a finalidade deve estar no formato do XML |
||
905 | * @return mixed finalidade da Nota |
||
906 | */ |
||
907 | 32 | public function getFinalidade($normalize = false) |
|
924 | |||
925 | /** |
||
926 | * Altera o valor da Finalidade para o informado no parâmetro |
||
927 | * @param mixed $finalidade novo valor para Finalidade |
||
928 | * @return Nota A própria instância da classe |
||
929 | */ |
||
930 | 34 | public function setFinalidade($finalidade) |
|
949 | |||
950 | /** |
||
951 | * Indica operação com consumidor final (0-Não;1-Consumidor Final) |
||
952 | * @param boolean $normalize informa se o consumidor_final deve estar no formato do XML |
||
953 | * @return mixed consumidor_final da Nota |
||
954 | */ |
||
955 | 32 | public function getConsumidorFinal($normalize = false) |
|
968 | |||
969 | /** |
||
970 | * Indica operação com consumidor final (0-Não;1-Consumidor Final) |
||
971 | * @return boolean informa se o ConsumidorFinal está habilitado |
||
972 | */ |
||
973 | public function isConsumidorFinal() |
||
977 | |||
978 | /** |
||
979 | * Altera o valor do ConsumidorFinal para o informado no parâmetro |
||
980 | * @param mixed $consumidor_final novo valor para ConsumidorFinal |
||
981 | * @return Nota A própria instância da classe |
||
982 | */ |
||
983 | 34 | public function setConsumidorFinal($consumidor_final) |
|
991 | |||
992 | /** |
||
993 | * Indicador de presença do comprador no estabelecimento comercial no |
||
994 | * momento da oepração (0-Não se aplica (ex.: Nota Fiscal complementar ou |
||
995 | * de ajuste;1-Operação presencial;2-Não presencial, internet; |
||
996 | * 3-Não presencial, teleatendimento;4-NFC-e entrega em domicílio; |
||
997 | * 5-Operação presencial, fora do estabelecimento;9-Não presencial, outros) |
||
998 | * @param boolean $normalize informa se a presenca deve estar no formato do XML |
||
999 | * @return mixed presenca da Nota |
||
1000 | */ |
||
1001 | 32 | public function getPresenca($normalize = false) |
|
1024 | |||
1025 | /** |
||
1026 | * Altera o valor da Presenca para o informado no parâmetro |
||
1027 | * @param mixed $presenca novo valor para Presenca |
||
1028 | * @return Nota A própria instância da classe |
||
1029 | */ |
||
1030 | 34 | public function setPresenca($presenca) |
|
1058 | |||
1059 | /** |
||
1060 | * Dados dos totais da NF-e |
||
1061 | * @return mixed total da Nota |
||
1062 | */ |
||
1063 | 32 | public function getTotal() |
|
1067 | |||
1068 | /** |
||
1069 | * Altera o valor do Total para o informado no parâmetro |
||
1070 | * @param mixed $total novo valor para Total |
||
1071 | * @return Nota A própria instância da classe |
||
1072 | */ |
||
1073 | 34 | public function setTotal($total) |
|
1078 | |||
1079 | /** |
||
1080 | * Informações adicionais de interesse do Fisco |
||
1081 | * @param boolean $normalize informa se a adicionais deve estar no formato do XML |
||
1082 | * @return mixed adicionais da Nota |
||
1083 | */ |
||
1084 | 32 | public function getAdicionais($normalize = false) |
|
1091 | |||
1092 | /** |
||
1093 | * Altera o valor da Adicionais para o informado no parâmetro |
||
1094 | * @param mixed $adicionais novo valor para Adicionais |
||
1095 | * @return Nota A própria instância da classe |
||
1096 | */ |
||
1097 | 34 | public function setAdicionais($adicionais) |
|
1102 | |||
1103 | /** |
||
1104 | * Campo de uso livre do contribuinte informar o nome do campo no atributo |
||
1105 | * xCampo e o conteúdo do campo no xTexto |
||
1106 | * @return mixed observacoes da Nota |
||
1107 | */ |
||
1108 | 32 | public function getObservacoes() |
|
1112 | |||
1113 | /** |
||
1114 | * Altera o valor da Observacoes para o informado no parâmetro |
||
1115 | * @param mixed $observacoes novo valor para Observacoes |
||
1116 | * @return Nota A própria instância da classe |
||
1117 | */ |
||
1118 | 34 | public function setObservacoes($observacoes) |
|
1123 | |||
1124 | /** |
||
1125 | * Adiciona um(a) Observacao para a lista de observacao |
||
1126 | * @param Observacao $observacao Instância da Observacao que será adicionada |
||
1127 | * @return Nota A própria instância da classe |
||
1128 | */ |
||
1129 | 6 | public function addObservacao($campo, $observacao) |
|
1134 | |||
1135 | /** |
||
1136 | * Campo de uso exclusivo do Fisco informar o nome do campo no atributo |
||
1137 | * xCampo e o conteúdo do campo no xTexto |
||
1138 | * @return mixed informacoes da Nota |
||
1139 | */ |
||
1140 | 32 | public function getInformacoes() |
|
1144 | |||
1145 | /** |
||
1146 | * Altera o valor da Informacoes para o informado no parâmetro |
||
1147 | * @param mixed $informacoes novo valor para Informacoes |
||
1148 | * @return Nota A própria instância da classe |
||
1149 | */ |
||
1150 | 34 | public function setInformacoes($informacoes) |
|
1155 | |||
1156 | /** |
||
1157 | * Adiciona um(a) Informacao para a lista de informacao |
||
1158 | * @param Informacao $informacao Instância da Informacao que será adicionada |
||
1159 | * @return Nota A própria instância da classe |
||
1160 | */ |
||
1161 | 6 | public function addInformacao($campo, $informacao) |
|
1166 | |||
1167 | /** |
||
1168 | * Protocolo de autorização da nota, informado apenas quando a nota for |
||
1169 | * enviada e autorizada |
||
1170 | */ |
||
1171 | 30 | public function getProtocolo() |
|
1175 | |||
1176 | 34 | public function setProtocolo($protocolo) |
|
1181 | |||
1182 | 7 | public function toArray($recursive = false) |
|
1183 | { |
||
1184 | 7 | $nota = []; |
|
1185 | 7 | $nota['id'] = $this->getID(); |
|
1186 | 7 | $nota['numero'] = $this->getNumero(); |
|
1187 | 7 | if (!is_null($this->getEmitente()) && $recursive) { |
|
1188 | 1 | $nota['emitente'] = $this->getEmitente()->toArray($recursive); |
|
1189 | } else { |
||
1190 | 6 | $nota['emitente'] = $this->getEmitente(); |
|
1191 | } |
||
1192 | 7 | if (!is_null($this->getDestinatario()) && $recursive) { |
|
1193 | 1 | $nota['destinatario'] = $this->getDestinatario()->toArray($recursive); |
|
1194 | } else { |
||
1195 | 6 | $nota['destinatario'] = $this->getDestinatario(); |
|
1196 | } |
||
1197 | 7 | if ($recursive) { |
|
1198 | 1 | $produtos = []; |
|
1199 | 1 | $_produtos = $this->getProdutos(); |
|
1200 | 1 | foreach ($_produtos as $_produto) { |
|
1201 | 1 | $produtos[] = $_produto->toArray($recursive); |
|
1202 | } |
||
1203 | 1 | $nota['produtos'] = $produtos; |
|
1204 | } else { |
||
1205 | 6 | $nota['produtos'] = $this->getProdutos(); |
|
1206 | } |
||
1207 | 7 | if (!is_null($this->getTransporte()) && $recursive) { |
|
1208 | 1 | $nota['transporte'] = $this->getTransporte()->toArray($recursive); |
|
1209 | } else { |
||
1210 | 6 | $nota['transporte'] = $this->getTransporte(); |
|
1211 | } |
||
1212 | 7 | if ($recursive) { |
|
1213 | 1 | $pagamentos = []; |
|
1214 | 1 | $_pagamentos = $this->getPagamentos(); |
|
1215 | 1 | foreach ($_pagamentos as $_pagamento) { |
|
1216 | 1 | $pagamentos[] = $_pagamento->toArray($recursive); |
|
1217 | } |
||
1218 | 1 | $nota['pagamentos'] = $pagamentos; |
|
1219 | } else { |
||
1220 | 6 | $nota['pagamentos'] = $this->getPagamentos(); |
|
1221 | } |
||
1222 | 7 | $nota['data_movimentacao'] = $this->getDataMovimentacao($recursive); |
|
1223 | 7 | $nota['data_contingencia'] = $this->getDataContingencia($recursive); |
|
1224 | 7 | $nota['justificativa'] = $this->getJustificativa(); |
|
1225 | 7 | $nota['modelo'] = $this->getModelo(); |
|
1226 | 7 | $nota['tipo'] = $this->getTipo(); |
|
1227 | 7 | $nota['destino'] = $this->getDestino(); |
|
1228 | 7 | $nota['natureza'] = $this->getNatureza(); |
|
1229 | 7 | $nota['codigo'] = $this->getCodigo(); |
|
1230 | 7 | $nota['data_emissao'] = $this->getDataEmissao($recursive); |
|
1231 | 7 | $nota['serie'] = $this->getSerie(); |
|
1232 | 7 | $nota['formato'] = $this->getFormato(); |
|
1233 | 7 | $nota['emissao'] = $this->getEmissao(); |
|
1234 | 7 | $nota['digito_verificador'] = $this->getDigitoVerificador(); |
|
1235 | 7 | $nota['ambiente'] = $this->getAmbiente(); |
|
1236 | 7 | $nota['finalidade'] = $this->getFinalidade(); |
|
1237 | 7 | $nota['consumidor_final'] = $this->getConsumidorFinal(); |
|
1238 | 7 | $nota['presenca'] = $this->getPresenca(); |
|
1239 | 7 | if (!is_null($this->getTotal()) && $recursive) { |
|
1240 | 1 | $nota['total'] = $this->getTotal()->toArray($recursive); |
|
1241 | } else { |
||
1242 | 6 | $nota['total'] = $this->getTotal(); |
|
1243 | } |
||
1244 | 7 | $nota['adicionais'] = $this->getAdicionais(); |
|
1245 | 7 | $nota['observacoes'] = $this->getObservacoes(); |
|
1246 | 7 | $nota['informacoes'] = $this->getInformacoes(); |
|
1247 | 7 | if (!is_null($this->getProtocolo()) && $recursive) { |
|
1248 | 1 | $nota['protocolo'] = $this->getProtocolo()->toArray($recursive); |
|
1249 | } else { |
||
1250 | 6 | $nota['protocolo'] = $this->getProtocolo(); |
|
1251 | } |
||
1252 | 7 | return $nota; |
|
1253 | } |
||
1254 | |||
1255 | 34 | public function fromArray($nota = []) |
|
1393 | |||
1394 | 32 | public function gerarID() |
|
1412 | |||
1413 | 32 | protected function getTotais() |
|
1488 | |||
1489 | 32 | private function getNodeTotal($name = null) |
|
1526 | |||
1527 | 32 | public function getNode($name = null) |
|
1528 | { |
||
1529 | 32 | $this->getEmitente()->getEndereco()->checkCodigos(); |
|
1530 | 32 | $this->setID($this->gerarID()); |
|
1531 | 32 | $this->setDigitoVerificador(substr($this->getID(), -1, 1)); |
|
1532 | |||
1533 | 32 | $dom = new \DOMDocument('1.0', 'UTF-8'); |
|
1534 | 32 | $element = $dom->createElement(is_null($name)?'NFe':$name); |
|
1535 | 32 | $element->setAttributeNS('http://www.w3.org/2000/xmlns/', 'xmlns', self::PORTAL); |
|
1536 | |||
1537 | 32 | $info = $dom->createElement('infNFe'); |
|
1538 | 32 | $id = $dom->createAttribute('Id'); |
|
1539 | 32 | $id->value = $this->getID(true); |
|
1540 | 32 | $info->appendChild($id); |
|
1541 | 32 | $versao = $dom->createAttribute('versao'); |
|
1542 | 32 | $versao->value = self::VERSAO; |
|
1543 | 32 | $info->appendChild($versao); |
|
1544 | |||
1545 | 32 | $municipio = $this->getEmitente()->getEndereco()->getMunicipio(); |
|
1546 | 32 | $estado = $municipio->getEstado(); |
|
1547 | 32 | $ident = $dom->createElement('ide'); |
|
1548 | 32 | Util::appendNode($ident, 'cUF', $estado->getCodigo(true)); |
|
1549 | 32 | Util::appendNode($ident, 'cNF', $this->getCodigo(true)); |
|
1550 | 32 | Util::appendNode($ident, 'natOp', $this->getNatureza(true)); |
|
1551 | 32 | Util::appendNode($ident, 'mod', $this->getModelo(true)); |
|
1552 | 32 | Util::appendNode($ident, 'serie', $this->getSerie(true)); |
|
1553 | 32 | Util::appendNode($ident, 'nNF', $this->getNumero(true)); |
|
1554 | 32 | Util::appendNode($ident, 'dhEmi', $this->getDataEmissao(true)); |
|
1555 | 32 | Util::appendNode($ident, 'tpNF', $this->getTipo(true)); |
|
1556 | 32 | Util::appendNode($ident, 'idDest', $this->getDestino(true)); |
|
1557 | 32 | Util::appendNode($ident, 'cMunFG', $municipio->getCodigo(true)); |
|
1558 | 32 | Util::appendNode($ident, 'tpImp', $this->getFormato(true)); |
|
1559 | 32 | Util::appendNode($ident, 'tpEmis', $this->getEmissao(true)); |
|
1560 | 32 | Util::appendNode($ident, 'cDV', $this->getDigitoVerificador(true)); |
|
1561 | 32 | Util::appendNode($ident, 'tpAmb', $this->getAmbiente(true)); |
|
1562 | 32 | Util::appendNode($ident, 'finNFe', $this->getFinalidade(true)); |
|
1563 | 32 | Util::appendNode($ident, 'indFinal', $this->getConsumidorFinal(true)); |
|
1564 | 32 | Util::appendNode($ident, 'indPres', $this->getPresenca(true)); |
|
1565 | 32 | Util::appendNode($ident, 'procEmi', 0); // emissão de NF-e com aplicativo do contribuinte |
|
1566 | 32 | Util::appendNode($ident, 'verProc', self::APP_VERSAO); |
|
1567 | 32 | if (!is_null($this->getDataMovimentacao())) { |
|
1568 | Util::appendNode($ident, 'dhSaiEnt', $this->getDataMovimentacao(true)); |
||
1569 | } |
||
1570 | 32 | if ($this->getEmissao() != self::EMISSAO_NORMAL) { |
|
1571 | 1 | Util::appendNode($ident, 'dhCont', $this->getDataContingencia(true)); |
|
1572 | 1 | Util::appendNode($ident, 'xJust', $this->getJustificativa(true)); |
|
1573 | } |
||
1574 | 32 | $info->appendChild($ident); |
|
1575 | |||
1576 | 32 | $emitente = $this->getEmitente()->getNode(); |
|
1577 | 32 | $emitente = $dom->importNode($emitente, true); |
|
1578 | 32 | $info->appendChild($emitente); |
|
1579 | 32 | if ($this->getAmbiente() == self::AMBIENTE_HOMOLOGACAO && !is_null($this->getDestinatario())) { |
|
1580 | 32 | $this->getDestinatario()->setNome('NF-E EMITIDA EM AMBIENTE DE HOMOLOGACAO - SEM VALOR FISCAL'); |
|
1581 | } |
||
1582 | 32 | if (!is_null($this->getDestinatario())) { |
|
1583 | 32 | $destinatario = $this->getDestinatario()->getNode(); |
|
1584 | 32 | $destinatario = $dom->importNode($destinatario, true); |
|
1585 | 32 | $info->appendChild($destinatario); |
|
1586 | } |
||
1587 | 32 | $item = 0; |
|
1588 | 32 | $tributos = []; |
|
1589 | 32 | $_produtos = $this->getProdutos(); |
|
1590 | 32 | foreach ($_produtos as $_produto) { |
|
1591 | 32 | if (is_null($_produto->getItem())) { |
|
1592 | 6 | $item += 1; |
|
1593 | 6 | $_produto->setItem($item); |
|
1594 | } else { |
||
1595 | 28 | $item = $_produto->getItem(); |
|
1596 | } |
||
1597 | 32 | if ($this->getAmbiente() == self::AMBIENTE_HOMOLOGACAO) { |
|
1598 | 32 | $_produto->setDescricao('NOTA FISCAL EMITIDA EM AMBIENTE DE HOMOLOGACAO - SEM VALOR FISCAL'); |
|
1599 | } |
||
1600 | 32 | $produto = $_produto->getNode(); |
|
1601 | 32 | $produto = $dom->importNode($produto, true); |
|
1602 | 32 | $info->appendChild($produto); |
|
1603 | // Soma os tributos aproximados dos produtos |
||
1604 | 32 | $imposto_info = $_produto->getImpostoInfo(); |
|
1605 | 32 | $tributos['info'] = $imposto_info['info']; |
|
1606 | 32 | foreach ($imposto_info as $key => $value) { |
|
1607 | 32 | if (!is_numeric($value)) { |
|
1608 | 32 | continue; |
|
1609 | } |
||
1610 | 32 | if (!isset($tributos[$key])) { |
|
1611 | 32 | $tributos[$key] = 0.00; |
|
1612 | } |
||
1613 | 32 | $tributos[$key] += $value; |
|
1614 | } |
||
1615 | } |
||
1616 | 32 | $total = $this->getNodeTotal(); |
|
1617 | 32 | $total = $dom->importNode($total, true); |
|
1618 | 32 | $info->appendChild($total); |
|
1619 | 32 | $transporte = $this->getTransporte()->getNode(); |
|
1620 | 32 | $transporte = $dom->importNode($transporte, true); |
|
1621 | 32 | $info->appendChild($transporte); |
|
1622 | // TODO: adicionar cobrança |
||
1623 | 32 | $pag = $dom->createElement('pag'); |
|
1624 | 32 | $_pagamentos = $this->getPagamentos(); |
|
1625 | 32 | foreach ($_pagamentos as $_pagamento) { |
|
1626 | 31 | $pagamento = $_pagamento->getNode(); |
|
1627 | 31 | $pagamento = $dom->importNode($pagamento, true); |
|
1628 | 31 | $pag->appendChild($pagamento); |
|
1629 | } |
||
1630 | 32 | $info->appendChild($pag); |
|
1631 | 32 | $info_adic = $dom->createElement('infAdic'); |
|
1632 | 32 | if (!is_null($this->getAdicionais())) { |
|
1633 | Util::appendNode($info_adic, 'infAdFisco', $this->getAdicionais(true)); |
||
1634 | } |
||
1635 | // TODO: adicionar informações adicionais somente na NFC-e? |
||
1636 | 32 | $_complemento = Produto::addNodeInformacoes($tributos, $info_adic, 'infCpl'); |
|
1637 | 32 | $this->getTotal()->setComplemento($_complemento); |
|
1638 | 32 | if (!is_null($this->getObservacoes())) { |
|
1639 | 32 | $_observacoes = $this->getObservacoes(); |
|
1640 | 32 | foreach ($_observacoes as $_observacao) { |
|
1641 | 32 | $observacoes = $dom->createElement('obsCont'); |
|
1642 | 32 | Util::addAttribute($observacoes, 'xCampo', $_observacao['campo']); |
|
1643 | 32 | Util::appendNode($observacoes, 'xTexto', $_observacao['valor']); |
|
1644 | 32 | $info_adic->appendChild($observacoes); |
|
1645 | } |
||
1646 | } |
||
1647 | 32 | if (!is_null($this->getInformacoes())) { |
|
1648 | 32 | $_informacoes = $this->getInformacoes(); |
|
1649 | 32 | foreach ($_informacoes as $_informacao) { |
|
1650 | 32 | $informacoes = $dom->createElement('obsFisco'); |
|
1651 | 32 | Util::addAttribute($informacoes, 'xCampo', $_informacao['campo']); |
|
1652 | 32 | Util::appendNode($informacoes, 'xTexto', $_informacao['valor']); |
|
1653 | 32 | $info_adic->appendChild($informacoes); |
|
1654 | } |
||
1655 | } |
||
1656 | 32 | $info->appendChild($info_adic); |
|
1657 | // TODO: adicionar exportação |
||
1658 | // TODO: adicionar compra |
||
1659 | // TODO: adicionar cana |
||
1660 | 32 | $element->appendChild($info); |
|
1661 | 32 | $dom->appendChild($element); |
|
1662 | 32 | return $element; |
|
1663 | } |
||
1664 | |||
1665 | 27 | public function loadNode($element, $name = null) |
|
1916 | |||
1917 | /** |
||
1918 | * Carrega um arquivo XML e preenche a nota com as informações dele |
||
1919 | * @param string $filename caminho do arquivo |
||
1920 | * @return DOMDocument objeto do documento carregado |
||
1921 | */ |
||
1922 | 26 | public function load($filename) |
|
1932 | |||
1933 | /** |
||
1934 | * Assina o XML com a assinatura eletrônica do tipo A1 |
||
1935 | */ |
||
1936 | 29 | public function assinar($dom = null) |
|
1953 | |||
1954 | /** |
||
1955 | * Valida o documento após assinar |
||
1956 | */ |
||
1957 | 27 | public function validar($dom) |
|
1958 | { |
||
1984 | |||
1985 | /** |
||
1986 | * Adiciona o protocolo no XML da nota |
||
1987 | */ |
||
1988 | 3 | public function addProtocolo($dom) |
|
2018 | } |
||
2019 |
Really long classes often contain too much logic and violate the single responsibility principle.
We suggest to take a look at the “Code” section for options on how to refactor this code.