Notifications
Clear all

NFe - Chave de Acesso

3 Posts
1 Usuários
0 Reactions
7,201 Visualizações
(@fernandofernandes)
Posts: 43750
Illustrious Member
Topic starter
 

A partir da versão 2.00 do leiaute da NF-e, o campo tpEmis (forma de emissão da NFe) passou a compor a chave de acesso da seguinte forma:

O tamanho do campo cNF - código numérico da NF-e foi reduzido para oito posições para não alterar o tamanho da chave de acesso da NF-e de 44 posições que passa ser composta pelos seguintes campos que se encontram dispersos na NF-e :

• cUF - Código da UF do emitente do Documento Fiscal
• AAMM - Ano e Mês de emissão da NF-e
• CNPJ - CNPJ do emitente
• mod - Modelo do Documento Fiscal
• serie - Série do Documento Fiscal
• nNF - Número do Documento Fiscal
• tpEmis – forma de emissão da NF-e
• cNF - Código Numérico que compõe a Chave de Acesso
• cDV - Dígito Verificador da Chave de Acesso

O Dígito Verificador (DV) irá garantir a integridade da chave de acesso, protegendo-a principalmente contra digitações erradas.
Eu já postei aqui a função para verificação do DV, agora vou postar a função que cria a chave de acesso, lembrando que a chave de acesso é obrigatória para o schema XML.

'---------------------------------------------------------------------
' Procedure  : ChaveAcessoNFe
' Data       : 08/02/2010
' Programador: Rodrigo de Oliveira
' Contato    : thabis.wired@hotmail.com
' Descrição  : Retorna a chave de Acesso da NFe
'---------------------------------------------------------------------
'
Public Function GeraChaveAcessoNFe() As Boolean
    Dim Emissao As String
    Dim Chave As String
    Dim mod11 As Byte

    'Prepara a data
    On Error GoTo GeraChaveAcessoNFe_Error

    Emissao = Format(DataEmissao, "dd/mm/yy")
    'Essa parte do código gera o Código Numérico (Aleatório)
    Randomize()
    sCodigoNumerico = zeroEsquerda(CLng(Int((99999999 - 1 + 1) * Rnd + 1)), 8)
    'gera a chave
    Chave = CStr(UF) & Mid(Emissao, 7, 2) & Mid(Emissao, 4, 2) _
            & sCNPJ & zeroEsquerda(sModelo, 2) & zeroEsquerda(sSerie, 3) _
            & zeroEsquerda(sNumeroNF, 9) & sFormaEmissao & sCodigoNumerico
    'calcula DV
    mod11 = calculaDV(Chave)
    'retorna a chave com 44 caracteres
    sChaveAcessoNFe = Chave & mod11
    'retorna o DV separado
    sDV = mod11
    'Retorna que a chave foi gerada com sucesso
    GeraChaveAcessoNFe = True
    Exit Function
GeraChaveAcessoNFe_Error:
    MsgBox("Erro: " & Err.Number & vbNewLine & "Procedure ChaveAcessoNFe localizado em ChaveDV, na linha " & Erl, vbCritical, Err.Source)
    Fun.LogErro(Err.Number, Err.Description, Err.Source, "Procedure GeraChaveAcessoNFe localizado em ChaveDV", Erl)
End Function

Abaixo segue uma função auxiliar que uso para gerar a chave.

'---------------------------------------------------------------------
' Procedure  : zeroEsquerda
' Data       : 08/02/2010
' Programador: Rodrigo de Oliveira
' Contato    : thabis.wired@hotmail.com
' Descrição  : coloca zeros a esquerda do valor passado na variavel        
'              número até ela obter o tamanho passado na variavel Zeros
'---------------------------------------------------------------------
Private Function zeroEsquerda(ByVal Numero As Long, ByVal Zeros As Byte) As String
    Dim i As Byte

    'verifica se o numero é maor que o padrão
    On Error GoTo zeroEsquerda_Error

    If Len(CStr(Numero)) > Zeros Then
        zeroEsquerda = Right(CStr(Numero), 9)
    Else
        zeroEsquerda = Numero
    End If
    'coloca zeros a esquerda
    For i = Len(CStr(Numero)) To Zeros - 1
        zeroEsquerda = "0" & zeroEsquerda
    Next

    Exit Function
zeroEsquerda_Error:
    MsgBox("Erro: " & Err.Number & vbNewLine & "Procedure zeroEsquerda localizado em ChaveDV, na linha " & Erl, vbCritical, Err.Source)
    Fun.LogErro(Err.Number, Err.Description, Err.Source, "Procedure zeroEsquerda localizado em ChaveDV", Erl)
End Function

E é isso com essas duas funções e a função de DV que postei a alguns dias você consegue monta sua chave de acesso para NFe. E o melhor é que a função é valida para VBA e VB6 se necessidade de adaptações. Bem vou ficando por aqui, abraço.

OBS: Lembrando que Fun é uma classe particular que grava log de erro, logo posta sobre ela aqui.

 
Postado : 17/02/2010 7:36 am
(@fernandofernandes)
Posts: 43750
Illustrious Member
Topic starter
 

Rodrigo, em que tipo de aplicação posso usar essas funções ?

 
Postado : 21/02/2010 7:40 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
Topic starter
 

Para o envio da XML validada da NFe, em breve posto mais informações sobre os webservices necessarios e os padrões xml também

 
Postado : 21/02/2010 7:56 pm