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