<?php
require_once "vendor/autoload.php";
use NFePHP\NFe\Tools;
use NFePHP\Common\Certificate;
use NFePHP\NFe\Common\Standardize;
use NFePHP\NFe\Complements;
$dados = file_get_contents("php://input");
$teste =$dados;
//file_put_contents('teste.json',$teste);
$dados_empresa = json_decode($dados);
$config = [
"atualizacao"=>date('Y-m-d h:i:s'),
"tpAmb"=> 1,
"razaosocial" => $dados_empresa->razao,
"cnpj" => $dados_empresa->cnpj, // PRECISA SER VÁLIDO
"ie" => $dados_empresa->inscricao_estadual, // PRECISA SER VÁLIDO
"siglaUF" => $dados_empresa->uf,
"schemes" => "PL_009_V4",
"versao" => '4.00',
"tokenIBPT" => "AAAAAAA",
"CSC" => "GPB0JBWLUR6HWFTVEAS6RJ69GPCROFPBBB8G",
"CSCid" => "000003",
"aProxyConf" => [
"proxyIp" => "",
"proxyPort" => "",
"proxyUser" => "",
"proxyPass" => "",
]
];
$senha_certificado =$dados_empresa->senha;
$configJson = json_encode($config);
$certificadoDigital= $dados_empresa->certificado;
$arrContextOptions=array(
"ssl"=>array(
"verify_peer"=>false,
"verify_peer_name"=>false,
),
);
///$certificadoDigital = file_get_contents($certificadoDigital,$arrContextOptions);.
try{
$certificadoDigital = file_get_contents($certificadoDigital,false, stream_context_create($arrContextOptions));
}catch(Exception $e){
$erro.= 'empresa não possui certificado '.$e->getMessage();
}
//este serviço somente opera em ambiente de produção
//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 = $dados_empresa->ultimo_nsu;
//file_put_contents('nsu.txt',$ultNSU);
$maxNSU = $ultNSU;
$loopLimit = 20; //mantenha o numero de consultas abaixo de 20, cada consulta retorna até 50 documentos por vez
$iCount = 0;
$todos_nsu=0;
try {
//echo 'aqui';
$certificate = NFePHP\Common\Certificate::readPfx($certificadoDigital, $senha_certificado);
//$soap = new SoapCurl($certificate);
//$soap->httpVersion('1.1');
$tools = new NFePHP\NFe\Tools($configJson, $certificate);
//$tools->loadSoapClass($soap);
//só funciona para o modelo 55
$tools->model('55');
//este serviço somente opera em ambiente de produção
$tools->setEnvironment(1);
$i=0;
$nfe_distribuida = [];
$registros=false;
while ($ultNSU <= $maxNSU) {
$iCount++;
if ($iCount >= $loopLimit) {
$iCount.'LIMITE';
//o limite de loops foi atingido pare de consultar
break;
}
try {
//executa a busca pelos documentos
$resp = $tools->sefazDistDFe($ultNSU);
// print_r($resp);
} catch (\Exception $e) {
echo 'Algo deu errado';
echo $e->getMessage();
//pare de consultar e resolva o erro (pode ser que a SEFAZ esteja fora do ar)
break;
}
//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;
file_put_contents('max.txt',$maxNSU);
$lote = $node->getElementsByTagName('loteDistDFeInt')->item(0);
if (in_array($cStat, ['137', '656'])){
if($registros ==false){
echo 'Consultar após uma hora-'.$cStat;
}
//137 - Nenhum documento localizado, a SEFAZ está te informando para consultar novamente após uma hora a contar desse momento
//656 - Consumo Indevido, a SEFAZ bloqueou o seu acesso por uma hora pois as regras de consultas não foram observadas
//nesses dois casos pare as consultas imediatamente e retome apenas daqui a uma hora, pelo menos !!
break;
}
if (empty($lote)) {
//lote vazio
continue;
}
//essas tags irão conter os documentos zipados
$docs = $lote->getElementsByTagName('docZip');
foreach ($docs as $doc) {
$i++;
$numnsu = $doc->getAttribute('NSU');
$schema = $doc->getAttribute('schema');
//descompacta o documento e recupera o XML original
$content = gzdecode(base64_decode($doc->nodeValue));
$st = new Standardize($content);
$std_class = $st->toStd();
///AQUI PEGO APENAS CABEÇALHOS DE NFE
if(
isset($std_class->chNFe) and
isset($std_class->CNPJ) and
isset($std_class->xNome) and
isset($std_class->dhEmi) and
isset($std_class->tpNF) and
isset($std_class->vNF) and
isset($std_class->cSitNFe)
){
$registros = true;
$nfe_distribuida[]=[
'chave'=>$std_class->chNFe,
'cnpj'=>$std_class->CNPJ,
'nome'=>$std_class->xNome,
'data_emissao'=>$std_class->dhEmi,
'tipo_nfe'=>$std_class->tpNF,
'valor'=>$std_class->vNF,
'situacao'=>$std_class->cSitNFe,
'numero_nsu'=>$ultNSU,
];
}
$caminho='tmp_xml/nfe'.$i.'.xml';
file_put_contents($caminho,$content);
$todos_nsu=$todos_nsu.$maxNSU.'---'.$ultNSU."\n";
//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
}
file_put_contents('todos.txt',$todos_nsu);
if ($ultNSU == $maxNSU) {
//quando o numero máximo de NSU foi atingido não existem mais dados a buscar
//nesse caso a proxima busca deve ser no minimo após mais uma hora
break;
}
sleep(2);
}
echo $nfe_distribuida = json_encode($nfe_distribuida);
file_put_contents('consulta_dis.json',$nfe_distribuida);
} catch (\Exception $e) {
echo str_replace("\n", "<br/>", $e->getMessage());
}