Skip to content

Commit

Permalink
Adicionado serviço de sondagem de Títulos
Browse files Browse the repository at this point in the history
  • Loading branch information
DenysXavier committed Feb 13, 2017
1 parent 14ba32a commit ae5741e
Show file tree
Hide file tree
Showing 2 changed files with 115 additions and 34 deletions.
75 changes: 44 additions & 31 deletions src/BoletoSantanderServico.php
Original file line number Diff line number Diff line change
Expand Up @@ -71,17 +71,31 @@ private function gerarTicket(PropriedadesExportaveisParaArrayInterface $objeto)
}

public function incluirTitulo(Ticket $ticket) {
$xml = $this->iniciarXmlSoapEnvelope();
$xml->startElement("registraTitulo");
$xml->writeRaw($ticket->exportarParaXml("dto"));
$xml->endDocument();
$xml = $this->criarEnvelopeParaTicket($ticket, "registraTitulo");

$resposta = $this->executarServico(self::COBRANCA_ENDPOINT, $xml);
$retornoDocumentoXML = $this->converterRespostaParaDOMDocument($resposta);

return $this->tituloFoiIncluidoComSucesso($retornoDocumentoXML);
}

public function sondarTitulo(Ticket $ticket) {
$xml = $this->criarEnvelopeParaTicket($ticket, "consultaTitulo");

$resposta = $this->executarServico(self::COBRANCA_ENDPOINT, $xml);
$respostaXML = $this->converterRespostaParaDOMDocument($resposta);

return $this->converterRespostaParaBoleto($respostaXML);
}

private function criarEnvelopeParaTicket(Ticket $ticket, $nomeAcao) {
$xml = $this->iniciarXmlSoapEnvelope();
$xml->startElement($nomeAcao);
$xml->writeRaw($ticket->exportarParaXml("dto"));
$xml->endDocument();
return $xml;
}

/** Inicia um novo objeto XMLWriter com o nó raiz Envelope, o nó Header e o nó Body aberto para receber conteúdo.
*
* @return \XMLWriter
Expand Down Expand Up @@ -161,32 +175,18 @@ private function processarRetornoParaTicket(\DOMDocument $resposta) {
* @throws \Exception
*/
private function criarTiqueteAPartirDaResposta(\DOMDocument $dom) {
$retCode = $this->getNodeValue($dom, "retCode");
$leitor = new LeitorSimplesXML($dom);
$retCode = $leitor->getValorNo("retCode");

if ($retCode === "0") {
$ticket = new Ticket();
$ticket->setAutenticacao($this->getNodeValue($dom, "ticket"));
$ticket->setAutenticacao($leitor->getValorNo("ticket"));
return $ticket;
}

throw new \Exception("O serviço de inclusão de título do Santander retornou um erro. Código: " . $retCode);
}

/** Obtém o valor do primeiro nó com o nome informado
*
* @param \DOMDocument $doc Documento XML a ser pesquisado
* @param string $tagName Nome do nó a ser pesquisado
* @return string
* @throws \Exception
*/
private function getNodeValue(\DOMDocument $doc, $tagName) {
try {
return $doc->getElementsByTagName($tagName)->item(0)->nodeValue;
} catch (\Exception $e) {
throw $e;
}
}

