Example #1
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;
 }
 /**
  * @param $curlResult
  * @throws Exception\RastrearObjeto\RastrearObjetoException
  * @return RastrearObjetoResultado[]
  */
 private function _parseResult($curlResult)
 {
     $result = null;
     //        $curlResult = SoapClientFactory::convertEncoding($curlResult);
     $simpleXml = new \SimpleXMLElement($curlResult);
     if ($simpleXml->error) {
         throw new RastrearObjetoException('Erro ao rastrear objetos. Resposta do Correios: "' . $simpleXml->error . '"');
     } else {
         if ($simpleXml->objeto) {
             $qtdObjetos = $simpleXml->qtd;
             $objetos = $simpleXml->objeto;
             $result = array();
             for ($i = 0; $i < $qtdObjetos; $i++) {
                 $objeto = $objetos[$i];
                 $resultado = new RastrearObjetoResultado();
                 $resultado->setEtiqueta(new Etiqueta(array('etiquetaComDv' => $objeto->numero)));
                 foreach ($objeto->evento as $evento) {
                     $dataHoraStr = $evento->data . ' ' . $evento->hora;
                     $dataHora = \DateTime::createFromFormat('d/m/Y H:i', $dataHoraStr);
                     $tipo = strtoupper($evento->tipo);
                     $status = (int) $evento->status;
                     $descricao = $evento->descricao;
                     $detalhes = null;
                     if ($tipo == 'PO' && $status === 9) {
                         $detalhes = 'Objeto sujeito a encaminhamento no próximo dia útil.';
                     } else {
                         if ($evento->destino && ($tipo == 'DO' && in_array($status, array(0, 1, 2)) || $tipo == 'PMT' && $status === 1 || $tipo == 'TRI' && $status === 1 || $tipo == 'RO' && in_array($status, array(0, 1)))) {
                             $detalhes = 'Objeto encaminhado para ' . $evento->destino->cidade . '/' . $evento->destino->uf;
                             if ($evento->destino->bairro) {
                                 $detalhes .= ' - Bairro: ' . $evento->destino->bairro;
                             }
                             if ($evento->destino->local) {
                                 $detalhes .= ' - Local: ' . $evento->destino->local;
                             }
                         }
                     }
                     $resultado->addEvento(new RastrearObjetoEvento(array('tipo' => $tipo, 'status' => $status, 'dataHora' => $dataHora, 'descricao' => $descricao, 'detalhes' => $detalhes, 'local' => $evento->local, 'codigo' => $evento->codigo, 'cidade' => $evento->cidade, 'uf' => $evento->uf)));
                 }
                 $result[] = $resultado;
             }
         }
     }
     return $result;
 }