/**
  * @param \PhpSigep\Model\VerificaDisponibilidadeServico $params
  * @return Result<\PhpSigep\Model\VerificaDisponibilidadeServicoResposta>
  */
 public function execute(\PhpSigep\Model\VerificaDisponibilidadeServico $params)
 {
     $servicosDePostagem = $params->getServicos();
     $codigoDosServicos = array_map(array($this, 'arrayMapCallback'), $servicosDePostagem);
     $soapArgs = array('codAdministrativo' => $params->getAccessData()->getCodAdministrativo(), 'numeroServico' => implode(',', $codigoDosServicos), 'cepOrigem' => $params->getCepOrigem(), 'cepDestino' => $params->getCepDestino(), 'usuario' => $params->getAccessData()->getUsuario(), 'senha' => $params->getAccessData()->getSenha());
     $cacheKey = md5(serialize($soapArgs));
     $cache = Bootstrap::getConfig()->getCacheInstance();
     if ($cachedResult = $cache->getItem($cacheKey)) {
         return unserialize($cachedResult);
     }
     $r = SoapClientFactory::getSoapClient()->verificaDisponibilidadeServico($soapArgs);
     $errorCode = null;
     $errorMsg = null;
     $result = new Result();
     if (!$r) {
         $errorCode = 0;
     } else {
         if ($r instanceof \SoapFault) {
             $errorCode = $r->getCode();
             $errorMsg = SoapClientFactory::convertEncoding($r->getMessage());
             $result->setSoapFault($r);
         } else {
             if ($r instanceof \stdClass && property_exists($r, 'return')) {
                 $result->setResult(new VerificaDisponibilidadeServicoResposta(array('disponivel' => (bool) $r->return)));
                 $cache->setItem($cacheKey, serialize($result));
             } else {
                 $errorCode = 0;
                 $errorMsg = "A resposta do Correios não está no formato esperado.";
             }
         }
     }
     $result->setErrorCode($errorCode);
     $result->setErrorMsg($errorMsg);
     return $result;
 }
