diff --git a/DFe.Utils/ChaveFiscal.cs b/DFe.Utils/ChaveFiscal.cs
index f8a20023..139dcaa9 100644
--- a/DFe.Utils/ChaveFiscal.cs
+++ b/DFe.Utils/ChaveFiscal.cs
@@ -26,14 +26,17 @@ public static DadosChaveFiscal ObterChave(Estado ufEmitente, DateTimeOffset data
{
var chave = new StringBuilder();
+ if (cnpjEmitente.Length < 14)
+ cnpjEmitente = cnpjEmitente.PadLeft(14, '0');
+
chave.Append(((int)ufEmitente).ToString("D2"))
- .Append(dataEmissao.ToString("yyMM"))
- .Append(cnpjEmitente)
- .Append(((int)modelo).ToString("D2"))
- .Append(serie.ToString("D3"))
- .Append(numero.ToString("D9"))
- .Append(tipoEmissao.ToString())
- .Append(cNf.ToString("D8"));
+ .Append(dataEmissao.ToString("yyMM"))
+ .Append(cnpjEmitente)
+ .Append(((int)modelo).ToString("D2"))
+ .Append(serie.ToString("D3"))
+ .Append(numero.ToString("D9"))
+ .Append(tipoEmissao.ToString())
+ .Append(cNf.ToString("D8"));
var digitoVerificador = ObterDigitoVerificador(chave.ToString());
@@ -57,8 +60,8 @@ private static string ObterDigitoVerificador(string chave)
//percorrendo cada caractere da chave da direita para esquerda para fazer os cálculos com o peso
for (var i = chave.Length - 1; i != -1; i--)
{
- var ch = Convert.ToInt32(chave[i].ToString());
- soma += ch*peso;
+ var valorCaractere = ObterValorDoCaractere(chave[i]);
+ soma += valorCaractere * peso;
//sempre que for 9 voltamos o peso a 2
if (peso < 9)
peso += 1;
@@ -67,7 +70,7 @@ private static string ObterDigitoVerificador(string chave)
}
//Agora que tenho a soma vamos pegar o resto da divisão por 11
- mod = soma%11;
+ mod = soma % 11;
//Aqui temos uma regrinha, se o resto da divisão for 0 ou 1 então o dv vai ser 0
if (mod == 0 || mod == 1)
dv = 0;
@@ -77,6 +80,18 @@ private static string ObterDigitoVerificador(string chave)
return dv.ToString();
}
+ ///
+ /// Obtem o valor de um caractere
+ ///
+ ///
+ ///
+ internal static int ObterValorDoCaractere(char caractere)
+ {
+ const int zeroASCII = 48;
+ var valor = caractere - zeroASCII;
+ return valor;
+ }
+
///
/// Informa se a chave de um DF-e é válida
///