STATUS SEFAZ

150 views
Skip to first unread message

Andreus Timm

unread,
Jan 31, 2011, 12:39:47 PM1/31/11
to nfe...@googlegroups.com
Estou com uma pequena dúvida sobre a geração da NFe.
Quando envio recebo este retorno,

array(3) {
  ["status"]=>
  bool(true)
  ["cStat"]=>
  string(3) "103"
  ["xMotivo"]=>
  string(25) "Lote recebido com sucesso"
}

Mas quando vou adicionar o protocolo ele retorna TRUE, dizendo que não deu erro, mas retorna esta mensagem a baixo:

array(3) {
  ["status"]=>
  bool(true)
  ["cStat"]=>
  string(3) "217"
  ["xMotivo"]=>
  string(54) "Rejeição: NF-e não consta na base de dados da SEFAZ"
}

Consigo gerar o PDF normalmente, gostaria de saber se o processo está totalmente correto, alguém saberia me dizer, layout 1.10?


Andreus Timm
andreu...@gmail.com
(14) 9672-7890
(51) 8101-2872

Edwin Schissato

unread,
Jan 31, 2011, 1:01:39 PM1/31/11
to nfe...@googlegroups.com
Boa tarde.

A mensagem que você obtem ao enviar o lote "Lote recebido com sucesso" somente diz que o lote chegou até o sefaz, é necessário você obter o resultado do processamento do lote , utilizando o método dos webservices "NfeRetRecepcao2", aí você vai poder verificar se o lote foi aceito e se cada nota fiscal deste lote foi aceita ou rejeitada.

Depois de obtido o resultado do processamento e verificar que o lote foi aceito, e as notas foram aceitas aí sim você pode imprimir o danfe.

Apesar de você estar conseguindo imprimir o danfe ele não possui o número do protocolo(obtido na consulta ao processamento do lote) portanto acredito que não terá validade alguma.

A ordem das ações basicamente seria:

1 - Gerar xml;
2 - Assinar;
3 - Validar;
4 - Enviar Lote;
5 - Consultar processamento do Lote;
6 - (se nota aprovada e desejar) Cancelar NFe ou (se nota não aprovada e desejar) Inutilizar número;
7 - Imprimir danfe.

Atenciosamente, Edwin Schissato.


Andreus Timm

unread,
Jan 31, 2011, 1:31:00 PM1/31/11
to nfe...@googlegroups.com
Apenas o item 5 que não estou verificando.
Pois não existe métodos para isso na NFePHP, na versão Versão atual v1.0 ( beta ) que consta no site para download.

Passando um feedback do projeto encontrei uma certa dificuldade para esse passo a passo, pois na documentação vai apenas até a parte que assina e envia, tive que ler os comentários do fonte e o fonte mesmo para tentar entender o processo.

Onde encontro este método NfeRetRecepcao2 ?



Andreus Timm
andreu...@gmail.com
(14) 9672-7890
(51) 8101-2872


Edwin Schissato

unread,
Jan 31, 2011, 2:26:56 PM1/31/11
to nfe...@googlegroups.com
Realmente pelo que percebi o projeto ainda não tem documentação, tendo como vc disse , estudar o código mesmo.

O método que eu me referi "NfeRetRecepcao2" é o nome do método nos webservices.

A função para obter o retorno do lote na versão 1.0 é a "getProtocol" e para obter o status de cada NFe processada é a função "getNFeProtocol"

Porém no xml retornado na consulta ao webservice feito na função "getProtocol" já retorna os resultados do precessamento de cada nota na tag <protNFe>.

Guilherme Calabria Filho

unread,
Jan 31, 2011, 6:31:00 PM1/31/11
to nfe...@googlegroups.com
Eu tive esse problema...
Minha resolução foi assim:

$retorno = $nfe->sendLot($arquivo,$numerolote);

e para pegar o retorno eu faço assim:
$infoNfe = $nfe->getNFeProtocol($notafiscal);

 assim ele retorna o protocolo normal

$infoNfe = $nfe->getProtocol($numerolote);

assim dava esse erro... verifica se sua nota esta sendo enviada corretamente (pega o código  dela e vai no site da nfe)...
se vcs resolverem por aqui getProtocol($numerolote); me passem como!

vlw!

Thiago Silva Rente

unread,
Jan 31, 2011, 6:39:38 PM1/31/11
to nfe...@googlegroups.com
Tive esse problema também, na época, estudei o código do getProtocol() e vi que eu conseguia listar nota a nota e pegar o status delas.
Assim que chegar em casa, caso ninguém tenha resolvido eu posto a função aqui para vocês darem uma olhada.

