diff --git a/examples/5.0testSefazCadastro.php b/examples/5.0testSefazCadastro.php index 4f75079a..609057c6 100755 --- a/examples/5.0testSefazCadastro.php +++ b/examples/5.0testSefazCadastro.php @@ -8,8 +8,8 @@ use NFePHP\Common\Soap\SoapCurl; //tanto o config.json como o certificado.pfx podem estar -//armazenados em uma base de dados, então não é necessário -///trabalhar com arquivos, este script abaixo serve apenas como +//armazenados em uma base de dados, então não é necessário +///trabalhar com arquivos, este script abaixo serve apenas como //exemplo durante a fase de desenvolvimento e testes. $arr = [ "atualizacao" => "2016-11-03 18:01:21", @@ -27,21 +27,24 @@ "proxyPort" => "", "proxyUser" => "", "proxyPass" => "" - ] + ] ]; //monta o config.json $configJson = json_encode($arr); //carrega o conteudo do certificado. -$content = file_get_contents('expired_certificate.pfx'); +$content = file_get_contents('fixtures/expired_certificate.pfx'); +$soap = new \NFePHP\Common\Soap\SoapFake(); +$soap->disableCertValidation(true); $tools = new Tools($configJson, Certificate::readPfx($content, 'associacao')); +$tools->loadSoapClass($soap); -//Somente para modelo 55, o modelo 65 evidentemente não possue +//Somente para modelo 55, o modelo 65 evidentemente não possue //esse tipo de serviço $tools->model('55'); -//coloque a UF e escolha entre +//coloque a UF e escolha entre //CNPJ //IE //CPF @@ -53,6 +56,6 @@ $cpf = ''; $response = $tools->sefazCadastro($uf, $cnpj, $iest, $cpf); -header('Content-type: text/xml; charset=UTF-8'); -echo $response; +echo \NFePHP\NFe\Common\FakePretty::prettyPrint($response); + diff --git a/examples/5.0testSefazCancela.php b/examples/5.0testSefazCancela.php index 549b79b9..f5aa7ee8 100755 --- a/examples/5.0testSefazCancela.php +++ b/examples/5.0testSefazCancela.php @@ -9,15 +9,15 @@ use NFePHP\NFe\Complements; //tanto o config.json como o certificado.pfx podem estar -//armazenados em uma base de dados, então não é necessário -///trabalhar com arquivos, este script abaixo serve apenas como +//armazenados em uma base de dados, então não é necessário +///trabalhar com arquivos, este script abaixo serve apenas como //exemplo durante a fase de desenvolvimento e testes. $arr = [ "atualizacao" => "2016-11-03 18:01:21", "tpAmb" => 2, "razaosocial" => "SUA RAZAO SOCIAL LTDA", "cnpj" => "99999999999999", - "siglaUF" => "SP", + "siglaUF" => "MG", "schemes" => "PL_009_V4", "versao" => '4.00', "tokenIBPT" => "AAAAAAA", @@ -28,26 +28,34 @@ "proxyPort" => "", "proxyUser" => "", "proxyPass" => "" - ] + ] ]; //monta o config.json $configJson = json_encode($arr); //carrega o conteudo do certificado. -$content = file_get_contents('expired_certificate.pfx'); +$content = file_get_contents('fixtures/expired_certificate.pfx'); try { + $soap = new \NFePHP\Common\Soap\SoapFake(); + $soap->disableCertValidation(true); + + $tools = new Tools($configJson, Certificate::readPfx($content, 'associacao')); + $tools->loadSoapClass($soap); $tools->model('55'); - - $chave = '35170399999999999999550010000000301000000300'; + + $chave = '31170399999999999999550010000000301000000300'; $xJust = 'Desistencia do comprador no momento da retirada'; $nProt = '135170001136476'; $response = $tools->sefazCancela($chave, $xJust, $nProt); - + + echo \NFePHP\NFe\Common\FakePretty::prettyPrint($response); + + /* //você pode padronizar os dados de retorno atraves da classe abaixo //de forma a facilitar a extração dos dados do XML - //NOTA: mas lembre-se que esse XML muitas vezes será necessário, + //NOTA: mas lembre-se que esse XML muitas vezes será necessário, // quando houver a necessidade de protocolos $stdCl = new Standardize($response); //nesse caso $std irá conter uma representação em stdClass do XML retornado @@ -56,7 +64,7 @@ $arr = $stdCl->toArray(); //nesse caso o $json irá conter uma representação em JSON do XML retornado $json = $stdCl->toJson(); - + //verifique se o evento foi processado if ($std->cStat != 128) { //houve alguma falha e o evento não foi processado @@ -68,10 +76,10 @@ $xml = Complements::toAuthorize($tools->lastRequest, $response); //grave o XML protocolado e prossiga com outras tarefas de seu aplicativo } else { - //houve alguma falha no evento + //houve alguma falha no evento //TRATAR } - } + }*/ } catch (\Exception $e) { echo $e->getMessage(); //TRATAR diff --git a/fake/fakeSefazConcilicacao.php b/fake/fakeSefazConcilicacao.php new file mode 100644 index 00000000..435b03b9 --- /dev/null +++ b/fake/fakeSefazConcilicacao.php @@ -0,0 +1,127 @@ + "2016-11-03 18:01:21", + "tpAmb" => 2, + "razaosocial" => "SUA RAZAO SOCIAL LTDA", + "cnpj" => "99999999999999", + "siglaUF" => "SP", + "schemes" => "PL_009_V4", + "versao" => '4.00', + "tokenIBPT" => "AAAAAAA", + "CSC" => "GPB0JBWLUR6HWFTVEAS6RJ69GPCROFPBBB8G", + "CSCid" => "000001", + "proxyConf" => [ + "proxyIp" => "", + "proxyPort" => "", + "proxyUser" => "", + "proxyPass" => "" + ] + ]; + $configJson = json_encode($arr); + $soap = new SoapFake(); + $soap->disableCertValidation(true); + + $content = file_get_contents('expired_certificate.pfx'); + $tools = new Tools($configJson, Certificate::readPfx($content, 'associacao')); + $tools->model('55'); + $tools->setVerAplic('5.1.34'); + $tools->loadSoapClass($soap); + + $std = new \stdClass(); + //$std->verAplic = '1.2.3'; //opcional se declarado anteriormente - versão da aplicação que está gerando o evento + $std->nSeqEvento = 1; + $std->chNFe = '12345678901234567890123456789012345678901234'; //chave de 44 digitos da nota do fornecedor + $std->detPag[0] = new \stdClass(); + $std->detPag[0]->indPag = null; //opcional 0-Pagamento à Vista; 1-Pagamento à Prazo + $std->detPag[0]->tPag = '04'; //Obrigatório forma de pagamento + // '01' => 'Dinheiro', + // '02' => 'Cheque', + // '03' => 'Cartão de Crédito', + // '04' => 'Cartão de Débito', + // '05' => 'Cartão da Loja', + // '10' => 'Vale Alimentação', + // '11' => 'Vale Refeição', + // '12' => 'Vale Presente', + // '13' => 'Vale Combustível', + // '14' => 'Duplicata Mercantil', + // '15' => 'Boleto', + // '16' => 'Depósito Bancário', + // '17' => 'PIX Dinâmico', + // '18' => 'Transferência bancária, Carteira Digital', + // '19' => 'Programa fidelidade, Cashback, Créd Virt', + // '20' => 'PIX Estático', + // '21' => 'Crédito em Loja', + // '22' => 'Pagamento Eletrônico não Informado - Falha de hardware', + // '90' => 'Sem pagamento', + // '99' => 'Outros' + $std->detPag[0]->xPag = null; //opcional de 2 a 50 caracteres, usar quando tPag == 99 + $std->detPag[0]->vPag = 102.34; //Obrigatório valor pago + $std->detPag[0]->dPag = '2024-07-30'; //Obrigatório data do pagamento + + //grupo OPCIONAL de informações sobre envolvidos no pagamento + $std->detPag[0]->CNPJPag = '12345678901234'; //opcional, caso seja informado a UFPag também deverá ser informada + // CNPJ transacional do pagamento - Preencher informando o CNPJ do estabelecimento onde o pagamento foi + // processado/transacionado/recebido quando a emissão do documento fiscal ocorrer em estabelecimento distinto + $std->detPag[0]->UFPag = 'SP'; //opcional, caso seja informado a CNPJPag também deverá ser informada + // UF do CNPJ do estabelecimento onde o pagamento foi processado/transacionado/recebido + $std->detPag[0]->CNPJIF = '11111111111111'; //opcinal + //CNPJ da instituição financeira, de pagamento, adquirente ou subadquirente. + $std->detPag[0]->tBand = '20'; //opcional Bandeira da operadora de cartão + //01 Visa + //02 Mastercard + //03 American Express + //04 Sorocred + //05 Diners Club + //06 Elo + //07 Hipercard + //08 Aura + //09 Cabal + //10 Alelo + //11 Banes Card + //12 CalCard + //13 Credz + //14 Discover + //15 GoodCard + //16 GreenCard + //17 Hiper + //18 JcB + //19 Mais + //20 MaxVan + //21 Policard + //22 RedeCompras + //23 Sodexo + //24 ValeCard + //25 Verocheque + //26 VR + //27 Ticket + //99 Outros + $std->detPag[0]->cAut = 'a23232-49329fed'; //opcional Número de autorização da operação com cartões, PIX, boletos e outros + // pagamentos eletrônicos + + //grupo OPCIONAL de informações sobre o + $std->detPag[0]->CNPJReceb = '09876543210987';//opcional CNPJ do estab. benefic. do pag., se informado informar também a UFReceb + $std->detPag[0]->UFReceb = 'CE'; //opcional se informado informar também a CNPJReceb + + $std->cancelar = false; //permite cancelar um registro de conciliação financeira anterior + + //para cancelar + //$std->cancela = true; + //$std->protocolo = '750123456789012'; + + $response = $tools->sefazConciliacao($std); + + echo FakePretty::prettyPrint($response); +} catch (\Exception $e) { + echo $e->getMessage(); +} diff --git a/schemes/PL_009_V4/EventoCancEConf_v1.00.xsd b/schemes/PL_009_V4/EventoCancEConf_v1.00.xsd new file mode 100644 index 00000000..662ea235 --- /dev/null +++ b/schemes/PL_009_V4/EventoCancEConf_v1.00.xsd @@ -0,0 +1,9 @@ + + + + + + Schema XML de validação do evento de Cancelamento do Comprovante de Entrega da NFe + + + diff --git a/schemes/PL_009_V4/EventoEConf_v1.00.xsd b/schemes/PL_009_V4/EventoEConf_v1.00.xsd new file mode 100644 index 00000000..713a60fa --- /dev/null +++ b/schemes/PL_009_V4/EventoEConf_v1.00.xsd @@ -0,0 +1,9 @@ + + + + + + Schema XML de validação do evento de Conciliação Financeira + + + diff --git a/schemes/PL_009_V4/e110750_v1.00.xsd b/schemes/PL_009_V4/e110750_v1.00.xsd new file mode 100644 index 00000000..3633a856 --- /dev/null +++ b/schemes/PL_009_V4/e110750_v1.00.xsd @@ -0,0 +1,138 @@ + + + + + + + Schema XML de validação do evento de Conciliação Financeira – ECONF + + + + + + + + + + + + + Versão do Aplicativo do Autor do Evento + + + + + Grupo de detalhamento da forma de pagamento. + + + + + + Indicador da Forma de Pagamento:0-Pagamento à Vista;1-Pagamento à Prazo; + + + + + + + + + + + + Forma de Pagamento: + + + + + + + + + + + Descrição do Meio de Pagamento + + + + + + + + + + + Valor do Pagamento. Esta tag poderá ser omitida quando a tag tPag=90 (Sem Pagamento), caso contrário deverá ser preenchida. + + + + + Data do Pagamento + + + + + + CNPJ transacional do pagamento - Preencher informando o CNPJ do estabelecimento onde o pagamento foi processado/transacionado/recebido quando a emissão do documento fiscal ocorrer em estabelecimento distinto + + + + + UF do CNPJ do estabelecimento onde o pagamento foi processado/transacionado/recebido. + + + + + CNPJ da instituição financeira, de pagamento, adquirente ou subadquirente. + + + + + Bandeira da operadora de cartão + + + + + + + + + + + Número de autorização da operação com cartões, PIX, boletos e outros pagamentos eletrônicos + + + + + + + + + + + + + Informar o CNPJ do estabelecimento beneficiário do pagamento + + + + + UF do CNPJ do estabelecimento beneficiário do pagamento.. + + + + + + + + + + + + + + + + + + diff --git a/schemes/PL_009_V4/e110751_v1.00.xsd b/schemes/PL_009_V4/e110751_v1.00.xsd new file mode 100644 index 00000000..7543784a --- /dev/null +++ b/schemes/PL_009_V4/e110751_v1.00.xsd @@ -0,0 +1,39 @@ + + + + + + + Schema XML de validação do evento de Cancelamento do Comprovante de Entrega da NF-e + + + + + + + + + + + + + Versão do Aplicativo do Autor do Evento + + + + + Número do Protocolo de Autorização do Evento da NF-e a que se refere este cancelamento. + + + + + + + + + + + + + + diff --git a/schemes/PL_009_V4/envEventoCancEConf_v1.00.xsd b/schemes/PL_009_V4/envEventoCancEConf_v1.00.xsd new file mode 100644 index 00000000..bb050869 --- /dev/null +++ b/schemes/PL_009_V4/envEventoCancEConf_v1.00.xsd @@ -0,0 +1,10 @@ + + + + + + + Schema XML de validação do lote de envio do evento de Cancelamento de Conciliação Financeira + + + diff --git a/schemes/PL_009_V4/envEventoEConf_v1.00.xsd b/schemes/PL_009_V4/envEventoEConf_v1.00.xsd new file mode 100644 index 00000000..f4e5a28a --- /dev/null +++ b/schemes/PL_009_V4/envEventoEConf_v1.00.xsd @@ -0,0 +1,10 @@ + + + + + + + Schema XML de validação do lote de envio do evento de Conciliação Financeira + + + diff --git a/schemes/PL_009_V4/leiauteEventoCancEConf_v1.00.xsd b/schemes/PL_009_V4/leiauteEventoCancEConf_v1.00.xsd new file mode 100644 index 00000000..710d25de --- /dev/null +++ b/schemes/PL_009_V4/leiauteEventoCancEConf_v1.00.xsd @@ -0,0 +1,296 @@ + + + + + + + + Tipo Evento + + + + + + + + Código do órgão de recepção do Evento. Utilizar a Tabela do IBGE extendida, utilizar 90 para identificar o Ambiente Nacional + + + + + Identificação do Ambiente: +1 - Produção +2 - Homologação + + + + + Identificação do autor do evento + + + + CNPJ + + + + + CPF + + + + + + Chave de Acesso da NF-e vinculada ao evento + + + + + Data de emissão no formato UTC. AAAA-MM-DDThh:mm:ssTZD + + + + + Tipo do Evento + + + + + + + + + + + + Seqüencial do evento para o mesmo tipo de evento. Para maioria dos eventos será 1, nos casos em que possa existir mais de um evento, como é o caso da carta de correção, o autor do evento deve numerar de forma seqüencial. + + + + + + + + + + + Versão do Tipo do Evento + + + + + + + + + + + + + Identificador da TAG a ser assinada, a regra de formação do Id é: +“ID” + tpEvento + chave da NF-e + nSeqEvento + + + + + + + + + + + + + + + + Tipo Versão do Evento + + + + + + + + + Tipo retorno do Evento + + + + + + + + Identificação do Ambiente: +1 - Produção +2 - Homologação + + + + + Versão do Aplicativo que recebeu o Evento + + + + + Código do órgão de recepção do Evento. Utilizar a Tabela do IBGE extendida, utilizar 90 para identificar o Ambiente Nacional + + + + + Código do status da registro do Evento + + + + + Descrição literal do status do registro do Evento + + + + + Chave de Acesso NF-e vinculada + + + + + Tipo do Evento vinculado + + + + + + + + + + + Descrição do Evento + + + + + + + + + + + Seqüencial do evento + + + + + + + + + + + Data e Hora de do recebimento do evento ou do registro do evento formato UTC AAAA-MM-DDThh:mm:ssTZD. + + + + + + + + + + + Número do protocolo de registro do evento + + + + + + + + + + + + + + + + + + + Tipo Lote de Envio + + + + + + + + + + + + + + + + + Tipo Versão do EnvEvento + + + + + + + + + Tipo Retorno de Lote de Envio + + + + + + + + + + + + + Identificação do Ambiente: +1 - Produção +2 - Homologação + + + + + Versão do Aplicativo que recebeu o Evento + + + + + Código do òrgao que registrou o Evento + + + + + Código do status da registro do Evento + + + + + Descrição literal do status do registro do Evento + + + + + + + + + Tipo procEvento + + + + + + + + diff --git a/schemes/PL_009_V4/leiauteEventoEConf_v1.00.xsd b/schemes/PL_009_V4/leiauteEventoEConf_v1.00.xsd new file mode 100644 index 00000000..fe9d449d --- /dev/null +++ b/schemes/PL_009_V4/leiauteEventoEConf_v1.00.xsd @@ -0,0 +1,296 @@ + + + + + + + + Tipo Evento + + + + + + + + Código do órgão de recepção do Evento. Utilizar a Tabela do IBGE extendida, utilizar 91 para identificar o Ambiente Nacional + + + + + Identificação do Ambiente: +1 - Produção +2 - Homologação + + + + + Identificação do autor do evento + + + + CNPJ + + + + + CPF + + + + + + Chave de Acesso da NF-e vinculada ao evento + + + + + Data de emissão no formato UTC. AAAA-MM-DDThh:mm:ssTZD + + + + + Tipo do Evento + + + + + + + + + + + + Seqüencial do evento para o mesmo tipo de evento. Para maioria dos eventos será 1, nos casos em que possa existir mais de um evento, como é o caso da carta de correção, o autor do evento deve numerar de forma seqüencial. + + + + + + + + + + + Versão do Tipo do Evento + + + + + + + + + + + + + Identificador da TAG a ser assinada, a regra de formação do Id é: +“ID” + tpEvento + chave da NF-e + nSeqEvento + + + + + + + + + + + + + + + + Tipo Versão do Evento + + + + + + + + + Tipo retorno do Evento + + + + + + + + Identificação do Ambiente: +1 - Produção +2 - Homologação + + + + + Versão do Aplicativo que recebeu o Evento + + + + + Código do órgão de recepção do Evento. Utilizar a Tabela do IBGE extendida, utilizar 91 para identificar o Ambiente Nacional + + + + + Código do status da registro do Evento + + + + + Descrição literal do status do registro do Evento + + + + + Chave de Acesso NF-e vinculada + + + + + Tipo do Evento vinculado + + + + + + + + + + + Descrição do Evento + + + + + + + + + + + Seqüencial do evento + + + + + + + + + + + Data e Hora de do recebimento do evento ou do registro do evento formato UTC AAAA-MM-DDThh:mm:ssTZD. + + + + + + + + + + + Número do protocolo de registro do evento + + + + + + + + + + + + + + + + + + + Tipo Lote de Envio + + + + + + + + + + + + + + + + + Tipo Versão do EnvEvento + + + + + + + + + Tipo Retorno de Lote de Envio + + + + + + + + + + + + + Identificação do Ambiente: +1 - Produção +2 - Homologação + + + + + Versão do Aplicativo que recebeu o Evento + + + + + Código do òrgao que registrou o Evento + + + + + Código do status da registro do Evento + + + + + Descrição literal do status do registro do Evento + + + + + + + + + Tipo procEvento + + + + + + + + diff --git a/schemes/PL_009_V4/procEventoCancEConf_v1.00.xsd b/schemes/PL_009_V4/procEventoCancEConf_v1.00.xsd new file mode 100644 index 00000000..df783064 --- /dev/null +++ b/schemes/PL_009_V4/procEventoCancEConf_v1.00.xsd @@ -0,0 +1,9 @@ + + + + + + Schema XML de validação do proc do evento de Cancelamento de Conciliação financeira + + + diff --git a/schemes/PL_009_V4/procEventoEConf_v1.00.xsd b/schemes/PL_009_V4/procEventoEConf_v1.00.xsd new file mode 100644 index 00000000..d2607121 --- /dev/null +++ b/schemes/PL_009_V4/procEventoEConf_v1.00.xsd @@ -0,0 +1,9 @@ + + + + + + Schema XML de validação do proc do Evento de Conciliação Financeira + + + diff --git a/schemes/PL_009_V4/retEventoCancEConf_v1.00.xsd b/schemes/PL_009_V4/retEventoCancEConf_v1.00.xsd new file mode 100644 index 00000000..88791095 --- /dev/null +++ b/schemes/PL_009_V4/retEventoCancEConf_v1.00.xsd @@ -0,0 +1,9 @@ + + + + + + Schema XML de Retorno da envio do evento de Cancelamento de Conciliação Financeira + + + diff --git a/schemes/PL_009_V4/retEventoEConf_v1.00.xsd b/schemes/PL_009_V4/retEventoEConf_v1.00.xsd new file mode 100644 index 00000000..83b7352f --- /dev/null +++ b/schemes/PL_009_V4/retEventoEConf_v1.00.xsd @@ -0,0 +1,9 @@ + + + + + + Schema XML de Retorno da envio do evento de Conciliação Financeira + + + diff --git a/src/Tools.php b/src/Tools.php index dc3aac15..96ab0d38 100755 --- a/src/Tools.php +++ b/src/Tools.php @@ -16,6 +16,7 @@ namespace NFePHP\NFe; +use NFePHP\Common\DOMImproved; use NFePHP\Common\Strings; use NFePHP\Common\Signer; use NFePHP\Common\UFList; @@ -843,6 +844,47 @@ public function sefazInsucessoEntrega( ); } + /** + * Request event of financial reconciliation + * @param \stdClass $std + * @param \DateTimeInterface|null $dhEvento + * @param string|null $lote + * @return string + * @throws \DOMException + */ + public function sefazConciliacao( + \stdClass $std, + ?\DateTimeInterface $dhEvento = null, + ?string $lote = null + ): string { + if (empty($std->verAplic) && !empty($this->verAplic)) { + $std->verAplic = $this->verAplic; + } + $tpEvento = self::EVT_CONCILIACAO; + $cod = UFList::getCodeByUF($this->config->siglaUF); + $tagAdic = "{$std->verAplic}"; + if (!empty($std->detPag) && is_array($std->detPag)) { + foreach ($std->detPag as $pag) { + $tagAdic .= $this->tagdetPag($pag); + } + } + //cancela um evento anterior de conciliação financeira + if ($std->cancela) { + $tpEvento = self::EVT_CANCELA_CONCILIACAO; + $tagAdic = "{$std->verAplic}" + . "{$std->protocolo}"; + } + return $this->sefazEvento( + 'AN', + $std->chNFe, + $tpEvento, + $std->nSeqEvento, + $tagAdic, + $dhEvento, + $lote + ); + } + /** * Send event to SEFAZ in batch * @param string $uf @@ -1059,6 +1101,8 @@ public function sefazEvento( self::EVT_EPEC => ['versao' => '1.00', 'nome' => 'envEPEC'], self::EVT_INSUCESSO_ENTREGA => ['versao' => '1.00', 'nome' => 'envEventoInsucessoNFe'], self::EVT_CANCELA_INSUCESSO_ENTREGA => ['versao' => '1.00', 'nome' => 'envEventoCancInsucessoNFe'], + self::EVT_CONCILIACAO => ['versao' => '1.00', 'nome' => 'envEventoEConf'], + self::EVT_CANCELA_CONCILIACAO => ['versao' => '1.00', 'nome' => 'envEventoCancEConf'], ]; $verEvento = $this->urlVersion; if (!empty($eventos[$tpEvento])) { @@ -1357,6 +1401,14 @@ private function tpEv(int $tpEvento): \stdClass $std->alias = 'EventoCancInsucessoNFe'; $std->desc = 'Cancelamento Insucesso na Entrega da NF-e'; break; + case self::EVT_CONCILIACAO: + $std->alias = 'EventoEConf'; + $std->desc = 'ECONF'; + break; + case self::EVT_CANCELA_CONCILIACAO: + $std->alias = 'EventoCancEConf'; + $std->desc = 'Cancelamento Conciliação Financeira'; + break; default: $msg = "O código do tipo de evento informado não corresponde a " . "nenhum evento estabelecido."; @@ -1364,4 +1416,95 @@ private function tpEv(int $tpEvento): \stdClass } return $std; } + + /** + * Cria detPag para Consciliação financeira + * @param \stdClass $pag + * @return false|string + * @throws \DOMException + */ + private function tagdetPag(\stdClass $pag) + { + $dom = new DOMImproved('1.0', 'UTF-8'); + $dom->preserveWhiteSpace = false; + $dom->formatOutput = false; + $node = $dom->createElement('detPag'); + $dom->addChild( + $node, + "indPag", + $pag->indPag ?? null, + false + ); + $dom->addChild( + $node, + "tPag", + $pag->tPag ?? '', + true + ); + $dom->addChild( + $node, + "xPag", + !empty($pag->xPag) ? Strings::replaceUnacceptableCharacters($pag->xPag) : null, + false + ); + $dom->addChild( + $node, + "vPag", + number_format($pag->vPag, 2, '.', ''), + true + ); + $dom->addChild( + $node, + "dPag", + $pag->dPag ?? '', + true + ); + if (!empty($pag->CNPJPag) && !empty($pag->UFPag)) { + $dom->addChild( + $node, + "CNPJPag", + $pag->CNPJPag, + true + ); + $dom->addChild( + $node, + "UFPag", + $pag->UFPag, + true + ); + $dom->addChild( + $node, + "CNPJIF", + $pag->CNPJIF ?? null, + false + ); + } + $dom->addChild( + $node, + "tBand", + $pag->tBand ?? null, + false + ); + $dom->addChild( + $node, + "cAut", + $pag->cAut ?? null, + false + ); + if (!empty($pag->CNPJReceb) && !empty($pag->UFReceb)) { + $dom->addChild( + $node, + "CNPJReceb", + $pag->CNPJReceb, + true + ); + $dom->addChild( + $node, + "UFReceb", + $pag->UFReceb, + true + ); + } + return $dom->saveXML($node); + } }