From 8a51f57f59d425a02deee187994b0f58de83a05c Mon Sep 17 00:00:00 2001 From: Jeferson Menegaldo Date: Tue, 20 Jun 2023 17:23:19 -0300 Subject: [PATCH 01/10] feat: adequado para permitir o carregamento de documentos fiscais mod 55, implementado parse da cobranca --- src/NFe/Core/Nota.php | 79 +++- src/NFe/Entity/Cobranca.php | 393 ++++++++++++++++++++ src/NFe/Entity/Endereco.php | 6 +- src/NFe/Entity/Total.php | 39 ++ src/NFe/Entity/Transporte/Transportador.php | 12 +- 5 files changed, 516 insertions(+), 13 deletions(-) create mode 100644 src/NFe/Entity/Cobranca.php diff --git a/src/NFe/Core/Nota.php b/src/NFe/Core/Nota.php index 3d6b02c..6e0f8c5 100644 --- a/src/NFe/Core/Nota.php +++ b/src/NFe/Core/Nota.php @@ -45,6 +45,7 @@ use NFe\Exception\ValidationException; use FR3D\XmlDSig\Adapter\AdapterInterface; use FR3D\XmlDSig\Adapter\XmlseclibsAdapter; +use NFe\Entity\Cobranca; /** * Classe base para a formação da nota fiscal @@ -201,6 +202,13 @@ abstract class Nota implements Node */ private $pagamentos; + /** + * Cobrancas realizadas + * + * @var Cobranca[] + */ + private $cobrancas; + /** * Data e Hora da saída ou de entrada da mercadoria / produto */ @@ -559,6 +567,37 @@ public function addPagamento($pagamento) return $this; } + /** + * Cobranças realizadas + * @return mixed cobranças da Nota + */ + public function getCobrancas() + { + return $this->cobrancas; + } + + /** + * Altera o valor da Cobrança para o informado no parâmetro + * @param mixed $cobrancas novo valor para Cobranças + * @return self + */ + public function setCobrancas($cobrancas) + { + $this->cobrancas = $cobrancas; + return $this; + } + + /** + * Adiciona um(a) Cobrança para a lista de cobranças + * @param Cobranca $cobranca Instância da Cobrança que será adicionada + * @return self + */ + public function addCobranca($cobranca) + { + $this->cobrancas[] = $cobranca; + return $this; + } + /** * Data e Hora da saída ou de entrada da mercadoria / produto * @param boolean $normalize informa se a data_movimentacao deve estar no formato do XML @@ -1397,6 +1436,16 @@ public function toArray($recursive = false) } else { $nota['pagamentos'] = $this->getPagamentos(); } + if ($recursive) { + $cobrancas = []; + $_cobrancas = $this->getCobrancas(); + foreach ($_cobrancas as $_cobranca) { + $cobrancas[] = $_cobranca->toArray($recursive); + } + $nota['cobrancas'] = $cobrancas; + } else { + $nota['cobrancas'] = $this->getCobrancas(); + } $nota['data_movimentacao'] = $this->getDataMovimentacao($recursive); $nota['data_contingencia'] = $this->getDataContingencia($recursive); $nota['justificativa'] = $this->getJustificativa(); @@ -1811,7 +1860,15 @@ public function getNode($name = null) $transporte = $this->getTransporte()->getNode(); $transporte = $dom->importNode($transporte, true); $info->appendChild($transporte); - // TODO: adicionar cobrança + $cobr = $dom->createElement('cobr'); + $_cobrancas = $this->getCobrancas(); + foreach ($_cobrancas as $_cobranca) { + $cobranca = $_cobranca->getNode(); + $cobranca = $dom->importNode($cobranca, true); + $cobr->appendChild($cobranca); + } + $info->appendChild($cobr); + $pag = $dom->createElement('pag'); $_pagamentos = $this->getPagamentos(); foreach ($_pagamentos as $_pagamento) { @@ -2075,6 +2132,26 @@ public function loadNode($element, $name = null) } } $this->setPagamentos($pagamentos); + + $cobrancas = []; + $_items = $info->getElementsByTagName('cobr'); + foreach ($_items as $_item) { + $_det_items = $_item->getElementsByTagName('fat'); + foreach ($_det_items as $_det_item) { + $cobranca = new Cobranca(); + $cobranca->loadNode($_det_item, 'fat'); + $cobrancas[] = $cobranca; + } + $_det_items = $_item->getElementsByTagName('dup'); + foreach ($_det_items as $_det_item) { + $cobranca = new Cobranca(); + $cobranca->loadNode($_det_item, 'dup'); + $cobrancas[] = $cobranca; + } + } + $this->setCobrancas($cobrancas); + + $_fields = $info->getElementsByTagName('total'); if ($_fields->length > 0) { $total = new Total(); diff --git a/src/NFe/Entity/Cobranca.php b/src/NFe/Entity/Cobranca.php new file mode 100644 index 0000000..a8d640f --- /dev/null +++ b/src/NFe/Entity/Cobranca.php @@ -0,0 +1,393 @@ + + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + */ + +namespace NFe\Entity; + +use NFe\Common\Node; +use NFe\Common\Util; + +class Cobranca implements Node +{ + private $num_fatura; + private $valor_fatura; + private $desconto; + private $valor_liquido; + private $num_duplicata; + private $vencimento; + private $valor_duplicata; + + /** + * Numero da Fatura + * @param boolean $normalize informa se a valor deve estar no formato do XML + * @return string|string valor of cobranca + */ + public function getNumFatura($normalize = false) + { + if (!$normalize) { + return $this->num_fatura; + } + return $this->num_duplicata; + } + + /** + * Altera o numero da fatura para o informado no parâmetro + * + * @param string|string|null $num_fatura Novo Numero de Fatura para cobranca + * + * @return self A própria instância da classe + */ + public function setNumFatura($num_fatura) + { + $this->num_fatura = $num_fatura; + return $this; + } + + /** + * Valor do cobranca + * @param boolean $normalize informa se a valor deve estar no formato do XML + * @return float|string valor of cobranca + */ + public function getValorFatura($normalize = false) + { + if (!$normalize) { + return $this->valor_fatura; + } + return Util::toCurrency($this->valor_fatura); + } + + /** + * Altera o valor da Fatura para o informado no parâmetro + * + * @param float|string|null $valor Novo valor de Fatura para cobranca + * + * @return self A própria instância da classe + */ + public function setValorFatura($valor_fatura) + { + $valor_fatura = floatval($valor_fatura); + $this->valor_fatura = $valor_fatura; + return $this; + } + + /** + * Valor de desconto cobranca + * @param boolean $normalize informa se a valor deve estar no formato do XML + * @return float|string valor of cobranca + */ + public function getDesconto($normalize = false) + { + if (!$normalize) { + return $this->desconto; + } + return Util::toCurrency($this->desconto); + } + + /** + * Altera o valor do desconto da Fatura para o informado no parâmetro + * + * @param float|string|null $valor Novo valor de desconto para cobranca + * + * @return self A própria instância da classe + */ + public function setDesconto($desconto) + { + $desconto = floatval($desconto); + $this->desconto = $desconto; + return $this; + } + + /** + * Valor liquido do cobranca + * @param boolean $normalize informa se a valor deve estar no formato do XML + * @return float|string valor of cobranca + */ + public function getValorLiquido($normalize = false) + { + if (!$normalize) { + return $this->valor_liquido; + } + return Util::toCurrency($this->valor_liquido); + } + + /** + * Altera o valor do liquido da Fatura para o informado no parâmetro + * + * @param float|string|null $valor Novo valor liquido para cobranca + * + * @return self A própria instância da classe + */ + public function setValorLiquido($valor_liquido) + { + $valor_liquido = floatval($valor_liquido); + $this->valor_liquido = $valor_liquido; + return $this; + } + + /** + * Numero da Duplicata + * @param boolean $normalize informa se a valor deve estar no formato do XML + * @return string|string valor of cobranca + */ + public function getNumDuplicata($normalize = false) + { + if (!$normalize) { + return $this->num_duplicata; + } + return $this->num_duplicata; + } + + /** + * Altera o numero da duplicata para o informado no parâmetro + * + * @param string|string|null $num_duplicata Novo Numero de Duplicata para cobranca + * + * @return self A própria instância da classe + */ + public function setNumDuplicata($num_duplicata) + { + $this->num_duplicata = $num_duplicata; + return $this; + } + + /** + * Vencimento do cobranca + * @param boolean $normalize informa se a valor deve estar no formato do XML + * @return float|string valor of cobranca + */ + public function getVencimento($normalize = false) + { + if (!$normalize) { + return $this->vencimento; + } + return $this->vencimento; + } + + /** + * Altera a data de vencimento da duplicata para o informado no parâmetro + * + * @param float|string|null $valor Novo vencimento da duplicata para cobranca + * + * @return self A própria instância da classe + */ + public function setVencimento($vencimento) + { + $this->vencimento = $vencimento; + return $this; + } + + /** + * Valor de duplicata para cobranca + * @param boolean $normalize informa se a valor deve estar no formato do XML + * @return float|string valor of cobranca + */ + public function getValorDuplicata($normalize = false) + { + if (!$normalize) { + return $this->valor_duplicata; + } + return Util::toCurrency($this->valor_duplicata); + } + + /** + * Altera o valor da duplicata para o informado no parâmetro + * + * @param float|string|null $valor Novo valor de duplicata para cobranca + * + * @return self A própria instância da classe + */ + public function setValorDuplicata($valor_duplicata) + { + $valor_duplicata = floatval($valor_duplicata); + $this->valor_duplicata = $valor_duplicata; + return $this; + } + + /** + * Constroi uma instância de cobranca vazia + * @param array $cobranca Array contendo dados do cobranca + */ + public function __construct($cobranca = []) + { + $this->fromArray($cobranca); + } + + public function toArray($recursive = false) + { + $cobranca = []; + $cobranca['num_fatura'] = $this->getNumFatura(); + $cobranca['valor_fatura'] = $this->getValorFatura(); + $cobranca['desconto'] = $this->getDesconto(); + $cobranca['valor_liquido'] = $this->getValorLiquido(); + $cobranca['num_duplicata'] = $this->getNumDuplicata(); + $cobranca['vencimento'] = $this->getVencimento(); + $cobranca['valor_duplicata'] = $this->getValorDuplicata(); + return $cobranca; + } + + public function fromArray($cobranca = []) + { + if ($cobranca instanceof cobranca) { + $cobranca = $cobranca->toArray(); + } elseif (!is_array($cobranca)) { + return $this; + } + + if (isset($cobranca['num_fatura'])) { + $this->setNumFatura($cobranca['num_fatura']); + } else { + $this->setNumFatura(null); + } + + if (isset($cobranca['valor_fatura'])) { + $this->setValorFatura($cobranca['valor_fatura']); + } else { + $this->setValorFatura(null); + } + + if (isset($cobranca['desconto'])) { + $this->setDesconto($cobranca['desconto']); + } else { + $this->setDesconto(null); + } + + if (isset($cobranca['valor_liquido'])) { + $this->setValorLiquido($cobranca['valor_liquido']); + } else { + $this->setValorLiquido(null); + } + + if (isset($cobranca['num_duplicata'])) { + $this->setNumDuplicata($cobranca['num_duplicata']); + } else { + $this->setNumDuplicata(null); + } + if (isset($cobranca['vencimento'])) { + $this->setVencimento($cobranca['vencimento']); + } else { + $this->setVencimento(null); + } + if (isset($cobranca['valor_duplicata'])) { + $this->setValorDuplicata($cobranca['valor_duplicata']); + } else { + $this->setValorDuplicata(null); + } + return $this; + } + + + public function getNode($name = null) + { + $dom = new \DOMDocument('1.0', 'UTF-8'); + /*if ($this->getValor() < 0) { + $element = $dom->createElement(is_null($name) ? 'vTroco' : $name); + $this->setValor(-floatval($this->getValor())); + $element->appendChild($dom->createTextNode($this->getValor(true))); + $this->setValor(-floatval($this->getValor())); + return $element; + } + $element = $dom->createElement(is_null($name) ? 'detPag' : $name); + if (!is_null($this->getIndicador())) { + Util::appendNode($element, 'indPag', $this->getIndicador(true)); + } + Util::appendNode($element, 'tPag', $this->getForma(true)); + Util::appendNode($element, 'vPag', $this->getValor(true)); + if (!$this->isCartao()) { + return $element; + } + $cartao = $dom->createElement('card'); + Util::appendNode($cartao, 'tpIntegra', $this->getIntegrado(true)); + if ($this->isIntegrado()) { + Util::appendNode($cartao, 'CNPJ', $this->getCredenciadora(true)); + } + if (!is_null($this->getBandeira())) { + Util::appendNode($cartao, 'tBand', $this->getBandeira(true)); + } + if ($this->isIntegrado()) { + Util::appendNode($cartao, 'cAut', $this->getAutorizacao(true)); + } + $element->appendChild($cartao); + return $element;*/ + return null; + } + public function loadNode($element, $name = null) + { + $name = is_null($name) ? 'dup' : $name; + + if ($element->nodeName != $name) { + $_fields = $element->getElementsByTagName($name); + if ($_fields->length == 0) { + throw new \Exception('Tag "' . $name . '" não encontrada', 404); + } + $element = $_fields->item(0); + } + $this->setNumFatura( + Util::loadNode( + $element, + 'nFat' + ) + ); + $this->setValorFatura( + Util::loadNode( + $element, + 'vOrig' + ) + ); + $this->setDesconto( + Util::loadNode( + $element, + 'vDesc' + ) + ); + $this->setValorLiquido( + Util::loadNode( + $element, + 'vLiq' + ) + ); + $this->setNumDuplicata( + Util::loadNode( + $element, + 'nDup' + ) + ); + $this->setVencimento( + Util::loadNode( + $element, + 'dVenc' + ) + ); + $this->setValorDuplicata( + Util::loadNode( + $element, + 'vDup' + ) + ); + return $element; + } +} diff --git a/src/NFe/Entity/Endereco.php b/src/NFe/Entity/Endereco.php index f8c31f3..a6936fe 100644 --- a/src/NFe/Entity/Endereco.php +++ b/src/NFe/Entity/Endereco.php @@ -161,7 +161,8 @@ public function parseDescricao($descricao) { $pattern = '/(.*), (.*) - (.*)/'; if (!preg_match($pattern, $descricao, $matches)) { - throw new \Exception('Não foi possível desmembrar a linha de endereço', 500); + $this->setLogradouro($descricao); + return $this; } $this->setLogradouro($matches[1]); $this->setNumero($matches[2]); @@ -282,8 +283,7 @@ public function loadNode($element, $name = null) $this->setBairro( Util::loadNode( $element, - 'xBairro', - 'Tag "xBairro" do campo "Bairro" não encontrada' + 'xBairro' ) ); $this->getMunicipio()->setCodigo( diff --git a/src/NFe/Entity/Total.php b/src/NFe/Entity/Total.php index d786c13..0b2b0ef 100644 --- a/src/NFe/Entity/Total.php +++ b/src/NFe/Entity/Total.php @@ -76,6 +76,11 @@ class Total implements Node */ private $complemento; + /** + * valor total da nota + */ + private $total_nota; + /** * Constroi uma instância de Total vazia * @param array $total Array contendo dados do Total @@ -274,6 +279,30 @@ public function setComplemento($complemento) return $this; } + /** + * Valor total da nota + * @param boolean $normalize informa se o complemento deve estar no formato do XML + * @return mixed Valor total + */ + public function getTotalNota($normalize = false) + { + if (!$normalize) { + return $this->total_nota; + } + return $this->total_nota; + } + + /** + * Altera o valor do total da nota + * @param mixed $total_nota novo valor para Total da Nota + * @return self A própria instância da classe + */ + public function setTotalNota($total_nota) + { + $this->total_nota = $total_nota; + return $this; + } + /** * Converte a instância da classe para um array de campos com valores * @return array Array contendo todos os campos e valores da instância @@ -287,6 +316,7 @@ public function toArray($recursive = false) $total['frete'] = $this->getFrete(); $total['despesas'] = $this->getDespesas(); $total['tributos'] = $this->getTributos(); + $total['total'] = $this->getTotalNota(); $total['complemento'] = $this->getComplemento(); return $total; } @@ -333,6 +363,11 @@ public function fromArray($total = []) } else { $this->setTributos($total['tributos']); } + if (!array_key_exists('total_nota', $total)) { + $this->setTotalNota(null); + } else { + $this->setTotalNota($total['total_nota']); + } if (!array_key_exists('complemento', $total)) { $this->setComplemento(null); } else { @@ -366,6 +401,9 @@ public function getNode($name = null) if (!is_null($this->getTributos())) { Util::appendNode($element, 'vTotTrib', $this->getTributos(true)); } + if (!is_null($this->getTotalNota())) { + Util::appendNode($element, 'vNF', $this->getTotalNota(true)); + } if (! empty($this->getComplemento())) { Util::appendNode($element, 'infCpl', $this->getComplemento(true)); } @@ -400,6 +438,7 @@ public function loadNode($element, $name = null) $this->setFrete(Util::loadNode($element, 'vFrete')); $this->setDespesas(Util::loadNode($element, 'vOutro')); $this->setTributos(Util::loadNode($element, 'vTotTrib')); + $this->setTotalNota(Util::loadNode($element, 'vNF')); $this->setComplemento(Util::loadNode($element, 'infCpl')); return $element; } diff --git a/src/NFe/Entity/Transporte/Transportador.php b/src/NFe/Entity/Transporte/Transportador.php index 4fee211..73ba568 100644 --- a/src/NFe/Entity/Transporte/Transportador.php +++ b/src/NFe/Entity/Transporte/Transportador.php @@ -97,9 +97,6 @@ public function loadNode($element, $name = null) } $cnpj = Util::loadNode($element, 'CNPJ'); $cpf = Util::loadNode($element, 'CPF'); - if (is_null($cnpj) && is_null($cpf)) { - throw new \Exception('Tag "CNPJ" ou "CPF" não encontrada no Transportador', 404); - } $this->setCNPJ($cnpj); $this->setCPF($cpf); if (! empty($this->getCNPJ())) { @@ -122,8 +119,7 @@ public function loadNode($element, $name = null) $this->setIE( Util::loadNode( $element, - 'IE', - 'Tag "IE" do campo "IE" não encontrada' + 'IE' ) ); $this->setIM(null); @@ -137,15 +133,13 @@ public function loadNode($element, $name = null) $endereco->getMunicipio()->setNome( Util::loadNode( $element, - 'xMun', - 'Tag "xMun" do nome do município não encontrada' + 'xMun' ) ); $endereco->getMunicipio()->getEstado()->setUF( Util::loadNode( $element, - 'UF', - 'Tag "UF" da UF do estado não encontrada' + 'UF' ) ); $this->setEndereco($endereco); From bd56b5178c9a75cab3b6ceaeb310d508bd8293a7 Mon Sep 17 00:00:00 2001 From: Jeferson Menegaldo Date: Wed, 21 Jun 2023 17:56:52 -0300 Subject: [PATCH 02/10] =?UTF-8?q?fix:=20corrigido=20documenta=C3=A7=C3=A3o?= =?UTF-8?q?=20dos=20atributos?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/NFe/Entity/Cobranca.php | 78 ++++++++++++++++++++----------------- 1 file changed, 42 insertions(+), 36 deletions(-) diff --git a/src/NFe/Entity/Cobranca.php b/src/NFe/Entity/Cobranca.php index a8d640f..3025ca2 100644 --- a/src/NFe/Entity/Cobranca.php +++ b/src/NFe/Entity/Cobranca.php @@ -34,12 +34,51 @@ class Cobranca implements Node { + /** + * Numero da fatura do documento + * + * @var string + */ private $num_fatura; + + /** + * Valor total da fatura + * + * @var float + */ private $valor_fatura; + + /** + * valor do desconto da fatura + * + * @var float + */ private $desconto; + + /** + * Valor liquido da fatura + * + * @var float + */ private $valor_liquido; + + /** + * Numero da duplicata do documento + * + * @var string + */ private $num_duplicata; + + /** + * Data de vencimento da duplicata + */ private $vencimento; + + /** + * Valor da duplicata + * + * @var float + */ private $valor_duplicata; /** @@ -257,31 +296,26 @@ public function fromArray($cobranca = []) } elseif (!is_array($cobranca)) { return $this; } - if (isset($cobranca['num_fatura'])) { $this->setNumFatura($cobranca['num_fatura']); } else { $this->setNumFatura(null); } - if (isset($cobranca['valor_fatura'])) { $this->setValorFatura($cobranca['valor_fatura']); } else { $this->setValorFatura(null); } - if (isset($cobranca['desconto'])) { $this->setDesconto($cobranca['desconto']); } else { $this->setDesconto(null); } - if (isset($cobranca['valor_liquido'])) { $this->setValorLiquido($cobranca['valor_liquido']); } else { $this->setValorLiquido(null); } - if (isset($cobranca['num_duplicata'])) { $this->setNumDuplicata($cobranca['num_duplicata']); } else { @@ -299,42 +333,14 @@ public function fromArray($cobranca = []) } return $this; } - public function getNode($name = null) { - $dom = new \DOMDocument('1.0', 'UTF-8'); - /*if ($this->getValor() < 0) { - $element = $dom->createElement(is_null($name) ? 'vTroco' : $name); - $this->setValor(-floatval($this->getValor())); - $element->appendChild($dom->createTextNode($this->getValor(true))); - $this->setValor(-floatval($this->getValor())); - return $element; - } - $element = $dom->createElement(is_null($name) ? 'detPag' : $name); - if (!is_null($this->getIndicador())) { - Util::appendNode($element, 'indPag', $this->getIndicador(true)); - } - Util::appendNode($element, 'tPag', $this->getForma(true)); - Util::appendNode($element, 'vPag', $this->getValor(true)); - if (!$this->isCartao()) { - return $element; - } - $cartao = $dom->createElement('card'); - Util::appendNode($cartao, 'tpIntegra', $this->getIntegrado(true)); - if ($this->isIntegrado()) { - Util::appendNode($cartao, 'CNPJ', $this->getCredenciadora(true)); - } - if (!is_null($this->getBandeira())) { - Util::appendNode($cartao, 'tBand', $this->getBandeira(true)); - } - if ($this->isIntegrado()) { - Util::appendNode($cartao, 'cAut', $this->getAutorizacao(true)); - } - $element->appendChild($cartao); - return $element;*/ + // TODO: implementar a inserção da cobranca no xml + throw new \Exception('NÃO IMPLEMENTADO', 404); return null; } + public function loadNode($element, $name = null) { $name = is_null($name) ? 'dup' : $name; From 94219a4599897529f67c844d1c4945a671b8f42e Mon Sep 17 00:00:00 2001 From: Jeferson Menegaldo Date: Wed, 21 Jun 2023 18:07:44 -0300 Subject: [PATCH 03/10] styel: ajustado code-style --- src/NFe/Entity/Cobranca.php | 6 +++--- src/NFe/Entity/Endereco.php | 2 +- src/NFe/Entity/Transporte/Transportador.php | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/NFe/Entity/Cobranca.php b/src/NFe/Entity/Cobranca.php index 3025ca2..3a7526b 100644 --- a/src/NFe/Entity/Cobranca.php +++ b/src/NFe/Entity/Cobranca.php @@ -266,7 +266,7 @@ public function setValorDuplicata($valor_duplicata) $this->valor_duplicata = $valor_duplicata; return $this; } - + /** * Constroi uma instância de cobranca vazia * @param array $cobranca Array contendo dados do cobranca @@ -333,7 +333,7 @@ public function fromArray($cobranca = []) } return $this; } - + public function getNode($name = null) { // TODO: implementar a inserção da cobranca no xml @@ -344,7 +344,7 @@ public function getNode($name = null) public function loadNode($element, $name = null) { $name = is_null($name) ? 'dup' : $name; - + if ($element->nodeName != $name) { $_fields = $element->getElementsByTagName($name); if ($_fields->length == 0) { diff --git a/src/NFe/Entity/Endereco.php b/src/NFe/Entity/Endereco.php index a6936fe..5479e84 100644 --- a/src/NFe/Entity/Endereco.php +++ b/src/NFe/Entity/Endereco.php @@ -162,7 +162,7 @@ public function parseDescricao($descricao) $pattern = '/(.*), (.*) - (.*)/'; if (!preg_match($pattern, $descricao, $matches)) { $this->setLogradouro($descricao); - return $this; + return $this; } $this->setLogradouro($matches[1]); $this->setNumero($matches[2]); diff --git a/src/NFe/Entity/Transporte/Transportador.php b/src/NFe/Entity/Transporte/Transportador.php index 73ba568..15960ed 100644 --- a/src/NFe/Entity/Transporte/Transportador.php +++ b/src/NFe/Entity/Transporte/Transportador.php @@ -133,7 +133,7 @@ public function loadNode($element, $name = null) $endereco->getMunicipio()->setNome( Util::loadNode( $element, - 'xMun' + 'xMun' ) ); $endereco->getMunicipio()->getEstado()->setUF( From 208cc0a6bc0538ea83a8b5c4fe5c7cd20231ffb3 Mon Sep 17 00:00:00 2001 From: Jeferson Menegaldo Date: Mon, 26 Jun 2023 17:23:55 -0300 Subject: [PATCH 04/10] fix: corrigido classe Cobranca e alterado nome do atributo da classe total --- src/NFe/Core/Nota.php | 15 +-- src/NFe/Entity/Cobranca.php | 215 +++++++++++++++++------------------- src/NFe/Entity/Total.php | 28 ++--- 3 files changed, 121 insertions(+), 137 deletions(-) diff --git a/src/NFe/Core/Nota.php b/src/NFe/Core/Nota.php index 20b6262..4a47367 100644 --- a/src/NFe/Core/Nota.php +++ b/src/NFe/Core/Nota.php @@ -1860,15 +1860,16 @@ public function getNode($name = null) $transporte = $this->getTransporte()->getNode(); $transporte = $dom->importNode($transporte, true); $info->appendChild($transporte); - $cobr = $dom->createElement('cobr'); $_cobrancas = $this->getCobrancas(); - foreach ($_cobrancas as $_cobranca) { - $cobranca = $_cobranca->getNode(); - $cobranca = $dom->importNode($cobranca, true); - $cobr->appendChild($cobranca); + if (!is_null($_cobrancas)) { + $cobr = $dom->createElement('cobr'); + foreach ($_cobrancas as $_cobranca) { + $cobranca = $_cobranca->getNode(); + $cobranca = $dom->importNode($cobranca, true); + $cobr->appendChild($cobranca); + } + $info->appendChild($cobr); } - $info->appendChild($cobr); - $pag = $dom->createElement('pag'); $_pagamentos = $this->getPagamentos(); foreach ($_pagamentos as $_pagamento) { diff --git a/src/NFe/Entity/Cobranca.php b/src/NFe/Entity/Cobranca.php index 3a7526b..6a2ca2c 100644 --- a/src/NFe/Entity/Cobranca.php +++ b/src/NFe/Entity/Cobranca.php @@ -35,102 +35,99 @@ class Cobranca implements Node { /** - * Numero da fatura do documento + * Tipos de cobrança 0 - fatura; 1 - duplicata + */ + public const TIPO_FATURA = 'fatura'; + public const TIPO_DUPLICATA = 'duplicata'; + + /** + * Numero da cobrança * * @var string */ - private $num_fatura; + private $numero; /** - * Valor total da fatura + * Valor total da cobrança * * @var float */ - private $valor_fatura; + private $valor; /** - * valor do desconto da fatura + * valor do desconto da cobrança * * @var float */ private $desconto; /** - * Valor liquido da fatura + * Valor liquido da cobrança * * @var float */ private $valor_liquido; /** - * Numero da duplicata do documento - * - * @var string - */ - private $num_duplicata; - - /** - * Data de vencimento da duplicata + * Data de vencimento da cobrança */ private $vencimento; /** - * Valor da duplicata - * - * @var float + * Tipo da cobrança */ - private $valor_duplicata; + private $tipo; /** - * Numero da Fatura + * Numero da cobrança * @param boolean $normalize informa se a valor deve estar no formato do XML * @return string|string valor of cobranca */ - public function getNumFatura($normalize = false) + public function getNumero($normalize = false) { if (!$normalize) { - return $this->num_fatura; + return $this->numero; } - return $this->num_duplicata; + return $this->numero; } /** - * Altera o numero da fatura para o informado no parâmetro + * Altera o numero da cobrança para o informado no parâmetro * - * @param string|string|null $num_fatura Novo Numero de Fatura para cobranca + * @param string|string|null $numero Novo Numero de Fatura para cobranca * * @return self A própria instância da classe */ - public function setNumFatura($num_fatura) + public function setNumero($numero) { - $this->num_fatura = $num_fatura; + $this->numero = $numero; return $this; } /** - * Valor do cobranca + * Valor da cobranca * @param boolean $normalize informa se a valor deve estar no formato do XML * @return float|string valor of cobranca */ - public function getValorFatura($normalize = false) + public function getValor($normalize = false) { if (!$normalize) { - return $this->valor_fatura; + return $this->valor; } - return Util::toCurrency($this->valor_fatura); + return Util::toCurrency($this->valor); } /** - * Altera o valor da Fatura para o informado no parâmetro + * Altera o valor da Cobrança para o informado no parâmetro * * @param float|string|null $valor Novo valor de Fatura para cobranca * * @return self A própria instância da classe */ - public function setValorFatura($valor_fatura) + public function setValor($valor) { - $valor_fatura = floatval($valor_fatura); - $this->valor_fatura = $valor_fatura; + $valor = floatval($valor); + $this->valor = $valor; return $this; } @@ -188,32 +185,6 @@ public function setValorLiquido($valor_liquido) return $this; } - /** - * Numero da Duplicata - * @param boolean $normalize informa se a valor deve estar no formato do XML - * @return string|string valor of cobranca - */ - public function getNumDuplicata($normalize = false) - { - if (!$normalize) { - return $this->num_duplicata; - } - return $this->num_duplicata; - } - - /** - * Altera o numero da duplicata para o informado no parâmetro - * - * @param string|string|null $num_duplicata Novo Numero de Duplicata para cobranca - * - * @return self A própria instância da classe - */ - public function setNumDuplicata($num_duplicata) - { - $this->num_duplicata = $num_duplicata; - return $this; - } - /** * Vencimento do cobranca * @param boolean $normalize informa se a valor deve estar no formato do XML @@ -241,29 +212,41 @@ public function setVencimento($vencimento) } /** - * Valor de duplicata para cobranca - * @param boolean $normalize informa se a valor deve estar no formato do XML - * @return float|string valor of cobranca + * Tipo da cobrança 0 – fatura; 1 – duplicata + * + * @param boolean $normalize informa se o indicador deve estar no formato do XML + * @return mixed tipo da cobrança */ - public function getValorDuplicata($normalize = false) + public function getTipo($normalize = false) { if (!$normalize) { - return $this->valor_duplicata; + return $this->tipo; + } + switch ($this->tipo) { + case self::TIPO_FATURA: + return '0'; + case self::TIPO_DUPLICATA: + return '1'; } - return Util::toCurrency($this->valor_duplicata); + return $this->tipo; } /** - * Altera o valor da duplicata para o informado no parâmetro - * - * @param float|string|null $valor Novo valor de duplicata para cobranca - * + * Altera o valor do tipo para o informado no parâmetro + * @param mixed $tipo novo valor para tipo * @return self A própria instância da classe */ - public function setValorDuplicata($valor_duplicata) + public function setTipo($tipo) { - $valor_duplicata = floatval($valor_duplicata); - $this->valor_duplicata = $valor_duplicata; + switch ($tipo) { + case '0': + $tipo = self::TIPO_FATURA; + break; + case '1': + $tipo = self::TIPO_DUPLICATA; + break; + } + $this->tipo = $tipo; return $this; } @@ -279,13 +262,12 @@ public function __construct($cobranca = []) public function toArray($recursive = false) { $cobranca = []; - $cobranca['num_fatura'] = $this->getNumFatura(); - $cobranca['valor_fatura'] = $this->getValorFatura(); + $cobranca['tipo'] = $this->getTipo(); + $cobranca['numero'] = $this->getNumero(); + $cobranca['valor'] = $this->getValor(); $cobranca['desconto'] = $this->getDesconto(); $cobranca['valor_liquido'] = $this->getValorLiquido(); - $cobranca['num_duplicata'] = $this->getNumDuplicata(); $cobranca['vencimento'] = $this->getVencimento(); - $cobranca['valor_duplicata'] = $this->getValorDuplicata(); return $cobranca; } @@ -296,15 +278,20 @@ public function fromArray($cobranca = []) } elseif (!is_array($cobranca)) { return $this; } - if (isset($cobranca['num_fatura'])) { - $this->setNumFatura($cobranca['num_fatura']); + if (isset($cobranca['tipo'])) { + $this->setTipo($cobranca['tipo']); + } else { + $this->setTipo(null); + } + if (isset($cobranca['numero'])) { + $this->setNumero($cobranca['numero']); } else { - $this->setNumFatura(null); + $this->setNumero(null); } - if (isset($cobranca['valor_fatura'])) { - $this->setValorFatura($cobranca['valor_fatura']); + if (isset($cobranca['valor'])) { + $this->setValor($cobranca['valor']); } else { - $this->setValorFatura(null); + $this->setValor(null); } if (isset($cobranca['desconto'])) { $this->setDesconto($cobranca['desconto']); @@ -316,21 +303,11 @@ public function fromArray($cobranca = []) } else { $this->setValorLiquido(null); } - if (isset($cobranca['num_duplicata'])) { - $this->setNumDuplicata($cobranca['num_duplicata']); - } else { - $this->setNumDuplicata(null); - } if (isset($cobranca['vencimento'])) { $this->setVencimento($cobranca['vencimento']); } else { $this->setVencimento(null); } - if (isset($cobranca['valor_duplicata'])) { - $this->setValorDuplicata($cobranca['valor_duplicata']); - } else { - $this->setValorDuplicata(null); - } return $this; } @@ -352,18 +329,36 @@ public function loadNode($element, $name = null) } $element = $_fields->item(0); } - $this->setNumFatura( - Util::loadNode( - $element, - 'nFat' - ) - ); - $this->setValorFatura( - Util::loadNode( - $element, - 'vOrig' - ) + $this->setTipo( + $name == 'fat' ? 0 : 1 ); + if ($this->getTipo() == self::TIPO_FATURA) { + $this->setNumero( + Util::loadNode( + $element, + 'nFat' + ) + ); + $this->setValor( + Util::loadNode( + $element, + 'vOrig' + ) + ); + } else { + $this->setNumero( + Util::loadNode( + $element, + 'nDup' + ) + ); + $this->setValor( + Util::loadNode( + $element, + 'vDup' + ) + ); + } $this->setDesconto( Util::loadNode( $element, @@ -376,24 +371,12 @@ public function loadNode($element, $name = null) 'vLiq' ) ); - $this->setNumDuplicata( - Util::loadNode( - $element, - 'nDup' - ) - ); $this->setVencimento( Util::loadNode( $element, 'dVenc' ) ); - $this->setValorDuplicata( - Util::loadNode( - $element, - 'vDup' - ) - ); return $element; } } diff --git a/src/NFe/Entity/Total.php b/src/NFe/Entity/Total.php index 0b2b0ef..9150e32 100644 --- a/src/NFe/Entity/Total.php +++ b/src/NFe/Entity/Total.php @@ -79,7 +79,7 @@ class Total implements Node /** * valor total da nota */ - private $total_nota; + private $valor; /** * Constroi uma instância de Total vazia @@ -284,22 +284,22 @@ public function setComplemento($complemento) * @param boolean $normalize informa se o complemento deve estar no formato do XML * @return mixed Valor total */ - public function getTotalNota($normalize = false) + public function getValor($normalize = false) { if (!$normalize) { - return $this->total_nota; + return $this->valor; } - return $this->total_nota; + return $this->valor; } /** * Altera o valor do total da nota - * @param mixed $total_nota novo valor para Total da Nota + * @param mixed $valor novo valor para Total da Nota * @return self A própria instância da classe */ - public function setTotalNota($total_nota) + public function setValor($valor) { - $this->total_nota = $total_nota; + $this->valor = $valor; return $this; } @@ -316,7 +316,7 @@ public function toArray($recursive = false) $total['frete'] = $this->getFrete(); $total['despesas'] = $this->getDespesas(); $total['tributos'] = $this->getTributos(); - $total['total'] = $this->getTotalNota(); + $total['total'] = $this->getValor(); $total['complemento'] = $this->getComplemento(); return $total; } @@ -363,10 +363,10 @@ public function fromArray($total = []) } else { $this->setTributos($total['tributos']); } - if (!array_key_exists('total_nota', $total)) { - $this->setTotalNota(null); + if (!array_key_exists('total', $total)) { + $this->setValor(null); } else { - $this->setTotalNota($total['total_nota']); + $this->setValor($total['total']); } if (!array_key_exists('complemento', $total)) { $this->setComplemento(null); @@ -401,8 +401,8 @@ public function getNode($name = null) if (!is_null($this->getTributos())) { Util::appendNode($element, 'vTotTrib', $this->getTributos(true)); } - if (!is_null($this->getTotalNota())) { - Util::appendNode($element, 'vNF', $this->getTotalNota(true)); + if (!is_null($this->getValor())) { + Util::appendNode($element, 'vNF', $this->getValor(true)); } if (! empty($this->getComplemento())) { Util::appendNode($element, 'infCpl', $this->getComplemento(true)); @@ -438,7 +438,7 @@ public function loadNode($element, $name = null) $this->setFrete(Util::loadNode($element, 'vFrete')); $this->setDespesas(Util::loadNode($element, 'vOutro')); $this->setTributos(Util::loadNode($element, 'vTotTrib')); - $this->setTotalNota(Util::loadNode($element, 'vNF')); + $this->setValor(Util::loadNode($element, 'vNF')); $this->setComplemento(Util::loadNode($element, 'infCpl')); return $element; } From e72a1d5ca06d76f06d41ac20599e394eb0fe74f4 Mon Sep 17 00:00:00 2001 From: Jeferson Menegaldo Date: Mon, 26 Jun 2023 17:27:24 -0300 Subject: [PATCH 05/10] style: corrigido coding style --- src/NFe/Entity/Cobranca.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/NFe/Entity/Cobranca.php b/src/NFe/Entity/Cobranca.php index 6a2ca2c..52930eb 100644 --- a/src/NFe/Entity/Cobranca.php +++ b/src/NFe/Entity/Cobranca.php @@ -39,7 +39,7 @@ class Cobranca implements Node */ public const TIPO_FATURA = 'fatura'; public const TIPO_DUPLICATA = 'duplicata'; - + /** * Numero da cobrança * From 9f5b5c5989ba704b50fb49dcc357cd1abbe9db75 Mon Sep 17 00:00:00 2001 From: Jeferson Menegaldo Date: Mon, 26 Jun 2023 17:32:58 -0300 Subject: [PATCH 06/10] =?UTF-8?q?fix:=20corrigido=20documenta=C3=A7=C3=A3o?= =?UTF-8?q?=20dos=20parametros?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/NFe/Entity/Cobranca.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/NFe/Entity/Cobranca.php b/src/NFe/Entity/Cobranca.php index 52930eb..dd13a37 100644 --- a/src/NFe/Entity/Cobranca.php +++ b/src/NFe/Entity/Cobranca.php @@ -147,7 +147,7 @@ public function getDesconto($normalize = false) /** * Altera o valor do desconto da Fatura para o informado no parâmetro * - * @param float|string|null $valor Novo valor de desconto para cobranca + * @param float|string|null $desconto Novo valor de desconto para cobranca * * @return self A própria instância da classe */ @@ -174,7 +174,7 @@ public function getValorLiquido($normalize = false) /** * Altera o valor do liquido da Fatura para o informado no parâmetro * - * @param float|string|null $valor Novo valor liquido para cobranca + * @param float|string|null $valor_liquido Novo valor liquido para cobranca * * @return self A própria instância da classe */ @@ -201,7 +201,7 @@ public function getVencimento($normalize = false) /** * Altera a data de vencimento da duplicata para o informado no parâmetro * - * @param float|string|null $valor Novo vencimento da duplicata para cobranca + * @param float|string|null $vencimento Novo vencimento da duplicata para cobranca * * @return self A própria instância da classe */ From 47ed3ff2c37169ea19eeb41b2b9f26a925c6ec7d Mon Sep 17 00:00:00 2001 From: Jeferson Menegaldo Date: Thu, 29 Jun 2023 09:46:29 -0300 Subject: [PATCH 07/10] fix: corrigido retorno do getValor da classe Total --- src/NFe/Entity/Cobranca.php | 3 +-- src/NFe/Entity/Total.php | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/src/NFe/Entity/Cobranca.php b/src/NFe/Entity/Cobranca.php index dd13a37..ea081a5 100644 --- a/src/NFe/Entity/Cobranca.php +++ b/src/NFe/Entity/Cobranca.php @@ -273,7 +273,7 @@ public function toArray($recursive = false) public function fromArray($cobranca = []) { - if ($cobranca instanceof cobranca) { + if ($cobranca instanceof Cobranca) { $cobranca = $cobranca->toArray(); } elseif (!is_array($cobranca)) { return $this; @@ -315,7 +315,6 @@ public function getNode($name = null) { // TODO: implementar a inserção da cobranca no xml throw new \Exception('NÃO IMPLEMENTADO', 404); - return null; } public function loadNode($element, $name = null) diff --git a/src/NFe/Entity/Total.php b/src/NFe/Entity/Total.php index 9150e32..f1bccf7 100644 --- a/src/NFe/Entity/Total.php +++ b/src/NFe/Entity/Total.php @@ -289,7 +289,7 @@ public function getValor($normalize = false) if (!$normalize) { return $this->valor; } - return $this->valor; + return Util::toCurrency($this->valor); } /** From 27cdf4194fd36b8830bdbe2a7d38301c721de0a8 Mon Sep 17 00:00:00 2001 From: Jeferson Menegaldo Date: Thu, 29 Jun 2023 10:40:06 -0300 Subject: [PATCH 08/10] =?UTF-8?q?fix:=20alterado=20verifica=C3=A7=C3=A3o?= =?UTF-8?q?=20de=20exist=C3=AAncia=20das=20cobrancas?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/NFe/Core/Nota.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/NFe/Core/Nota.php b/src/NFe/Core/Nota.php index 4a47367..2bc1280 100644 --- a/src/NFe/Core/Nota.php +++ b/src/NFe/Core/Nota.php @@ -1861,7 +1861,7 @@ public function getNode($name = null) $transporte = $dom->importNode($transporte, true); $info->appendChild($transporte); $_cobrancas = $this->getCobrancas(); - if (!is_null($_cobrancas)) { + if(count($_cobrancas ?: []) > 0) { $cobr = $dom->createElement('cobr'); foreach ($_cobrancas as $_cobranca) { $cobranca = $_cobranca->getNode(); From 12ab047c399f148dfbf43db212803d88be3eda56 Mon Sep 17 00:00:00 2001 From: Jeferson Menegaldo Date: Thu, 29 Jun 2023 10:42:49 -0300 Subject: [PATCH 09/10] style: ajustado coding style --- src/NFe/Core/Nota.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/NFe/Core/Nota.php b/src/NFe/Core/Nota.php index 2bc1280..a93482e 100644 --- a/src/NFe/Core/Nota.php +++ b/src/NFe/Core/Nota.php @@ -1861,7 +1861,7 @@ public function getNode($name = null) $transporte = $dom->importNode($transporte, true); $info->appendChild($transporte); $_cobrancas = $this->getCobrancas(); - if(count($_cobrancas ?: []) > 0) { + if (count($_cobrancas ?: []) > 0) { $cobr = $dom->createElement('cobr'); foreach ($_cobrancas as $_cobranca) { $cobranca = $_cobranca->getNode(); From 4e2f1452d18f68654ee6b734d85e5fa706fdae91 Mon Sep 17 00:00:00 2001 From: Jeferson Menegaldo Date: Thu, 29 Jun 2023 11:10:02 -0300 Subject: [PATCH 10/10] fix: adicionado cobranca ao fromArray da nota --- src/NFe/Core/Nota.php | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/NFe/Core/Nota.php b/src/NFe/Core/Nota.php index a93482e..a463efb 100644 --- a/src/NFe/Core/Nota.php +++ b/src/NFe/Core/Nota.php @@ -1516,6 +1516,11 @@ public function fromArray($nota = []) } else { $this->setPagamentos($nota['pagamentos']); } + if (!isset($nota['cobrancas'])) { + $this->setCobrancas([]); + } else { + $this->setCobrancas($nota['cobrancas']); + } if (isset($nota['data_movimentacao'])) { $this->setDataMovimentacao($nota['data_movimentacao']); } else {