Skip to content

Commit dfef3a7

Browse files
committed
feat: adiciona suporte a caracteres alfanumericos
1 parent fc8678b commit dfef3a7

1 file changed

Lines changed: 45 additions & 14 deletions

File tree

DFe.Utils/ChaveFiscal.cs

Lines changed: 45 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,16 @@ public class ChaveFiscal
5555
/// <param name="tipoEmissao">Tipo de emissão do DF-e. Informar inteiro conforme consta no manual de orientação do contribuinte para o DF-e</param>
5656
/// <param name="cNf">Código numérico que compõe a Chave de Acesso. Número gerado pelo emitente para cada DF-e</param>
5757
/// <returns>Retorna um objeto <see cref="DadosChaveFiscal"/> com os dados da chave de acesso</returns>
58-
public static DadosChaveFiscal ObterChave(Estado ufEmitente, DateTimeOffset dataEmissao, string cnpjEmitente, ModeloDocumento modelo, int serie, long numero, int tipoEmissao, int cNf)
58+
public static DadosChaveFiscal ObterChave(
59+
Estado ufEmitente,
60+
DateTimeOffset dataEmissao,
61+
string cnpjEmitente,
62+
ModeloDocumento modelo,
63+
int serie,
64+
long numero,
65+
int tipoEmissao,
66+
int cNf
67+
)
5968
{
6069
var chave = new StringBuilder();
6170

@@ -64,14 +73,15 @@ public static DadosChaveFiscal ObterChave(Estado ufEmitente, DateTimeOffset data
6473
cnpjEmitente = cnpjEmitente.PadLeft(14, '0');
6574
}
6675

67-
chave.Append(((int)ufEmitente).ToString("D2"))
68-
.Append(dataEmissao.ToString("yyMM"))
69-
.Append(cnpjEmitente)
70-
.Append(((int)modelo).ToString("D2"))
71-
.Append(serie.ToString("D3"))
72-
.Append(numero.ToString("D9"))
73-
.Append(tipoEmissao.ToString())
74-
.Append(cNf.ToString("D8"));
76+
chave
77+
.Append(((int)ufEmitente).ToString("D2"))
78+
.Append(dataEmissao.ToString("yyMM"))
79+
.Append(cnpjEmitente)
80+
.Append(((int)modelo).ToString("D2"))
81+
.Append(serie.ToString("D3"))
82+
.Append(numero.ToString("D9"))
83+
.Append(tipoEmissao.ToString())
84+
.Append(cNf.ToString("D8"));
7585

7686
var digitoVerificador = ObterDigitoVerificador(chave.ToString());
7787

@@ -95,8 +105,8 @@ private static string ObterDigitoVerificador(string chave)
95105
//percorrendo cada caractere da chave da direita para esquerda para fazer os cálculos com o peso
96106
for (var i = chave.Length - 1; i != -1; i--)
97107
{
98-
var ch = Convert.ToInt32(chave[i].ToString());
99-
soma += ch*peso;
108+
var valorCaractere = ObterValorDoCaractere(chave[i]);
109+
soma += valorCaractere * peso;
100110
//sempre que for 9 voltamos o peso a 2
101111
if (peso < 9)
102112
peso += 1;
@@ -105,7 +115,7 @@ private static string ObterDigitoVerificador(string chave)
105115
}
106116

107117
//Agora que tenho a soma vamos pegar o resto da divisão por 11
108-
mod = soma%11;
118+
mod = soma % 11;
109119
//Aqui temos uma regrinha, se o resto da divisão for 0 ou 1 então o dv vai ser 0
110120
if (mod == 0 || mod == 1)
111121
dv = 0;
@@ -115,6 +125,18 @@ private static string ObterDigitoVerificador(string chave)
115125
return dv.ToString();
116126
}
117127

128+
/// <summary>
129+
/// Obtem o valor de um caractere
130+
/// </summary>
131+
/// <param name="caractere"></param>
132+
/// <returns></returns>
133+
private static int ObterValorDoCaractere(char caractere)
134+
{
135+
const int zeroASCII = 48;
136+
var valor = caractere - zeroASCII;
137+
return valor;
138+
}
139+
118140
/// <summary>
119141
/// Informa se a chave de um DF-e é válida
120142
/// </summary>
@@ -140,7 +162,16 @@ public static bool ChaveValida(string chaveNfe)
140162
var codigoNumerico = int.Parse(chaveNfe.Substring(35, 8));
141163
var digitoVerificador = chaveNfe.Substring(43, 1);
142164

143-
var gerarChave = ObterChave(codigo, anoEMesData, cnpj, modelo, serie, numeroNfe, formaEmissao, codigoNumerico);
165+
var gerarChave = ObterChave(
166+
codigo,
167+
anoEMesData,
168+
cnpj,
169+
modelo,
170+
serie,
171+
numeroNfe,
172+
formaEmissao,
173+
codigoNumerico
174+
);
144175

145176
return digitoVerificador.Equals(gerarChave.DigitoVerificador.ToString());
146177
}
@@ -167,4 +198,4 @@ public DadosChaveFiscal(string chave, byte digitoVerificador)
167198
/// </summary>
168199
public byte DigitoVerificador { get; private set; }
169200
}
170-
}
201+
}

0 commit comments

Comments
 (0)