/** Verifica se um título foi incluído com sucesso no Santander a partir da resposta do serviço de inclusão de título
*
* @param \DOMDocument $dom Documento XML representando a resposta do serviço
Expand All @@ -211,8 +211,9 @@ private function tituloFoiIncluidoComSucesso(\DOMDocument $dom) {
* @throws \Exception
*/
private function lancarExceptionSeRespostaForSOAPFault(\DOMDocument $dom) {
$leitor = new LeitorSimplesXML($dom);
try {
$faultString = $this->getNodeValue($dom, "faultstring");
$faultString = $leitor->getValorNo("faultstring");
throw new \Exception($faultString);
} catch (\Exception $e) {
return;
Expand All @@ -225,12 +226,13 @@ private function lancarExceptionSeRespostaForSOAPFault(\DOMDocument $dom) {
* @throws \Exception
*/
private function processarErros(\DOMDocument $dom) {
$errosStr = $this->getNodeValue($dom, "descricaoErro");
$leitor = new LeitorSimplesXML($dom);
$errosStr = $leitor->getValorNo("descricaoErro");

$errorDesc = $this->gerarArrayDeErrosAPartirDaString($errosStr);

if (count($errorDesc) > 0) {
throw new \Exception("Serviço de inclusão de título do Santander retornou os seguintes erros: " . implode("; ", $errorDesc));
throw new \Exception("Serviço do Santander retornou os seguintes erros: " . implode("; ", $errorDesc));
}
}

Expand All @@ -241,19 +243,30 @@ private function processarErros(\DOMDocument $dom) {
*/
private function gerarArrayDeErrosAPartirDaString($errosStr) {
$errosRetornados = array();

if ($errosStr != "") {
$erros = explode("\n", $errosStr);
foreach ($erros as $erro) {
list($codigo, $descricao) = explode("-", $erro);

$erros = explode("\n", $errosStr);
foreach ($erros as $erro) {
list($codigo, $descricao) = explode("-", $erro);
if (trim($codigo) == "00000") {
break;
}

if (trim($codigo) == "00000") {
break;
$errosRetornados[] = trim($descricao);
}

$errosRetornados[] = trim($descricao);
}

return $errosRetornados;
}

private function converterRespostaParaBoleto($respostaXML) {
$this->lancarExceptionSeRespostaForSOAPFault($respostaXML);
$this->processarErros($respostaXML);

$boleto = new Boleto();
$boleto->carregarPorXML($respostaXML);
return $boleto;
}

}
74 changes: 71 additions & 3 deletions tests/BoletoSantanderServicoTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@ public function testeParaSolicitarTicketDeInclusao() {

$this->assertEquals($ticketBase64, $ticket->getAutenticacao());
}

/**
* @author Denys Xavier <[email protected]>
* @test
Expand Down Expand Up @@ -95,7 +95,7 @@ public function testeParaSolicitarTicketDeSondagem() {
* @test
*/
public function testeParaIncluirUmTitulo() {
$dataFake = date("dmY");
$dataFake = date(TIExpert\WSBoletoSantander\Config::getInstance()->getGeral("formato_data"));

$comunicador = $this->getMockBuilder("TIExpert\WSBoletoSantander\ComunicadorCurlSOAP")->getMock();
$comunicador->method("chamar")->willReturn('<?xml version="1.0" encoding="utf-8"?>
Expand All @@ -110,7 +110,7 @@ public function testeParaIncluirUmTitulo() {
</convenio>
<descricaoErro>00000 - Título registrado em cobrança</descricaoErro>
<dtNsu>' . $dataFake . '</dtNsu>
<estacao>' . self::$faker->regexify("[A-Z0-9]{9}") . '</estacao>
<estacao>' . self::$faker->regexify("[A-Z0-9]{4}") . '</estacao>
<nsu>TST' . mt_rand(100000, 999999) . '</nsu>
<pagador>
<bairro>' . self::$faker->city . '</bairro>
Expand Down Expand Up @@ -159,4 +159,72 @@ public function testeParaIncluirUmTitulo() {
$this->assertTrue($resultado);
}

/**
* @author Denys Xavier <[email protected]>
* @test
*/
public function testeParaSondarUmTitulo() {
$formato_data = TIExpert\WSBoletoSantander\Config::getInstance()->getGeral("formato_data");

$comunicador = $this->getMockBuilder("TIExpert\WSBoletoSantander\ComunicadorCurlSOAP")->getMock();
$comunicador->method("chamar")->willReturn('<?xml version="1.0" encoding="utf-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Body>
<dlwmin:consultaTituloResponse xmlns:dlwmin="http://impl.webservice.ymb.app.bsbr.altec.com/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<return xmlns:ns2="http://impl.webservice.ymb.app.bsbr.altec.com/">
<codcede>' . self::$faker->regexify("[0-9]{9}") . '</codcede>
<convenio>
<codBanco>' . self::$boleto->getConvenio()->getCodigoBanco() . '</codBanco>
<codConv>' . self::$boleto->getConvenio()->getCodigoConvenio() . '</codConv>
</convenio>
<descricaoErro></descricaoErro>
<dtNsu>10022017</dtNsu>
<estacao>' . self::$faker->regexify("[A-Z0-9]{4}") . '</estacao>
<nsu>TST' . self::$faker->regexify("[0-9]{4}") . '</nsu>
<pagador>
<bairro>' . self::$boleto->getPagador()->getBairro() . '</bairro>
<cep>' . self::$boleto->getPagador()->getCEP() . '</cep>
<cidade>' . self::$boleto->getPagador()->getCidade() . '</cidade>
<ender>' . self::$boleto->getPagador()->getEndereco() . '</ender>
<nome>' . self::$boleto->getPagador()->getNome() . '</nome>
<numDoc>' . self::$boleto->getPagador()->getNumeroDoc() . '</numDoc>
<tpDoc>' . self::$boleto->getPagador()->getTipoDoc() . '</tpDoc>
<uf>' . self::$boleto->getPagador()->getUF() . '</uf>
</pagador>
<situacao>0</situacao>
<titulo>
<aceito></aceito>
<cdBarra>' . self::$faker->regexify("[0-9]{44}") . '</cdBarra>
<dtEmissao>' . self::$boleto->getTitulo()->getDataEmissao()->format($formato_data) . '</dtEmissao>
<dtEntr>' . date($formato_data) . '</dtEntr>
<dtLimiDesc>' . self::$boleto->getTitulo()->getInstrucoes()->getDataLimiteDesconto()->format($formato_data) . '</dtLimiDesc>
<dtVencto>' . self::$boleto->getTitulo()->getDataVencimento()->format($formato_data) . '</dtVencto>
<especie>' . self::$boleto->getTitulo()->getEspecie() . '</especie>
<linDig>' . self::$faker->regexify("[0-9]{47}") . '</linDig>
<mensagem></mensagem>
<nossoNumero>' . self::$boleto->getTitulo()->getNossoNumero() . '</nossoNumero>
<pcJuro>' . self::$boleto->getTitulo()->getInstrucoes()->getJuros() . '</pcJuro>
<pcMulta>' . self::$boleto->getTitulo()->getInstrucoes()->getMulta() . '</pcMulta>
<qtDiasBaixa>' . self::$boleto->getTitulo()->getInstrucoes()->getBaixarApos() . '</qtDiasBaixa>
<qtDiasMulta>' . self::$boleto->getTitulo()->getInstrucoes()->getMultarApos() . '</qtDiasMulta>
<qtDiasProtesto>' . self::$boleto->getTitulo()->getInstrucoes()->getProtestarApos() . '</qtDiasProtesto>
<seuNumero>' . self::$boleto->getTitulo()->getSeuNumero() . '</seuNumero>
<tpDesc>' . self::$boleto->getTitulo()->getInstrucoes()->getTipoDesconto() . '</tpDesc>
<tpProtesto>' . self::$boleto->getTitulo()->getInstrucoes()->getTipoProtesto() . '</tpProtesto>
<vlAbatimento>' . self::$boleto->getTitulo()->getInstrucoes()->getValorAbatimento() * 100 . '</vlAbatimento>
<vlDesc>' . self::$boleto->getTitulo()->getInstrucoes()->getValorDesconto() * 100 . '</vlDesc>
<vlNominal>' . self::$boleto->getTitulo()->getValor() * 100 . '</vlNominal>
</titulo>
<tpAmbiente>T</tpAmbiente>
</return>
</dlwmin:consultaTituloResponse>
</soapenv:Body>
</soapenv:Envelope>');

$svc = new BoletoSantanderServico($comunicador);
$resultado = $svc->sondarTitulo(self::$ticket);

$this->assertEquals(self::$boleto, $resultado, '', 60);
}

}

0 comments on commit ae5741e

Please sign in to comment.