Esempio n. 2
0
 /**
  * @param \PhpSigep\Model\AbstractModel|\PhpSigep\Model\SolicitaEtiquetas $params
  *
  * @throws \PhpSigep\Services\Exception
  * @throws InvalidArgument
  * @return BuscaClienteResult
  */
 public function execute(AbstractModel $params)
 {
     if (!$params instanceof \PhpSigep\Model\AccessData) {
         throw new InvalidArgument();
     }
     $soapArgs = array('idContrato' => $params->getNumeroContrato(), 'idCartaoPostagem' => $params->getCartaoPostagem(), 'usuario' => $params->getUsuario(), 'senha' => $params->getSenha());
     $result = new Result();
     try {
         if (!$params->getUsuario() || !$params->getSenha() || !$params->getNumeroContrato() || !$params->getCartaoPostagem()) {
             throw new Exception('Para usar este serviço você precisa setar o nome de usuário, a senha, o numero ' . 'do contrato e o número do cartão de postagem.');
         }
         $r = SoapClientFactory::getSoapClient()->buscaCliente($soapArgs);
         if (!$r || !is_object($r) || !isset($r->return) || $r instanceof \SoapFault) {
             if ($r instanceof \SoapFault) {
                 throw $r;
             }
             throw new \Exception('Erro ao consultar os dados do cliente. Retorno: "' . $r . '"');
         }
         $result->setResult(new BuscaClienteResult((array) $r->return));
     } catch (\Exception $e) {
         if ($e instanceof \SoapFault) {
             $result->setIsSoapFault(true);
             $result->setErrorCode($e->getCode());
             $result->setErrorMsg(SoapClientFactory::convertEncoding($e->getMessage()));
         } else {
             $result->setErrorCode($e->getCode());
             $result->setErrorMsg($e->getMessage());
         }
     }
     return $result;
 }
 /**
  * @param \PhpSigep\Model\RastrearObjeto $params
  * @return \PhpSigep\Services\Result<\PhpSigep\Model\RastrearObjetoResultado[]>
  * @throws Exception\RastrearObjeto\TipoResultadoInvalidoException
  * @throws Exception\RastrearObjeto\TipoInvalidoException
  */
 public function execute(\PhpSigep\Model\RastrearObjeto $params)
 {
     switch ($params->getTipo()) {
         case \PhpSigep\Model\RastrearObjeto::TIPO_LISTA_DE_OBJETOS:
             $tipo = 'L';
             break;
         case \PhpSigep\Model\RastrearObjeto::TIPO_INTERVALO_DE_OBJETOS:
             $tipo = 'F';
             break;
         default:
             throw new \PhpSigep\Services\Real\Exception\RastrearObjeto\TipoInvalidoException("Tipo '" . $params->getTipo() . "' não é valido");
             break;
     }
     switch ($params->getTipoResultado()) {
         case \PhpSigep\Model\RastrearObjeto::TIPO_RESULTADO_APENAS_O_ULTIMO_EVENTO:
             $tipoResultado = 'U';
             break;
         case \PhpSigep\Model\RastrearObjeto::TIPO_RESULTADO_TODOS_OS_EVENTOS:
             $tipoResultado = 'T';
             break;
         default:
             throw new \PhpSigep\Services\Real\Exception\RastrearObjeto\TipoResultadoInvalidoException("Tipo de resultado '" . $params->getTipo() . "' não é valido");
             break;
     }
     $post = array('usuario' => $params->getAccessData()->getUsuario(), 'senha' => $params->getAccessData()->getSenha(), 'tipo' => $tipo, 'Resultado' => $tipoResultado, 'objetos' => implode('', array_map(function (\PhpSigep\Model\Etiqueta $etiqueta) {
         return $etiqueta->getEtiquetaComDv();
     }, $params->getEtiquetas())));
     $postContent = http_build_query($post);
     $ch = curl_init();
     curl_setopt_array($ch, array(CURLOPT_URL => 'http://websro.correios.com.br/sro_bin/sroii_xml.eventos', CURLOPT_POST => true, CURLOPT_RETURNTRANSFER => true, CURLOPT_POSTFIELDS => $postContent, CURLOPT_SSL_VERIFYPEER => false));
     // "usuario=ECT  &senha=SRO   &tipo=L&Resultado=T&objetos=SQ458226057BRRA132678652BRSX142052885BR"
     // "Usuario=sigep&Senha=n5f9t8&Tipo=L&Resultado=T&Objetos=SQ458226057BR"
     $curlResult = curl_exec($ch);
     $curlErrno = curl_errno($ch);
     $curlErr = curl_error($ch);
     curl_close($ch);
     $result = new Result();
     if ($curlErrno) {
         $result->setErrorMsg("Erro de comunicação com o Correios ao tentar buscar os dados de rastreamento. Detalhes: \"{$curlErrno} - {$curlErr}\".");
         $result->setErrorCode($curlErrno);
     } else {
         if (!$curlResult) {
             $result->setErrorMsg("Resposta do Correios veio vazia");
         } else {
             try {
                 $eventos = $this->_parseResult($curlResult);
                 $result->setResult($eventos);
             } catch (RastrearObjetoException $e) {
                 $result->setErrorCode(0);
                 $result->setErrorMsg($e->getMessage());
             }
         }
     }
     return $result;
 }
 public function execute($numeroCartaoPostagem, $usuario, $senha)
 {
     $soapArgs = array('numeroCartaoPostagem' => $numeroCartaoPostagem, 'usuario' => $usuario, 'senha' => $senha);
     $r = SoapClientFactory::getSoapClient()->getStatusCartaoPostagem($soapArgs);
     $errorCode = null;
     $errorMsg = null;
     $result = new Result();
     if (!$r) {
         $errorCode = 0;
     } else {
         if ($r instanceof \SoapFault) {
             $errorCode = $r->getCode();
             $errorMsg = SoapClientFactory::convertEncoding($r->getMessage());
             $result->setSoapFault($r);
         } else {
             if ($r instanceof \stdClass && property_exists($r, 'return')) {
                 $status = new VerificarStatusCartaoPostagemResposta();
                 $status->setReturn($r->return);
                 $result->setResult($status);
             } else {
                 $errorCode = 0;
                 $errorMsg = "A resposta do Correios não está no formato esperado.";
             }
         }
     }
     $result->setErrorCode($errorCode);
     $result->setErrorMsg($errorMsg);
     return $result;
 }
 /**
  * @param PreListaDePostagem $params
  *
  * @return \PhpSigep\Services\Result<\PhpSigep\Model\FechaPlpVariosServicosRetorno>
  */
 public function execute(\PhpSigep\Model\PreListaDePostagem $params)
 {
     $xmlDaPreLista = $this->getPlpXml($params);
     $listaEtiquetas = array();
     foreach ($params->getEncomendas() as $objetoPostal) {
         $listaEtiquetas[] = $objetoPostal->getEtiqueta()->getEtiquetaSemDv();
     }
     $xml = utf8_encode($xmlDaPreLista->flush());
     //		$xml = utf8_encode($xml);
     //		$xml = iconv('UTF-8', 'ISO-8859-1', $xml);
     $soapArgs = array('xml' => $xml, 'idPlpCliente' => '', 'cartaoPostagem' => $params->getAccessData()->getCartaoPostagem(), 'listaEtiquetas' => $listaEtiquetas, 'usuario' => $params->getAccessData()->getUsuario(), 'senha' => $params->getAccessData()->getSenha());
     $result = new Result();
     try {
         $r = SoapClientFactory::getSoapClient()->fechaPlpVariosServicos($soapArgs);
         /*if (class_exists('\StaLib_Logger')) {
               \StaLib_Logger::log('Retorno SIGEP fecha PLP: ' . print_r($r, true));
           }*/
         if ($r instanceof \SoapFault) {
             throw $r;
         }
         if ($r && $r->return) {
             $result->setResult(new FechaPlpVariosServicosRetorno(array('idPlp' => $r->return)));
         } else {
             $result->setErrorCode(0);
             $result->setErrorMsg('A resposta do Correios não está no formato esperado. Resposta recebida: "' . $r . '"');
         }
     } catch (\Exception $e) {
         if ($e instanceof \SoapFault) {
             $result->setIsSoapFault(true);
             $result->setErrorCode($e->getCode());
             $result->setErrorMsg(SoapClientFactory::convertEncoding($e->getMessage()));
         } else {
             $result->setErrorCode($e->getCode());
             $result->setErrorMsg($e->getMessage());
         }
     }
     return $result;
 }
 /**
  * @param \PhpSigep\Model\GeraDigitoVerificadorEtiquetas $params
  *
  * @return Etiqueta[]
  */
 public function execute(\PhpSigep\Model\GeraDigitoVerificadorEtiquetas $params)
 {
     $soapArgs = array('etiquetas' => array(), 'usuario' => $params->getAccessData()->getUsuario(), 'senha' => $params->getAccessData()->getSenha());
     // É necessário garantir que o array estará indexado por order natural começando do zero para setarmos os
     // DV retornados pelo webservice.
     $etiquetas = array_values($params->getEtiquetas());
     /** @var $etiqueta Etiqueta */
     foreach ($etiquetas as $etiqueta) {
         $soapArgs['etiquetas'][] = $etiqueta->getEtiquetaSemDv();
     }
     $result = new Result();
     try {
         $soapReturn = SoapClientFactory::getSoapClient()->geraDigitoVerificadorEtiquetas($soapArgs);
         if ($soapReturn && is_object($soapReturn) && $soapReturn->return) {
             if (!is_array($soapReturn->return)) {
                 $soapReturn->return = (array) $soapReturn->return;
             }
             foreach ($soapReturn->return as $k => $dv) {
                 $etiquetas[$k]->setDv((int) $dv);
             }
             $result->setResult($etiquetas);
         } else {
             $result->setErrorCode(0);
             $result->setErrorMsg('A resposta do Correios não está no formato esperado. Resposta recebida: "' . $soapReturn . '"');
         }
     } catch (\Exception $e) {
         if ($e instanceof \SoapFault) {
             $result->setIsSoapFault(true);
             $result->setErrorCode($e->getCode());
             $result->setErrorMsg(SoapClientFactory::convertEncoding($e->getMessage()));
         } else {
             $result->setErrorCode($e->getCode());
             $result->setErrorMsg($e->getMessage());
         }
     }
     return $result;
 }
 /**
  * @param \PhpSigep\Model\AbstractModel|\PhpSigep\Model\SolicitaEtiquetas $params
  *
  * @throws \PhpSigep\Services\Exception
  * @throws InvalidArgument
  * @return Result<Etiqueta[]>
  */
 public function execute(AbstractModel $params)
 {
     if (!$params instanceof \PhpSigep\Model\SolicitaEtiquetas) {
         throw new InvalidArgument();
     }
     $soapArgs = array('tipoDestinatario' => 'C', 'identificador' => $params->getAccessData()->getCnpjEmpresa(), 'idServico' => $params->getServicoDePostagem()->getIdServico(), 'qtdEtiquetas' => 1, 'usuario' => $params->getAccessData()->getUsuario(), 'senha' => $params->getAccessData()->getSenha());
     $result = new Result();
     try {
         if (!$params->getAccessData() || !$params->getAccessData()->getUsuario() || !$params->getAccessData()->getSenha()) {
             throw new Exception('Para usar este serviço você precisa setar o nome de usuário e senha.');
         }
         $etiquetasReservadas = array();
         for ($i = 0; $i < $params->getQtdEtiquetas(); $i++) {
             $r = SoapClientFactory::getSoapClient()->solicitaEtiquetas($soapArgs);
             if (class_exists('\\StaLib_Logger')) {
                 \StaLib_Logger::log('Retorno SIGEP solicitar etiquetas: ' . print_r($r, true));
             }
             if ($r && is_object($r) && isset($r->return) && !$r instanceof \SoapFault) {
                 $r = explode(',', $r->return);
                 //				$etiquetasReservadas[] = str_replace(' ', '', $r[0]);
                 $etiqueta = new Etiqueta();
                 $etiqueta->setEtiquetaSemDv($r[0]);
                 $etiquetasReservadas[] = $etiqueta;
             } else {
                 if ($r instanceof \SoapFault) {
                     throw $r;
                 }
                 throw new \Exception('Não foi possível obter as etiquetas solicitadas. Retorno: "' . $r . '"');
             }
         }
         $result->setResult($etiquetasReservadas);
     } catch (\Exception $e) {
         if ($e instanceof \SoapFault) {
             $result->setIsSoapFault(true);
             $result->setErrorCode($e->getCode());
             $result->setErrorMsg("Resposta do Correios: " . SoapClientFactory::convertEncoding($e->getMessage()));
         } else {
             $result->setErrorCode($e->getCode());
             $result->setErrorMsg($e->getMessage());
         }
     }
     return $result;
 }
