Author: : Stavarengo
Author: : davidalves1
Inheritance: extends AbstractModel
 /**
  * @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;
 }
Example #2
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;
 }