stavarengo / php-sigep

PHP client library for the Brazilian Post Office Web Service. Integração com Web Service do Correios. Consulta preços e prazos, imprime etiquetas e PLP, etc.
https://phpsigep.stavarengo.me
MIT License
363 stars 249 forks source link

CalcPrecoPrazo - There is no service with the code "0" #489

Closed Lukaum closed 2 years ago

Lukaum commented 3 years ago

Utilizando da forma com que consta nos exemplos, estou obtendo um erro referente a inexistência do código do serviço. $params->setServicosPostagem(PhpSigep\Model\ServicoDePostagem::getAll());

Seria possível consultar todos os serviços disponíveis, conforme o getAll()? Ou há a necessidade de se passar somente um serviço? Pergunto, pois nas issues fechadas não há essa informação, ficando vaga a solução para o problema.

Meu código:

//DIMENSÃO
$dimensao = new \PhpSigep\Model\Dimensao();
$dimensao->setTipo(PhpSigep\Model\Dimensao::TIPO_PACOTE_CAIXA);
$dimensao->setAltura($arr['altura_total']); // em centímetros
$dimensao->setComprimento($arr['comprimento_maior']); // em centímetros
$dimensao->setLargura($arr['largura_maior']); // em centímetros

//PARÂMETROS
$params = new \PhpSigep\Model\CalcPrecoPrazo();
$params->setAccessData(new \PhpSigep\Model\AccessDataHomologacao());
$params->setCepOrigem(CEP_LOJA);
$params->setCepDestino($arr['cep_destino']);
$params->setServicosPostagem(PhpSigep\Model\ServicoDePostagem::getAll());
$params->setAjustarDimensaoMinima(true);
$params->setDimensao($dimensao);
$params->setPeso($arr['peso_total']);// gramas

echo '<pre>' . var_export($params, true) . '</pre>';

//RESPOSTA
$phpSigep = new \PhpSigep\Services\SoapClient\Real();
$result = $phpSigep->calcPrecoPrazo($params);

var_dump((array)$result);

Erro: Fatal error: Uncaught PhpSigep\Model\Exception: There is no service with the code "0"...

Lukaum commented 3 years ago

O erro se encontra no construtor da classe ServicoDePostagem. Conforme testes, o mesmo recebe no último elemento do $serviceCode um 0 do tipo inteiro, ao passar pelo sprintf é formatado os 0 restantes e da o parse pra string:

...\vendor\stavarengo\php-sigep\src\PhpSigep\Model\ServicoDePostagem.php:179:int 0
...vendor\stavarengo\php-sigep\src\PhpSigep\Model\ServicoDePostagem.php:179:string '00000' (length=5)

Agora a questão é de onde está vindo esse 0. Utilizei ambos os testes abaixo e mesmo assim obtive o mesmo resultado (com o erro):

//Convencional conforme exemplo
$params->setServicosPostagem(\PhpSigep\Model\ServicoDePostagem::getAll());

//Outra forma
foreach (\PhpSigep\Model\ServicoDePostagem::getAll() as $key => $s) {
    $codigo = $s->getCodigo();
    $this->servicos[$codigo] = $codigo;
}

$params->setServicosPostagem($this->servicos);

//Essa também
$params->setServicosPostagem(\PhpSigep\Model\ServicoDePostagem::getFromArray($this->servicos));

Saliento que os demais serviços (pelo que contei os 48) aparentemente estão sendo retornados conforme o esperado:

//Últimos retornados antes do erro
...\vendor\stavarengo\php-sigep\src\PhpSigep\Model\ServicoDePostagem.php:179:string '04227' (length=5)
...\vendor\stavarengo\php-sigep\src\PhpSigep\Model\ServicoDePostagem.php:179:string '04235' (length=5)
...\vendor\stavarengo\php-sigep\src\PhpSigep\Model\ServicoDePostagem.php:179:string '04235' (length=5)
...\vendor\stavarengo\php-sigep\src\PhpSigep\Model\ServicoDePostagem.php:179:string '04391' (length=5)
...\vendor\stavarengo\php-sigep\src\PhpSigep\Model\ServicoDePostagem.php:179:string '04391' (length=5)
stale[bot] commented 2 years ago

This issue has been automatically marked as stale because it has not had any recent activity. It will be closed in 5 days if no further activity occurs.

stale[bot] commented 2 years ago

This issue has been automatically closed because it has not had any recent activity. If you have a question or comment, please open a new issue.