Esempio n. 8
0
 public function execute($cep)
 {
     $cep = preg_replace('/[^\\d]/', '', $cep);
     $soapArgs = array('cep' => $cep);
     $r = SoapClientFactory::getSoapClient()->consultaCep($soapArgs);
     $errorCode = null;
     $errorMsg = null;
     $result = new Result();
     if (!$r) {
         $errorCode = 0;
     } else {
         if ($r instanceof \SoapFault) {
             $errorCode = $r->getCode();
             $errorMsg = SoapClientFactory::convertEncoding($r->getMessage());
             $result->setSoapFault($r);
         } else {
             if ($r instanceof \stdClass) {
                 if (property_exists($r, 'return') && $r->return instanceof \stdClass) {
                     $consultaCepResposta = new ConsultaCepResposta();
                     $consultaCepResposta->setBairro(SoapClientFactory::convertEncoding($r->return->bairro));
                     $consultaCepResposta->setCep($r->return->cep);
                     $consultaCepResposta->setCidade(SoapClientFactory::convertEncoding($r->return->cidade));
                     $consultaCepResposta->setComplemento1(SoapClientFactory::convertEncoding($r->return->complemento));
                     $consultaCepResposta->setComplemento2(SoapClientFactory::convertEncoding($r->return->complemento2));
                     $consultaCepResposta->setEndereco(SoapClientFactory::convertEncoding($r->return->end));
                     $consultaCepResposta->setId($r->return->id);
                     $consultaCepResposta->setUf($r->return->uf);
                     $result->setResult($consultaCepResposta);
                 } else {
                     $errorCode = 0;
                     $errorMsg = "Resposta em branco. Confirme se o CEP '{$cep}' realmente existe.";
                 }
             } else {
                 $errorCode = 0;
                 $errorMsg = "A resposta do Correios não está no formato esperado.";
             }
         }
     }
     $result->setErrorCode($errorCode);
     $result->setErrorMsg($errorMsg);
     return $result;
 }
