Distribuição de documentos fiscais - DistDFe

630 views
Skip to first unread message

ricardo fernandes

unread,
Oct 1, 2018, 7:22:17 AM10/1/18
to NFePHP
Bom dia Pessoal,

Conheci a Api faz pouco tempo e agora estou implementando ela no meu sistema, agora estou  pegando os documentos emitidas contra o CNPJ do solicitante.

No caso estou com duvida referente a documentação, o codigo da documentação diz que a variavel $response no exemplo conterá a xml.

Mas quando eu utilizo a xml, a informação que eu obtenho é  diferente.


O código está conforme está assim: 

use NFePHP\NFe\Tools;
use NFePHP\Common\Certificate;

$tools = new Tools($configJson, Certificate::readPfx($pfxcontent, $password));

//só funciona para o modelo 55
$tools->model('55');
//este serviço somente opera em ambiente de produção
$tools->setEnvironment(1);

//este numero deverá vir do banco de dados nas proximas buscas para reduzir
//a quantidade de documentos, e para não baixar várias vezes as mesmas coisas.
$ultNSU = 0;
$maxNSU = $ultNSU;
$loopLimit = 50;
$iCount = 0;

//executa a busca de DFe em loop
while ($ultNSU <= $maxNSU) {
    $iCount++;
    if ($iCount >= $loopLimit) {
        break;
    }
    try {
        //executa a busca pelos documentos
        $resp = $tools->sefazDistDFe($ultNSU);
    } catch (\Exception $e) {
        echo $e->getMessage();
        //tratar o erro
    }
 
    //extrair e salvar os retornos
    $dom = new \DOMDocument();
    $dom->loadXML($resp);
    $node = $dom->getElementsByTagName('retDistDFeInt')->item(0);
    $tpAmb = $node->getElementsByTagName('tpAmb')->item(0)->nodeValue;
    $verAplic = $node->getElementsByTagName('verAplic')->item(0)->nodeValue;
    $cStat = $node->getElementsByTagName('cStat')->item(0)->nodeValue;
    $xMotivo = $node->getElementsByTagName('xMotivo')->item(0)->nodeValue;
    $dhResp = $node->getElementsByTagName('dhResp')->item(0)->nodeValue;
    $ultNSU = $node->getElementsByTagName('ultNSU')->item(0)->nodeValue;
    $maxNSU = $node->getElementsByTagName('maxNSU')->item(0)->nodeValue;
    $lote = $node->getElementsByTagName('loteDistDFeInt')->item(0);
    if (empty($lote)) {
        //lote vazio
        continue;
    }
    //essas tags irão conter os documentos zipados
    $docs = $lote->getElementsByTagName('docZip');
    foreach ($docs as $doc) {
        $numnsu = $doc->getAttribute('NSU');
        $schema = $doc->getAttribute('schema');
        //descompacta o documento e recupera o XML original
        $content = gzdecode(base64_decode($doc->nodeValue));
        //identifica o tipo de documento
        $tipo = substr($schema, 0, 6);
        //processar o conteudo do NSU, da forma que melhor lhe interessar
        //esse processamento depende do seu aplicativo
    }
    sleep(2);
}

$echo $resp
;


Seria assim a forma correta de utilizar?

Fernando Mertins

unread,
Oct 2, 2018, 5:31:44 PM10/2/18
to nfe...@googlegroups.com
Oi Ricardo, alguns tópicos para tentar ajudar:

1) Logo no início, o webservice de DF-e funciona em ambiente 2-homolog certinho, pode testar.

2) Após obter o XML de retorno do método sefazDistDFe(), use a classe Standardize, exemplo:

$retXml = $this->tools->sefazDistDFe($ultNSU, $NSU);
$std = new Standardize($retXml);
$retws = $std->toArray();

Assim você tem um array com as informações de retorno, fica fácil de utiliza-las no teu código.

3) Veja que o método sefazDistDFe() tem dois parâmetros, provavelmente terá que usar ambos para controlar as consultas, veja na documentação da Nota Técnica 2014/002.

4) Eu tenho uma anotação própria de agosto assim:

// TODO 02/08/18: bloco implementação manual pois a classe Standardize da API NFePHP está com bug no doczip, não monta na estrutura os dois atributos B12-NSU e B13-schema.

Exemplo parcial do meu código onde tive que processar manualmente o ZIP devido ao aparente bug na API que acho que ainda não foi corrigido:

        // Se existir, itera sobre as N ocorrência do elemento "B11_docZip".
        if (isset($retws['loteDistDFeInt'])) {
            {
                // TODO 02/08/18: bloco implementação manual pois a classe Standardize da API NFePHP está com bug no doczip, não monta na estrutura os dois atributos B12-NSU e B13-schema.
                $meuxml = $retXml;
                $meuxml = substr($meuxml, stripos($meuxml, '<retDistDFeInt'));
                $meuxml = substr($meuxml, 0, stripos($meuxml, '</retDistDFeInt>') + 16);
                libxml_use_internal_errors(true);

                if (!$simpleXml = simplexml_load_string($meuxml)) {
                    throw new Exception('Falhou load simplexml string');
                }
            }

            foreach ($simpleXml->loteDistDFeInt[0] as $B11_docZip) {
                if ($logAviso = $this->didrModel->mapXml($simpleXml, $B11_docZip, $this->didfModel->getIdDistribuicaoDfe())) {
                    Log::aviso($logAviso);
                }

                $this->didrModel->insere();
            }
        }



--
--
Você recebeu esta mensagem porque está inscrito no Grupo "NFePHP".
Para Postar: nfe...@googlegroups.com
Para Sair do Grupo: nfephp+un...@googlegroups.com
Link: http://groups.google.com.br/group/nfephp?hl=pt-BR
-------
Repositórios: https://github.com/nfephp-org
---
Você recebeu essa mensagem porque está inscrito no grupo "NFePHP" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para nfephp+un...@googlegroups.com.
Para mais opções, acesse https://groups.google.com/d/optout.

Harisson Matos

unread,
Oct 5, 2018, 8:43:21 AM10/5/18
to nfe...@googlegroups.com
Bom dia Fernando,

quanto ao bug na class Standardize, pode usar a função simpleXml da class, que foi implementada a alguns meses, ela te retornará o resultado da função simplexml_load_string após validação.

$stand = new Standardize($xml);
$sxml = $stand->simpleXml();

--
Harisson Matos
Automação Comercial / Tecnologia da Informação

Celular e Whatsapp: (33) 98441-6119
____________________________________________________

Telefone: +55 (32) 3746-1140 / (32) 3746-1470

Fernando Mertins

unread,
Oct 5, 2018, 9:06:30 AM10/5/18
to nfe...@googlegroups.com
Bom dia, lembro que na ocasião fiz várias tentativas e acabei desistindo, acho que fiquei umas 2-3 horas... :-)
Obrigado vou tentar desta forma, abraços.

Fernando Mertins

unread,
Oct 5, 2018, 9:07:47 AM10/5/18
to nfe...@googlegroups.com
Ah lembrei melhor agora, a bronca era nos atributos né?

Harisson Matos

unread,
Oct 5, 2018, 9:16:34 AM10/5/18
to nfe...@googlegroups.com
Sim,

Eu uso assim:

$docZip = $sxml->loteDistDFeInt->docZip;
foreach ($docZip as $doc) {
    $docZipAttributes = $doc->attributes();
     $schema = $docZipAttributes->schema;
    //..
}
Reply all
Reply to author
Forward
0 new messages