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 250 forks source link

Erro ao fechar PLP #464

Closed relpcam closed 3 years ago

relpcam commented 3 years ago

Toda vez em que eu passo o Valor Declarado ao fechar uma PLP aparece o erro:

PhpSigep\Services\Result Object
(
    [isSoapFault:protected] => 1
    [errorCode:protected] => 0
    [errorMsg:protected] => Ocorreu um erro ao interpretar os dados do XML gerado pelo Cliente. 

    [result:protected] => 
    [soapFault:protected] => 
    [_failIfAtributeNotExiste:protected] => 1
)

Esse é código de exemplo:

 // Estamos criando uma etique falsa, mas em um ambiente real voçê deve usar o método
    // {@link \PhpSigep\Services\SoapClient\Real::solicitaEtiquetas() } para gerar o número das etiquetas
    $etiqueta = new \PhpSigep\Model\Etiqueta();
    $etiqueta->setEtiquetaSemDv('PD73958096BR');

    $servicoAdicional = new \PhpSigep\Model\ServicoAdicional();
    $servicoAdicional->setCodigoServicoAdicional(\PhpSigep\Model\ServicoAdicional::SERVICE_REGISTRO);
    // Se não tiver valor declarado informar 0 (zero)
    $servicoAdicional->setCodigoServicoAdicional(\PhpSigep\Model\ServicoAdicional::SERVICE_AVISO_DE_RECEBIMENTO);

    $servicoAdicional2 = new \PhpSigep\Model\ServicoAdicional();
    $servicoAdicional2->setCodigoServicoAdicional(\PhpSigep\Model\ServicoAdicional::SERVICE_REGISTRO);
    $servicoAdicional2->setCodigoServicoAdicional(\PhpSigep\Model\ServicoAdicional::SERVICE_VALOR_DECLARADO_PAC);
    $servicoAdicional2->setValorDeclarado(100);

    $encomenda = new \PhpSigep\Model\ObjetoPostal();
    $encomenda->setServicosAdicionais(array($servicoAdicional, $servicoAdicional2));
    $encomenda->setDestinatario($destinatario);
    $encomenda->setDestino($destino);
    $encomenda->setDimensao($dimensao);
    $encomenda->setEtiqueta($etiqueta);
    $encomenda->setPeso(0.500);// 500 gramas
    $encomenda->setObservacao('Lorem ipsum dolor sit amet.');
    $encomenda->setServicoDePostagem(new \PhpSigep\Model\ServicoDePostagem(\PhpSigep\Model\ServicoDePostagem::SERVICE_PAC_41068));
// ***  FIM DOS DADOS DA ENCOMENDA QUE SERÁ DESPACHADA *** //
gustavovendramini commented 3 years ago

@relpcam eu uso serviço adicional com valor declarado sem problemas. Observei algo que parece errado no seu código, você chama o método setCodigoServicoAdicional duas vezes para cada objeto


// SERVICE_REGISTRO não terá efeito pois está sendo substituído por SERVICE_AVISO_DE_RECEBIMENTO
$servicoAdicional->setCodigoServicoAdicional(\PhpSigep\Model\ServicoAdicional::SERVICE_REGISTRO);
$servicoAdicional->setCodigoServicoAdicional(\PhpSigep\Model\ServicoAdicional::SERVICE_AVISO_DE_RECEBIMENTO);

// SERVICE_REGISTRO não terá efeito pois está sendo substituído por SERVICE_VALOR_DECLARADO_PAC
$servicoAdicional2->setCodigoServicoAdicional(\PhpSigep\Model\ServicoAdicional::SERVICE_REGISTRO);
$servicoAdicional2->setCodigoServicoAdicional(\PhpSigep\Model\ServicoAdicional::SERVICE_VALOR_DECLARADO_PAC);

E segundo o Manual_de_Implementacao_do_Web_Service_SIGEP_WEB Revisão 04/09/2020 página 44, o serviço de registro é obrigatório para a maioria dos envios, logo acredito que o problema talvez seja esse, vc nao está passando o SERVICE_REGISTRO

Exemplo que funciona aqui:

        $srvAdcionalRegistro = new ServicoAdicional();
        $srvAdcionalRegistro->setCodigoServicoAdicional(ServicoAdicional::SERVICE_REGISTRO);

        $codigoValorDec = $tipofrete == 'PAC' ? ServicoAdicional::SERVICE_VALOR_DECLARADO_PAC : ServicoAdicional::SERVICE_VALOR_DECLARADO_SEDEX;
        $srvAdicionalValorDec = new ServicoAdicional();
        $srvAdicionalValorDec->setCodigoServicoAdicional($codigoValorDec);
        $srvAdicionalValorDec->setValorDeclarado($valorDeclarado);

        $encomenda = new ObjetoPostal();
        $encomenda->setServicosAdicionais([$srvAdcionalRegistro, $srvAdicionalValorDec]);
relpcam commented 3 years ago

@gustavovendramini

Eu to achando muito estranho, utilizei o mesmo código que você publicou e acontece o mesmo erro ao fechar a PLP.

O problema acontece sempre quando eu passo um valor diferente de 0 no método setValorDeclarado();

PhpSigep\Services\Result Object
(
    [isSoapFault:protected] => 1
    [errorCode:protected] => 0
    [errorMsg:protected] => Ocorreu um erro ao interpretar os dados do XML gerado pelo Cliente. 

    [result:protected] => 
    [soapFault:protected] => 
    [_failIfAtributeNotExiste:protected] => 1
)
gustavovendramini commented 3 years ago

@relpcam estranho mesmo. Tente debugar, imprima o conteúdo da variável $xml (dump, var_dump, print_r, ...) do arquivo vendor/stavarengo/php-sigep/src/PhpSigep/Services/Real/FecharPreListaDePostagem.php antes de definir o $soapArgs E verifique se não tem algum caracter special quebrando o XML.

No mais não tenho ideia do que pode ser.

relpcam commented 3 years ago

@gustavovendramini eu percebi que se eu passar mais de 2 serviços adicional dá erro

Se eu passar:

SERVICE_REGISTRO
SERVICE_AVISO_DE_RECEBIMENTO
SERVICE_MAO_PROPRIA

aparece:

PhpSigep\Services\Result Object
(
    [isSoapFault:protected] => 1
    [errorCode:protected] => 0
    [errorMsg:protected] => Ocorreu um erro ao interpretar os dados do XML gerado pelo Cliente. 

    [result:protected] => 
    [soapFault:protected] => 
    [_failIfAtributeNotExiste:protected] => 1
)

Eu estou tentando até agora descobrir o motivo desse erro.

stale[bot] commented 3 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 3 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.