Esempio n. 9
0
 /**
  * @param \PhpSigep\Model\CalcPrecoPrazo $params
  *
  * @throws Exception
  * @throws \Exception
  * @return Result<\PhpSigep\Model\CalcPrecoPrazoRespostaIterator[]>
  */
 public function execute(\PhpSigep\Model\CalcPrecoPrazo $params)
 {
     $larguraMinima = 0;
     $alturaMinima = 0;
     $comprimentoMinimo = 16;
     $diametroMinimo = 0;
     $tipoEmbalagem = $params->getDimensao()->getTipo();
     $ehEnvelope = false;
     if ($tipoEmbalagem == Dimensao::TIPO_ENVELOPE) {
         $ehEnvelope = true;
         $formatoEncomenda = 3;
         $larguraMinima = 11;
     } else {
         if ($tipoEmbalagem == Dimensao::TIPO_PACOTE_CAIXA) {
             $formatoEncomenda = 1;
             $alturaMinima = 2;
             $larguraMinima = 11;
         } else {
             if ($tipoEmbalagem == Dimensao::TIPO_ROLO_CILINDRO) {
                 $formatoEncomenda = 2;
                 $comprimentoMinimo = 18;
                 $diametroMinimo = 5;
             } else {
                 throw new Exception('Tipo de embalagem "' . $tipoEmbalagem . '" não reconhecido.');
             }
         }
     }
     $maoPropria = false;
     $valorDeclarado = 0;
     $avisoRecebimento = false;
     $servicosAdicionais = $params->getServicosAdicionais();
     $servicosAdicionais = $servicosAdicionais ? $servicosAdicionais : array();
     foreach ($servicosAdicionais as $servicoAdicional) {
         if ($servicoAdicional->is(ServicoAdicional::SERVICE_MAO_PROPRIA)) {
             $maoPropria = true;
         } else {
             if ($servicoAdicional->is(ServicoAdicional::SERVICE_VALOR_DECLARADO)) {
                 if (!$servicoAdicional->getValorDeclarado()) {
                     throw new Exception('Para usar o serviço "valor declarado" é necessário declarar o valor da mercadoria.');
                 }
                 $valorDeclarado = $servicoAdicional->getValorDeclarado();
             } else {
                 if ($servicoAdicional->is(ServicoAdicional::SERVICE_AVISO_DE_RECEBIMENTO)) {
                     $avisoRecebimento = true;
                 }
             }
         }
     }
     $servivosDePostagem = array();
     /** @var $servivoDePostagem ServicoDePostagem */
     foreach ($params->getServicosPostagem() as $servivoDePostagem) {
         $servivosDePostagem[] = $servivoDePostagem->getCodigo();
     }
     $ajustarDimensaoMinima = $params->getAjustarDimensaoMinima();
     $comprimento = (int) $params->getDimensao()->getComprimento();
     $comprimento = $comprimento < $comprimentoMinimo && $ajustarDimensaoMinima ? $comprimentoMinimo : $comprimento;
     $altura = $ehEnvelope ? 0 : (int) $params->getDimensao()->getAltura();
     $altura = $altura < $alturaMinima && $ajustarDimensaoMinima ? $alturaMinima : $altura;
     $largura = (int) $params->getDimensao()->getLargura();
     $largura = $largura < $larguraMinima && $ajustarDimensaoMinima ? $larguraMinima : $largura;
     $diametro = (int) $params->getDimensao()->getDiametro();
     $diametro = $diametro < $diametroMinimo && $ajustarDimensaoMinima ? $diametroMinimo : $largura;
     $soapArgs = array('nCdEmpresa' => $params->getAccessData()->getCodAdministrativo(), 'sDsSenha' => $params->getAccessData()->getSenha(), 'nCdServico' => implode(',', $servivosDePostagem), 'sCepOrigem' => str_replace('-', '', $params->getCepOrigem()), 'sCepDestino' => str_replace('-', '', $params->getCepDestino()), 'nVlPeso' => $params->getPeso(), 'nCdFormato' => $formatoEncomenda, 'nVlComprimento' => $comprimento, 'nVlAltura' => $altura, 'nVlLargura' => $largura, 'nVlDiametro' => $diametro, 'sCdMaoPropria' => $maoPropria ? 'S' : 'N', 'nVlValorDeclarado' => $valorDeclarado, 'sCdAvisoRecebimento' => $avisoRecebimento ? 'S' : 'N');
     $cacheKey = md5(serialize($soapArgs));
     $cache = Bootstrap::getConfig()->getCacheInstance();
     if ($cachedResult = $cache->getItem($cacheKey)) {
         return unserialize($cachedResult);
     }
     $result = new Result();
     try {
         $r = SoapClientFactory::getSoapCalcPrecoPrazo()->calcPrecoPrazo($soapArgs);
     } catch (\Exception $e) {
         $message = $e->getMessage();
         if ($message == 'Service Unavailable') {
             if (!self::$calcPrecosPrazosServiceUnavailable) {
                 //Tenta mais uma vez
                 self::$calcPrecosPrazosServiceUnavailable = true;
                 sleep(1);
                 return $this->calcPrecoPrazo($params);
             }
         }
         if ($e instanceof \SoapFault) {
             $result->setIsSoapFault(true);
             $result->setErrorCode($e->getCode());
             $result->setErrorMsg(SoapClientFactory::convertEncoding($e->getMessage()));
         } else {
             $result->setErrorCode($e->getCode());
             $result->setErrorMsg($e->getMessage());
         }
     }
     //        if (class_exists('\StaLib_Logger')) {
     //            \StaLib_Logger::log('Retorno SIGEP: ' . print_r($r, true));
     //        }
     $retorno = array();
     if (is_object($r) && $r->CalcPrecoPrazoResult && is_object($r->CalcPrecoPrazoResult) && $r->CalcPrecoPrazoResult->Servicos && is_object($r->CalcPrecoPrazoResult->Servicos)) {
         if ($r->CalcPrecoPrazoResult->Servicos->cServico) {
             $servicos = $r->CalcPrecoPrazoResult->Servicos->cServico;
             $servicos = is_array($servicos) ? $servicos : array($servicos);
             foreach ($servicos as $servico) {
                 $valor = (double) str_replace(',', '.', str_replace('.', '', $servico->Valor));
                 $valorMaoPropria = str_replace('.', '', $servico->ValorMaoPropria);
                 $valorMaoPropria = (double) str_replace(',', '.', $valorMaoPropria);
                 $valorAvisoRecebimento = str_replace('.', '', $servico->ValorAvisoRecebimento);
                 $valorAvisoRecebimento = (double) str_replace(',', '.', $valorAvisoRecebimento);
                 $valorValorDeclarado = str_replace('.', '', $servico->ValorValorDeclarado);
                 $valorValorDeclarado = (double) str_replace(',', '.', $valorValorDeclarado);
                 $item = new \PhpSigep\Model\CalcPrecoPrazoResposta(array('servico' => new \PhpSigep\Model\ServicoDePostagem($servico->Codigo), 'valor' => $valor, 'prazoEntrega' => (int) $servico->PrazoEntrega, 'valorMaoPropria' => $valorMaoPropria, 'valorAvisoRecebimento' => $valorAvisoRecebimento, 'valorValorDeclarado' => $valorValorDeclarado, 'entregaDomiciliar' => $servico->EntregaDomiciliar == 'S', 'entregaSabado' => $servico->EntregaSabado == 'S'));
                 $item->setErroCodigo($servico->Erro);
                 if ($item->getErroCodigo() && ($item->getErroCodigo() != 10 || !$item->getValor())) {
                     // Se entrar aqui significa que tem Erro e que esse Erro é diferente de 10 ou o Erro é 10 mas não
                     // não foi retornando o Valor.
                     // O erro "10" é mais um aviso do que um erro. Se for erro 10 e tiver valor, não considera um erro.
                     $msgErro = $servico->MsgErro;
                     $msgErro = SoapClientFactory::convertEncoding($msgErro);
                     $item->setErroMsg($msgErro);
                 } else {
                     $item->setErroCodigo(null);
                 }
                 $retorno[] = $item;
             }
         } else {
             $result->setErrorCode(0);
             $result->setErrorMsg('A resposta do Correios não está no formato esperado. Detalhes do problema: "Faltando a entrada \'cServico\'."');
         }
     } else {
         $result->setErrorCode(0);
         if (is_object($r)) {
             $result->setErrorMsg('A resposta do Correios não está no formato esperado. Detalhes do problema: "A resposta recebida é um objeto, mas este objeto não possui todos as entradas necessárias."');
         } else {
             $result->setErrorMsg('A resposta do Correios não está no formato esperado. Resposta recebida: "' . $r . '"');
         }
     }
     $retornoIterator = new \PhpSigep\Model\CalcPrecoPrazoRespostaIterator($retorno);
     $result->setResult($retorno);
     if (!$result->hasError()) {
         if ($retornoIterator->todosTemErro()) {
             $erros = array();
             /** @var $retItem \PhpSigep\Model\CalcPrecoPrazoResposta */
             foreach ($retornoIterator as $retItem) {
                 $erros[$retItem->getErroCodigo()] = $retItem;
             }
             /** @var $exception \PhpSigep\Model\CalcPrecoPrazoResposta */
             $exception = null;
             $errosPrioritarios = array('999', '-3', '-2', '-4', '-33', '7');
             foreach ($errosPrioritarios as $erroPrioritario) {
                 if (isset($erros[$erroPrioritario])) {
                     $exception = $erros[$erroPrioritario];
                     break;
                 }
             }
             if (!$exception) {
                 $exception = reset($erros);
             }
             $result->setErrorCode($exception->getErroCodigo());
             $result->setErrorMsg($exception->getErroMsg());
         } else {
             $cache->setItem($cacheKey, serialize($result));
         }
     }
     return $result;
 }