Thiago Rente
Analista Desenvolvedor

Thiago Silva Rente

unread,
Feb 1, 2011, 7:11:19 AM2/1/11
to nfe...@googlegroups.com
Bom gente, segue abaixo minha função do protocolo de lotes, só mudei o nome para eu identificar melhor:
 
public function ver_protocolo_lote(){
   //variavel de retorno do metodo
   $aRet = array('status'=>FALSE,'cStat'=>'','xMotivo'=>'');
   // carga das variaveis da funçao do webservice
   $wsdl = 'NfeRetRecepcao';
   $cabecVer       = $this->aCabec['versao'];
   $cabecXsdfile   = $this->aCabec['xsd'];
   $servURL        = $this->aURL[$wsdl]['URL'];
   $servName       = $this->aURL[$wsdl]['service'];
   $servVer        = $this->aURL[$wsdl]['versao'];
   //monta dados para comunicação SOAP
   $param = array(
    'nfeCabecMsg'=>'<?xml version="1.0" encoding="utf-8"?><cabecMsg versao="' . $cabecVer . '" xmlns="' . $this->URLnfe . '"><versaoDados>' . $servVer . '</versaoDados></cabecMsg>',
    'nfeDadosMsg'=>'<consReciNFe xmlns:xsi="'. $this->URLxsi . '" xmlns:xsd="' . $this->URLxsd . '" versao="' . $servVer . '" xmlns="' . $this->URLnfe . '"><tpAmb>' . $this->tpAmb . '</tpAmb><nRec>' . $this->id_lote . '</nRec></consReciNFe>'
   );
   $retorno = $this->__sendSOAP($param, $servURL, $servName);
   if (is_array($retorno)) {
    //extrair a resposta da matriz e garantir que os dados retornem como UTF-8
    $xmlresp = utf8_encode($retorno[$servName.'Result']);
    if ($xmlresp == ''){
     //houve uma falha na comunicação SOAP
     $aRet['xMotivo']='Houve uma falha na comunicação SOAP!!';
     return $aRet;
    }
    // houve retorno com notas aceitas ou não
    $aRet['status'] = TRUE;
    // tratar dados de retorno
    $doc = new DOMDocument(); //cria objeto DOM
    $doc->formatOutput = false;
    $doc->preserveWhiteSpace = false;
    $doc->loadXML($xmlresp,LIBXML_NOBLANKS | LIBXML_NOEMPTYTAG);
    // status do recebimento ou mensagem de erro
    echo '<br />';
    echo 'cStat => ' . $doc->getElementsByTagName('cStat')->item(0)->nodeValue . '<br />';
    // motivo do status
    echo 'xMotivo => ' . $doc->getElementsByTagName('xMotivo')->item(0)->nodeValue . '<br />';
        
    //salvar o xml retornado do SEFAZ
    $nome = $this->protLotDir. $this->id_lote .'-prot.xml';
    $nome = $doc->save($nome);
    
    //FAZ UMA VARREDURA PELO PROTOCOLO PROCURANDO POR ATÉ 10 NOTAS, QUE É O MÁXIMO DE NOTAS RECOMENDADO PARA ENVIO DE LOTE.
    for($x = 1; $x <= 10; $x++) {
     if(isset($doc->getElementsByTagName('chNFe')->item($x - 1)->nodeValue)) {
      echo '<br />';
      echo '&nbsp;&nbsp;&nbsp;&nbsp;Nota: ' . $doc->getElementsByTagName('chNFe')->item($x - 1)->nodeValue;
      echo '<br />&nbsp;&nbsp;&nbsp;&nbsp;Status: ' . $doc->getElementsByTagName('cStat')->item($x)->nodeValue;
      echo '<br />&nbsp;&nbsp;&nbsp;&nbsp;Motivo: ' . $doc->getElementsByTagName('xMotivo')->item($x)->nodeValue;
      echo '<br />';
     }
    }
    
   }  else {
    $this->errStatus = true;
    $this->errMsg = 'Nao houve retorno do NuSoap!!';
   }
  }
Aquele número de notas fixo eu poderia até mudar, mas de início como eu não sei muito bem tratar xml pelo Dom Document aí eu fiz essa gambi mesmo

Andreus Timm

unread,
Feb 1, 2011, 8:49:47 AM2/1/11
to nfe...@googlegroups.com
Tiago ainda não testei seu método...

os XML de retorno no dir tem retornam isso:

153-rec.xml

