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 ///