[nfephp] Exemplo em php para geração de ID da NFE.

1,897 views
Skip to first unread message

Leonardo Queiroga

unread,
May 11, 2010, 11:18:37 AM5/11/10
to NFePHP
Olá amigos, gostaria de saber se alguém tem implementada no sistema, a
geração da chave de 44 digitos que é o id da nfe, e se tivesse, se
poderia disponibilizar, pois estou tendo bastante dificuldades com a
geração do cDV e o número anterior a ele.

Grato desde já,
Leonardo.

--
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
-------
FAQ: https://www.assembla.com/wiki/show/nfephp/FAQ
Como Participar: https://www.assembla.com/wiki/show/nfephp/Como_participar

Fernando Mertins

unread,
May 11, 2010, 1:12:08 PM5/11/10
to nfe...@googlegroups.com
Olá, segue duas funções de exemplo para te ajudar. Sobre o número aleatório antes do dígito verificador, você deve gera-lo sempre que gera a NF-e, por exemplo, eu uso assim:

$cNF = mt_rand(100000000, 999999999);

Segue as duas funções:

   private function calculaDV($chave43) {
      $multiplicadores = array(2,3,4,5,6,7,8,9);
      $i = 42;
      while ($i >= 0) {
         for ($m=0; $m<count($multiplicadores) && $i>=0; $m++) {
            $soma_ponderada+= $chave43[$i] * $multiplicadores[$m];
            $i--;
         }
      }
      $resto = $soma_ponderada % 11;
      if ($resto == '0' || $resto == '1') {
         $cDV = 0;
      } else {
         $cDV = 11 - $resto;
      }
      return $cDV;
   }
  
   private function calculaChaveAcesso($cUF, $dEmi, $CNPJ, $mod, $serie, $nNF, $cNF) {
      // 02 - cUF  - código da UF do emitente do Documento Fiscal
      $chave = sprintf("%02d", $cUF);

      // 04 - AAMM - Ano e Mes de emissão da NF-e
      $chave.= sprintf("%04d", substr($dEmi, 2, 2).substr($dEmi, 5, 2));

      // 14 - CNPJ - CNPJ do emitente
      $chave.= sprintf("%014s", $CNPJ);

      // 02 - mod  - Modelo do Documento Fiscal
      $chave.= sprintf("%02d", $mod);

      // 03 - serie - Série do Documento Fiscal
      $chave.= sprintf("%03d", $serie);

      // 09 - nNF  - Número do Documento Fiscal
      $chave.= sprintf("%09d", $nNF);

      // 09 - cNF  - Código Numérico que compõe a Chave de Acesso
      $chave.= sprintf("%09d", $cNF);

      // 01 - cDV  - Dígito Verificador da Chave de Acesso
      $chave.= $this->calculaDV($chave);

      return $chave;

Roberto Leite Machado

unread,
May 11, 2010, 1:36:57 PM5/11/10
to nfe...@googlegroups.com
Caso for utilizar a versão 2.00 da SEFAZ (será obrigatorio a partir de 01/10) use algo como :

<?

$cv = criaChave2('35','1005','52345732000012','1','234','1');
echo $cv;

//Código da UF     AAMM da emissão    CNPJ do Emitente    Modelo Série Número da NF-e forma de emissao Código Numérico DV
//02                    04                   14              02   03     09               01               08          01

/* tpEmis pode ser
1 – Normal – emissão normal;
2 – Contingência FS – emissão em contingência com impressão do DANFE em Formulário de Segurança;
3 – Contingência SCAN – emissão em contingência no Sistema de Contingência do Ambiente Nacional – SCAN;
4 – Contingência DPEC - emissão em contingência com envio da Declaração Prévia de Emissão em Contingência – DPEC;
5 – Contingência FS-DA - emissão em contingência com impressão do DANFE em Formulário de Segurança para Impressão de Documento Auxiliar de Documento Fiscal Eletrônico (FS-DA).
*/

function criaChave2($cUF,$aamm,$cnpj,$serie,$numero,$tpEmis){
    $rNum = '';
    for( $x=0;$x<8;$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 . $tpEmis . $rNum;
    //         2 + 4 + 14 +2 + 3 + 9 + 9 = 43  
    $chave = $chave . calcDV($chave);
    return $chave;
   
}

function calcDV($chave){
    $n = strlen($chave);
    //             4 4 4 4 3 3 3 3 3 3 3 3 3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0
    //               3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1
    $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){
        echo "Erro na chave";
        return '';
    }
    $aChave = str_split($chave);
    $soma = 0;
    for($x=$n;$x>0;$x--){
        $soma += $aPeso[$x] * $aChave[$x];
    }
    $resto = $soma%11;
    if ($resto == 0 || $resto == 1){
        $dv = 0;
    } else {
        $dv = 11-$resto;
    }
    return $dv;
}

?>

Paulo Hinkel

unread,
May 19, 2010, 8:28:55 AM5/19/10
to nfe...@googlegroups.com
Olá Roberto, 

Testei essa função para gerar o Chave e o calcDV. 
E deu: Erro na chave.
Testei criaChave2(35,1005,52345732000012,1,234,1);

Por quê acontece isso, ta certa a função?

Thanks..
--
↓ Paulo Яicardo Hiиkel
↓ Twitter: http://twitter.com/pagainst
↓ Blog Profissional: http://paulonoia.wordpress.com/  
↓ Diversão: http://coceirinha.wordpress.com/  
↓ Fotos: http://www.fotolog.com.br/against

Leandro Sprenger

unread,
May 19, 2010, 8:47:57 AM5/19/10
to nfe...@googlegroups.com
Bom dia,

Também estou com esse problema e o meu cálculo é igual a esse.


--
Att,
Leandro Cassel Sprenger

Paulo Hinkel

unread,
May 19, 2010, 10:21:51 AM5/19/10
to nfe...@googlegroups.com
Entendi agora,
na chave ja contem o DV, para pegar esse número, basta usar: substr($cNF, -1).

// B03 - código numérico que compõe a chave de acesso;
$cNF = GeraXML::criaChave2($cUF, date('ym'), '52345732000012', 1, '00000176', 1); 
// B23 - dígito verificador da chave de acesso $cDV = substr($cNF, -1);

Leandro Sprenger

unread,
May 19, 2010, 12:22:31 PM5/19/10
to nfe...@googlegroups.com
Bom dia,

Alguem conseguiu resolver o problema?


--
Att,
Leandro Cassel Sprenger

Paulo Gabriel

unread,
May 19, 2010, 12:39:08 PM5/19/10
to nfe...@googlegroups.com
Olá Leandro!


A resposta está logo acima, no e-mail anterior enviado pelo Paulo Hinkel.

Leandro Sprenger

unread,
May 19, 2010, 12:54:24 PM5/19/10
to nfe...@googlegroups.com
Buenas,

Não havia me dado conta desse detalhe, mas muito importante.

Grato pela atenção.



--
Att,
Leandro Cassel Sprenger


Reply all
Reply to author
Forward
0 new messages