Esempio n. 10
0
 /**
  * @param \PhpSigep\Model\RastrearObjeto $params
  * @return \PhpSigep\Services\Result<\PhpSigep\Model\RastrearObjetoResultado[]>
  * @throws Exception\RastrearObjeto\TipoResultadoInvalidoException
  * @throws Exception\RastrearObjeto\TipoInvalidoException
  */
 public function execute(\PhpSigep\Model\RastrearObjeto $params)
 {
     switch ($params->getTipo()) {
         case \PhpSigep\Model\RastrearObjeto::TIPO_LISTA_DE_OBJETOS:
             $tipo = 'L';
             break;
         case \PhpSigep\Model\RastrearObjeto::TIPO_INTERVALO_DE_OBJETOS:
             $tipo = 'F';
             break;
         default:
             throw new \PhpSigep\Services\Real\Exception\RastrearObjeto\TipoInvalidoException("Tipo '" . $params->getTipo() . "' não é valido");
             break;
     }
     switch ($params->getTipoResultado()) {
         case \PhpSigep\Model\RastrearObjeto::TIPO_RESULTADO_APENAS_O_ULTIMO_EVENTO:
             $tipoResultado = 'U';
             break;
         case \PhpSigep\Model\RastrearObjeto::TIPO_RESULTADO_TODOS_OS_EVENTOS:
             $tipoResultado = 'T';
             break;
         default:
             throw new \PhpSigep\Services\Real\Exception\RastrearObjeto\TipoResultadoInvalidoException("Tipo de resultado '" . $params->getTipo() . "' não é valido");
             break;
     }
     $soapArgs = array('usuario' => $params->getAccessData()->getUsuario(), 'senha' => $params->getAccessData()->getSenha(), 'tipo' => $tipo, 'resultado' => $tipoResultado, 'lingua' => $params->getIdioma(), 'objetos' => implode('', array_map(function (\PhpSigep\Model\Etiqueta $etiqueta) {
         return $etiqueta->getEtiquetaComDv();
     }, $params->getEtiquetas())));
     $result = new Result();
     try {
         $soapReturn = SoapClientFactory::getRastreioObjetos()->buscaEventos($soapArgs);
         if ($soapReturn && is_object($soapReturn) && $soapReturn->return) {
             try {
                 if (!is_array($soapReturn->return->objeto)) {
                     $soapReturn->return->objeto = array($soapReturn->return->objeto);
                 }
                 $resultado = array();
                 foreach ($soapReturn->return->objeto as $objeto) {
                     // Verifica se ocorreu algum erro ao consultar a etiqueta
                     if (isset($objeto->erro)) {
                         throw new RastrearObjetoException(SoapClientFactory::convertEncoding('(' . $objeto->numero . ') ' . $objeto->erro));
                     }
                     $eventos = new RastrearObjetoResultado();
                     $eventos->setEtiqueta(new Etiqueta(array('etiquetaComDv' => $objeto->numero)));
                     $ev = $objeto->evento;
                     $evento = new RastrearObjetoEvento();
                     $evento->setTipo($ev->tipo);
                     $evento->setStatus($ev->status);
                     $evento->setDataHora(\DateTime::createFromFormat('d/m/Y H:i', $ev->data . ' ' . $ev->hora));
                     $evento->setDescricao(SoapClientFactory::convertEncoding($ev->descricao));
                     $evento->setDetalhe(isset($ev->detalhe) ? $ev->detalhe : '');
                     $evento->setLocal($ev->local);
                     $evento->setCodigo($ev->codigo);
                     $evento->setCidade($ev->cidade);
                     $evento->setUf($ev->uf);
                     // Sempre adiciona o recebedor ao resultado, mesmo ele sendo exibdo apenas quanto 'tipo' = BDE e 'status' = 01
                     $evento->setRecebedor(isset($ev->recebedor) && !empty($ev->recebedor) ? trim($ev->recebedor) : '');
                     // Adiciona o evento ao resultado
                     $eventos->addEvento($evento);
                     $resultado[] = $eventos;
                 }
                 $result->setResult($resultado);
             } catch (RastrearObjetoException $e) {
                 $result->setErrorCode(0);
                 $result->setErrorMsg("Erro de comunicação com o Correios ao tentar buscar os dados de rastreamento. Detalhes: " . $e->getMessage());
             }
         } else {
             $result->setErrorCode(0);
             $result->setErrorMsg('A resposta do Correios não está no formato esperado. Resposta recebida: "' . $soapReturn . '"');
         }
     } catch (\Exception $e) {
         if ($e instanceof \SoapFault) {
             $result->setIsSoapFault(true);
             $result->setErrorCode($e->getCode());
             $result->setErrorMsg(SoapClientFactory::convertEncoding($e->getMessage()));
         } else {
             $result->setErrorCode($e->getCode());
             $result->setErrorMsg($e->getMessage());
         }
     }
     return $result;
 }