robmachado / teste

Exemplo de uso da API NFePHP
27 stars 12 forks source link

break em cStat = 137 - Nenhum documento localizado para o destinatário #10

Open tavinus opened 7 years ago

tavinus commented 7 years ago

Volto a agradecer por ter postado o app teste.

Em alguns testes que eu fiz aqui recentemente, notei o curl pedindo sem parar mesmo para empresas que já tinham as últimas notas. Ainda estou em dúvida se tem algo a ser tunado na lógica de NSU, mas o fato é que coloquei uma checagem pelo cStat = 137 que ocorre quando não tem nada novo e parece estar funcionando bem. Se retorna isso ele salva NSU e quebra o loop.

Fica aqui minha pergunta se isso é o ideal e também se a forma que eu implementei é recomendada.
No arquivo DFe.php, segue a função getNFe inteira:

    public function getNFe($limit = 10, $bIncludeAnomes = false)
    {
        if ($this->ultNSU == $this->maxNSU) {
            $this->maxNSU++;
        }
        if ($limit > 100 || $limit == 0) {
            $limit = 10;
        }
        $numNSU = 0;
        $cnpj = ''; //deixando vazio irá pegar o CNPJ default do config
        $descompactar = true;
        $iCount = 0;
        while ($this->ultNSU < $this->maxNSU) {
            $iCount++;
            if ($iCount > ($limit - 1)) {
                break;
            }
            //limpar a variavel de retorno
            $aResposta = array();
            $this->tools->sefazDistDFe(
                'AN',
                $this->tpAmb,
                $cnpj,
                $this->ultNSU,
                $numNSU,
                $aResposta,
                $descompactar
            );
            //se houve retorno de documentos com cStat = 137 nao tem nada novo
            if ($aResposta['cStat'] == 137) {
                //nenhum documento novo encontrado, salva e sai
                $this->ultNSU = (int) $aResposta['ultNSU'];
                $this->maxNSU = (int) $aResposta['maxNSU'];
                $this->putNSU($this->ultNSU, $this->maxNSU);
                //echo "Nenhum documento localizado, tente mais tarde...".PHP_EOL;
                break;
            }
            //se houve retorno de documentos com cStat = 138 entao prosseguir
            if ($aResposta['cStat'] == 138) {
                //carregar as variaveis de controle com base no retorno da SEFAZ
                $this->ultNSU = (int) $aResposta['ultNSU'];
                $this->maxNSU = (int) $aResposta['maxNSU'];
                $this->putNSU($this->ultNSU, $this->maxNSU);
                $this->zExtractDocs($aResposta['aDoc'], $bIncludeAnomes);
            }
            sleep(5);
        }
    }

Assim não fica martelando o WS à toa.
Porque notei os retornos todos com mesmo numero inicial quando isso estava ocorrendo.
E também notei o status 137 e fui procurar no manual.

Eu ACHO que o certo é salvar o NSU da resposta ali também, mas ainda tenho uma certa dúvida se está correto. Fato que a resposta com cstat=137 também retorna esses valores de ult e maxNSU, então achei certo salvar.

Além disso, em uma instalação que o ambiente de homologação nao tinha nenhuma nota a ser baixada, manteve o NSU=0 e ficou martelando com ele e fui rapidamente bloqueado por 1 hora. Eu tinha feito um teste com 10 iterações somente e fui bloqueado. A mensagem de erro dizia que pedidos seguidos deveriam usar o NSU anterior, pra tentar depois de 1 hora. Tendo o break no cStat-137 também previne esse problema.

Cheers!
Gus

tavinus commented 7 years ago

Olá,
Tenho recebido feedback que nem todas as notas emitidas são recebidas. O código que eu adicionei em teoria não é pra afetar o recebimento, a não ser que eu tenha que sair sem salvar o NSU. Nos meus testes parece que ele salva o mesmo NSU na real.

Mas fora isso você consegue pensar em alguma forma de eu não receber todas as notas? Talvez tenha que processar algum outro numero $aResposta['cStat'] que está passando em branco?

Sinceramente eu não consigo pensar em possíveis motivos pra não receber somente algumas notas (mesmo recebendo a maioria).

Cheers!
Gus

robmachado commented 7 years ago

Apenas no caso de não ter manifestado essas NFe's, se não manifestar (ou a manifestação der erro) não vai receber NUNCA essas NFe's

Roberto

tavinus commented 7 years ago

Pra ser sincero, tá indo tudo automático.
Parece que não está manifestando nenhuma nota, mas recebe QUASE todas. Ao mesmo tempo eu não mudei muita coisa no seu script (uma instalação padrão faz igual). Ou seja, mesmo antes de manifestar ele baixa as notas (e sobe o NSU).
Estou confuso...