<?xml version="1.0" encoding="UTF-8"?>
<retEnviNFe xmlns="http://www.portalfiscal.inf.br/nfe" versao="1.10">
    <tpAmb>2</tpAmb>
    <verAplic>SP_NFE_PL_005e</verAplic>
    <cStat>103</cStat>
    <xMotivo>Lote recebido com sucesso</xMotivo>
    <cUF>35</cUF>
    <infRec>
        <nRec>350000029658990</nRec>
        <dhRecbto>2011-01-31T16:46:10</dhRecbto>
        <tMed>1</tMed>
    </infRec>
</retEnviNFe>

$aRet = $nfe->getNFeProtocol($nfeID); //e o método retorna isso


array(3) {
  ["status"]=>  bool(true)
  ["cStat"]=>   string(3) "103"
  ["xMotivo"]=> string(25) "Lote recebido com sucesso"
}


35110104716427000141550010000430760480948409-prot.xml

<?xml version="1.0" encoding="UTF-8"?>
<retConsSitNFe xmlns="http://www.portalfiscal.inf.br/nfe" versao="1.07">
    <infProt>
        <tpAmb>2</tpAmb>
        <verAplic>SP_NFE_PL_005e</verAplic>
        <cStat>217</cStat>
        <xMotivo>Rejeição: NF-e não consta na base de dados da SEFAZ</xMotivo>
        <cUF>35</cUF>
    </infProt>
</retConsSitNFe>


$prot = $nfe->addProt($nfefile, $protfile);//método para adicionar o protocolo

array(3) {
  ["status"]=>  bool(true)
  ["cStat"]=>   string(3) "217"
  ["xMotivo"]=> string(54) "Rejeição: NF-e não consta na base de dados da SEFAZ"
}

No exemplo que vem com NFePHP ele apenas verifica se tem o arquivo ele cria e já eras...
No método autoAuthNFe() da classe ToolsNFePHP ele apenas verifca;

Se o status é TRUE, dai ele verifica se existe o arquivo *.'-prot.xml' e se o arquivo está no dir Enviadas

Pega o retorno XML que o método addProt retorna e tenta gravar se gravou exclui os arquivos.

Dentro desse método tem 3 status que ele verifica... escrevendo até aqui percebi que deveria fazer a mesma verificação, enviando a NFe para o diretório correspondente. Neste caso reprovada.

Procurando pela palavra denegada no google, descobri este link: http://www.boldcron.com.br/boldcron2/2010/01/22/qual-a-diferenca-de-nota-denegada-e-nota-rejeitada/

Provavelmente estou enviando algum dado errado, agora terei de conferir todos os 525 mil campos :)

Se alguém tiver mais alguma idéia...



Andreus Timm
andreu...@gmail.com
(14) 9672-7890
(51) 8101-2872


Thiago Silva Rente

unread,
Feb 1, 2011, 8:57:15 AM2/1/11
to nfe...@googlegroups.com
Andreus, é sim, o meu foi erro que a assinatura não tava batendo, aí eu arrumei tudo direitinho. Se atente a esta parte do código:
 
