Clipper On Line • Ver Tópico - Validação de chave da nfe
Mudar para estilo Clássico
Discussão sobre desenvolvimento de software para atender as exigências da legislação fiscal e tributária (ECF, TEF, SINTEGRA, NF-e, ECD, EFD, etc.)
Postar uma resposta

Validação de chave da nfe

16 Abr 2018 15:34

Boa tarde
Alguém tem uma rotina de validação da chave da nfe?

Obrigado
Rubens

Validação de chave da nfe

16 Abr 2018 16:33

Aqui esta

Código:
Function DigitoChave(CodigoChave)
Local indice:= '4329876543298765432987654329876543298765432'
Local digito, nSoma:= 0

   For contador:= 1 To 43
      nSoma+= (Val(SubStr(CodigoChave, contador, 1)) * Val(SubStr(indice, contador, 1)))
   Next

   digito:= (nSoma % 11)
   If digito == 0 .Or. digito == 1
      digito:= 0
   Else
      digito:= (11 - digito)
   EndIf
   If SubStr(CodigoChave, 44, 1) != LTrim(Str(digito, 1))
      Alert('Código da Chave Errado....')
      Return .f.
   EndIf
   Return .t.

Validação de chave da nfe

16 Abr 2018 17:37

Amiguinhos,

rubens
Tire suas conclusões.

Código:
Function ChaveDeAcesso( cCodUF, dEmissao, cCNPJ, nModelo, nSerie, nNumeroNF, nCodigoNumerico )
   // Exemplo da geração: 35 10 03 05103502000152 55 001 000006720 000006720 9
   emissao := DtoS( dEmissao )
   cNFeVersao :=     VerifyINI( "NFELETRONICA", "Versao"  , "2.00", cPathMonitorNFe+"\ACBrNFeMonitor.ini", .f.) // Versao
   cNFEtpEmis   :=     VerifyINI( "NFELETRONICA", "tpEmis"  , "1"   , cPathMonitorNFe+"\ACBrNFeMonitor.ini", .f.) // 1-Normal, 2-Contingencia, 3-SCAN, 4-DPEC, 5-FS-DA
   aNFESerie       := { "001", "900", "910", "920", "930" }
   cNFEserie       := aNFESerie[ val(cNFEtpEmis) ]
   //if nNFEtpAmb = 2
   //   cCNPJ := "99.999.999/0001-91"
   //endif   
   chave := ""
   chave := chave + cCodUF                 // 35
   chave := chave + Substr(Emissao,3,2)    // 2010 dois ultimos digitos do ano
   chave := chave + Substr(Emissao,5,2)    // 03 mes
   chave := chave + LimpaCGC(cCNPJ)        // 05103502000152
   chave := chave + StrZero(nModelo,2,0)   // 55
   chave := chave + cNFEserie              // 001
   chave := chave + StrZero(nNumeroNF,9,0) // 000006720
   //
   chave   := chave + cNFEtpEmis + StrZero(nCodigoNumerico,8,0)
   return chave + DVModulo11(chave,2,9)

Function DVModulo11(cStr,nPeso1,nPeso2)
   local nTot := 0                       
   local nMul := nPeso1                 
   local i                               
   for i := Len(cStr) to 1 step -1
       nTot += Val(SubStr(cStr,i,1)) * nMul
       nMul := if(nMul=nPeso2, nPeso1, nMul+1)
   next
   return if(nTot%11 < 2, "0", Str(11-(nTot%11),1))

Validação de chave da nfe

16 Abr 2018 17:45

Obrigado Daniel...
Era o que eu precisava... na hora de digitar a chave em notas referenciadas, dava sempre um BO porque o cliente jurava de pé junto que tinha digitado exatamente a chave que estava no danfe. Perdi muito tempo indo até o cliente e digitando a chave para ele... Agora se ele não digitar a chave correta nem termina a digitação da nota... Hora que der um tempinho vou criar uma opção de pegar a chave direto do arquivo de compras já vai encurtar muito o tempo do cliente..

Rochinha... valeu também.. hoje eu uso o Acbr para gerar a chave... agora com a sua função vou gera direto no sistema e economizar alguns segundos quando o ACBR empacar... Obrigado tb...

Rochinha e aproveitando, tem como postar essa função Veryini? Em algum no Fórum acho que você já postou ela... mas vamos encurtar o caminho aqui...
Obrigado

Rubens

Validação de chave da nfe

16 Abr 2018 18:50

Amiguinhos,

rubens
Eu gero o meu XML todo na "cutícula", kkkk.

Função VerifyINI() - lembrando que ela usa uma classe do Fivewin.
Código:
function VerifyINI( _section_, _entry_, _var_, _inifile_, _grava_ )
   oIni := TIni():New( _inifile_ )
   if _grava_ = .t.
      oIni:Set( _section_, _entry_, iif( ValType( _var_ )="C", alltrim( _var_ ), _var_ ) )
   endif
   return oIni:Get( _section_, _entry_, _var_, _var_ )


Caso precise de algo que não seja Fivewin, veja em Ler INI dinamico

Validação de chave da nfe

16 Abr 2018 23:22

Só aproveitando, pra pegar cada caractere de trás pra frente....

Código:
  for i := Len(cStr) to 1 step -1
       ... Val(SubStr(cStr,i,1))
next


Código:
FOR EACH cDigito IN cStr DESCEND
   ... Val( cDigito )
NEXT
Postar uma resposta