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