//FAZ UMA VARREDURA PELO PROTOCOLO PROCURANDO POR ATÉ 10 NOTAS, QUE É O MÁXIMO DE NOTAS RECOMENDADO PARA ENVIO DE LOTE.
    for($x = 1; $x <= 10; $x++) {
     if(isset($doc->getElementsByTagName('chNFe')->item($x - 1)->nodeValue)) {
      echo '<br />';
      echo '&nbsp;&nbsp;&nbsp;&nbsp;Nota: ' . $doc->getElementsByTagName('chNFe')->item($x - 1)->nodeValue;
      echo '<br />&nbsp;&nbsp;&nbsp;&nbsp;Status: ' . $doc->getElementsByTagName('cStat')->item($x)->nodeValue;
      echo '<br />&nbsp;&nbsp;&nbsp;&nbsp;Motivo: ' . $doc->getElementsByTagName('xMotivo')->item($x)->nodeValue;
      echo '<br />';
     }
 
se vc colocar ela no seu código acho que já dá para ver as notas e o status de cada uma delas no lote

Andreus Timm

unread,
Feb 1, 2011, 11:36:53 AM2/1/11
to nfe...@googlegroups.com
Thiago esse código até funcionaria se no XML a tag <chNFe> viesse preenchida, ela está vindo vázia.
Quando envio pelo programa do SEFAZ ele da a mesma mensagem: Rejeição: NF-e não consta na base de dados da SEFAZ

Será que realmente ele está emitindo a nota?


Andreus Timm
andreu...@gmail.com
(14) 9672-7890
(51) 8101-2872


Thiago Silva Rente

unread,
Feb 1, 2011, 11:39:28 AM2/1/11
to nfe...@googlegroups.com
Então você não inseriu a nota no lote

Edwin Schissato

unread,
Feb 1, 2011, 11:43:04 AM2/1/11
to nfe...@googlegroups.com
 Você está enviando o lote e a nota e não está sendo aceita e quando vc vai colsultar essa nota ela realmente não vai constar no sefaz, o que vc precisa fazer é consultar o processamento do lote e nessa consulta dentro da tag <protNFe> ele retorna o resultado de cada nota.

Em 1 de fevereiro de 2011 14:36, Andreus Timm <andreu...@gmail.com> escreveu:

Andreus Timm

unread,
Feb 1, 2011, 1:34:30 PM2/1/11
to nfe...@googlegroups.com
Estou validando a NFe, pelo software do SEFAZ, site do RS, PHP, valida certo em todos;

Quando chamo o método getNFeProtocol() , alterei a classe para ele me trazer junto o recibo

Daí chamo o método getProtocol($recibo)

E ele me retorna o erro 215

array(3) {
  ["status"]=>    bool(true)
  ["cStat"]=>     string(3) "215"
  ["xMotivo"]=>  string(31) "Rejeição: Falha no schema XML"
}

Alguém já teve este problema ?
Achei essa thread no grupo mas não teve solução: http://groups.google.com/group/nfephp/browse_thread/thread/1a6c9dbdfd87eb39



Andreus Timm
andreu...@gmail.com
(14) 9672-7890
(51) 8101-2872


Andreus Timm

unread,
Feb 1, 2011, 2:23:07 PM2/1/11
to nfe...@googlegroups.com
Agora retornou outro erro: 227 - Rejeição: Erro na Chave de Acesso - Campo ID


Andreus Timm
andreu...@gmail.com
(14) 9672-7890
(51) 8101-2872


Edwin Schissato

unread,
Feb 1, 2011, 2:34:20 PM2/1/11
to nfe...@googlegroups.com
Verifica se o atributo ID que é igual a "nfe" + chave de acesso esta correto, acredito que seja isso.

Verfiique também se a chave de acesso gerada é correta para a versão 2.0 caso esteja usando a NFe 2.0 (houve mudança na chave de acesso da nfe 1.0 para a 2.0).

Andreus Timm

unread,
Feb 2, 2011, 6:06:04 AM2/2/11
to nfe...@googlegroups.com
Estou usando as seguintes funções para a geração do número:
NFePHP 1.b layout 1.10

function criaChave($cUF,$aamm,$cnpj,$serie,$numero) {
   
    $rNum = '';
   
    for ($x = 0; $x < 9; $x++) {
        $rNum .= rand(0,9);
    }
   
    $modelo = '55';
    $serie  = str_pad($serie, 3, "0", STR_PAD_LEFT);
    $numero = str_pad($numero, 9, "0", STR_PAD_LEFT);
    $chave  = $cUF . $aamm . $cnpj . $modelo . $serie . $numero . $rNum;
    $calc   = calcDV($chave);

    if (is_int($calc)) {
        return $chave .= $calc;
    } else {
        return $calc;
    }

}

function calcDV($chave) {

    $n     = strlen($chave);
    $aPeso = array(4,3,2,9,8,7,6,5,4,3,2,9,8,7,6,5,4,3,2,9,8,7,6,5,4,3,2,9,8,7,6,5,4,3,2,9,8,7,6,5,4,3,2);
   
    if ($n != 43){
        return 'Erro na chave comprimento errado!!!';
    }
   
    $aChave = str_split($chave);
    $soma   = 0;
   
    for ($x = 0; $x < $n; $x++) {
    $prod  = $aPeso[$x] * $aChave[$x];
        $soma += $aPeso[$x] * $aChave[$x];
    //echo $aPeso[$x] . ' * ' . $aChave[$x] . ' = ' . $prod .'<BR>';
    }
   
    $resto = $soma % 11;
   
    if ($resto == 0 || $resto == 1) {
        $dv = 0;
    } else {
        $dv = 11 - $resto;
    }

    return $dv;


}






Andreus Timm
andreu...@gmail.com
(14) 9672-7890
(51) 8101-2872


Andreus Timm

unread,
Feb 2, 2011, 8:15:12 AM2/2/11
to nfe...@googlegroups.com
É realmente essa função do calculo da Chave não é para o layout 1.10
Consegui gerar corretamente agora a NFe.
Depois de apanhar que nem cachorro magro...heheheh

"Não ta morto quem peleia!"


Andreus Timm
andreu...@gmail.com
(14) 9672-7890
(51) 8101-2872


Reply all
Reply to author
Forward
0 new messages