Groups keyboard shortcuts have been updated
Dismiss
See shortcuts

Como organizar o BD

143 views
Skip to first unread message

Roberto Ribeiro

unread,
Dec 31, 2024, 8:39:55 AM12/31/24
to NFePHP
Bom dia gente, estou com duvidas sobre a organização do banco de dados. 
Vi que será necessário obter o resumo e eventos pra fazer determinadas ações.

Estou iniciando nesse nicho, peço compreensão.

Vocês tem alguma recomendação, se devo trabalhar com uma tabela pra cada ou se tem um jeito melhor, tipo, Uma tabela pra resumo, outra pra eventos e outra pra Notas completas?

Vinicius Barreira

unread,
Dec 31, 2024, 8:49:06 AM12/31/24
to nfe...@googlegroups.com
Eu gosto de trabalhar com tabelas espelho dos documentos fiscais; independente dos dados gerenciais, eu crio tabelas com a cópia literal dos dados que vão nos documentos fiscais. Na prática, isso tem se demonstrado ser bastante útil; faço o seguinte:

1) leio os dados gerenciais;
2) crio os dados nas tabelas espelhos correspondentes.
3) emito os documentos fiscais a partir das tabelas espelho.

Se tem alguma rejeição, ajusto nos dados gerenciais, repopulo as tabelas espelho e re-emito os documentos fiscais a partir das tabelas espelho.

No seu caso seriam tabelas espelho para cada contexto.

Vinicius Barreira
(11) 9 8269 4570

--
--
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
---
You received this message because you are subscribed to the Google Groups "NFePHP" group.
To unsubscribe from this group and stop receiving emails from it, send an email to nfephp+un...@googlegroups.com.
To view this discussion visit https://groups.google.com/d/msgid/nfephp/d59ef584-e9ea-4415-a04e-b7520ec8cec3n%40googlegroups.com.

Roberto Ribeiro

unread,
Dec 31, 2024, 10:10:42 AM12/31/24
to NFePHP
Entendi Vini, muito obrigado pela explicação, vou verificar aqui sobre essa metodologia.

Mardel Cardoso

unread,
Jan 3, 2025, 4:06:27 PMJan 3
to nfe...@googlegroups.com
Boa tarde,

Estou recebendo hoje mensagens de erro SOAP de todos os servidores do SEFAZ: SP, MG, RJ, MS...para emissão de NFCe em produção.O mesmo acontece com NFe.

Alguém sabe se entrou alguma nova regra sefaz que iniciou hoje?


Fagner Santana

unread,
Jan 3, 2025, 4:10:03 PMJan 3
to NFePHP
Aqui pra mim tudo normal. São Paulo, Paraná, Brasilia, Rio de Janeiro,  Ceará etc.
 NFe

Roberto Machado

unread,
Jan 3, 2025, 4:17:29 PMJan 3
to nfe...@googlegroups.com
Tudo normal por aqui (brasil inteiro)

Roberto

Roberto Ribeiro

unread,
Jan 3, 2025, 8:08:58 PMJan 3
to NFePHP
Boa noite, por favor, me tirem uma dúvida sobre uma informação na api sped-nfe
nesse link https://github.com/nfephp-org/sped-nfe/blob/master/docs/metodos/DistDFe.md
estão disponíveis dois exemplos, um de ENVIO e RETORNO, ao que se refere o ENVIO? para o que serve exatamente?

estevo cys

unread,
Jan 3, 2025, 8:20:35 PMJan 3
to nfe...@googlegroups.com

https://chatgpt.com/share/67788ca9-2864-8012-bc8c-14397eb7b17a


--
--
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
---
You received this message because you are subscribed to the Google Groups "NFePHP" group.
To unsubscribe from this group and stop receiving emails from it, send an email to nfephp+un...@googlegroups.com.

Fagner Santana

unread,
Jan 5, 2025, 9:31:48 AMJan 5
to NFePHP
Com o uso da classe para de distribuição a Classe monta um XML igual o do exemplo e envia pro sefaz. Obviamente como vc está usando uma classe orientada a objetos você não vê esse xml, pois está algumas camadas abaixo da instancia da classe;

Já o retorno vc recebe no retorno da execução da classe e com isso vc utilizar os metodos para descompactar os ZIPs e extrair os XML. 

Fagner Santana

unread,
Jan 5, 2025, 9:38:07 AMJan 5
to NFePHP
<?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());
}

On Friday, January 3, 2025 at 10:08:58 PM UTC-3 drg9...@gmail.com wrote:

Roberto Ribeiro

unread,
Jan 5, 2025, 12:11:33 PMJan 5
to NFePHP
Muito obrigado pelas explicações, vai ser muito útil. 
Entendi, esse envio é feito pelo método de consulta. Perfeito.
Reply all
Reply to author
Forward
0 new messages