/** * @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; }