diff --git a/DocsBr/Utils/DigitoVerificador.cs b/DocsBr/Utils/DigitoVerificador.cs index 7636f12..c6e35d7 100644 --- a/DocsBr/Utils/DigitoVerificador.cs +++ b/DocsBr/Utils/DigitoVerificador.cs @@ -18,6 +18,7 @@ public class DigitoVerificador private bool somarAlgarismos = false; private IDictionary substituicoes = new Dictionary(); private bool complementarDoModulo = true; + private bool primeiraDezenaSuperior = false; public DigitoVerificador(string numero) { @@ -82,6 +83,16 @@ public DigitoVerificador SomandoAlgarismos() return this; } + /// + /// Existem algumas regras que é preciso calcular o digito usando a primeira dezena superior da somar/produto dos algarismos em vez do módulo + /// Ex: Soma = 15, Dezena = 20, Resultado = 20 - 15. + /// + public DigitoVerificador PrimeiraDezenaSuperior() + { + this.primeiraDezenaSuperior = true; + return this; + } + /// /// Multiplicação da esquerda para a direita. /// @@ -97,9 +108,10 @@ public DigitoVerificador SemComplementarDoModulo() return this; } - public void AddDigito(string digito) + public DigitoVerificador AddDigito(string digito) { this.numero = String.Concat(this.numero, digito); + return this; } public string CalculaDigito() @@ -122,8 +134,18 @@ private string GetDigitSum() if (++m >= this.multiplicadores.Count) m = 0; } - int mod = (soma % modulo); - int resultado = complementarDoModulo ? modulo - mod : mod; + int resultado; + + if (primeiraDezenaSuperior) + { + int dezena = (int)(Math.Ceiling(soma / 10d) * 10); + resultado = dezena - soma; + } + else + { + int mod = (soma % modulo); + resultado = complementarDoModulo ? modulo - mod : mod; + } if (substituicoes.ContainsKey(resultado)) { diff --git a/DocsBr/Validation/IE/IEMinasGeraisValidator.cs b/DocsBr/Validation/IE/IEMinasGeraisValidator.cs index 029f917..19658ac 100644 --- a/DocsBr/Validation/IE/IEMinasGeraisValidator.cs +++ b/DocsBr/Validation/IE/IEMinasGeraisValidator.cs @@ -8,7 +8,7 @@ namespace DocsBr.Validation.IE /// Validação da IE de Minas Gerais /// /// - /// ROTEIRO DE CRÍTICA DA INSCRIÇÃO ESTADUAL: + /// ROTEIRO DE CRÍTICA DA INSCRIÇÃO ESTADUAL: /// http://www.sintegra.gov.br/Cad_Estados/cad_MG.html /// public class IEMinasGeraisValidator : IIEValidator @@ -31,15 +31,14 @@ private bool HasValidCheckDigits() string number = String.Concat(ieSemDigitos.Substring(0, 3), "0", ieSemDigitos.Substring(3, ieSemDigitos.Length - 3)); string primeiroDigito = new DigitoVerificador(number) - .Modulo(10) .ComMultiplicadoresDeAte(1, 2) - .SomandoAlgarismos() - .Substituindo("0", 10) .InvertendoMultiplicadores() + .SomandoAlgarismos() + .PrimeiraDezenaSuperior() .CalculaDigito(); - number = String.Concat(ieSemDigitos.Substring(0, ieSemDigitos.Length), primeiroDigito); - string segundoDigito = new DigitoVerificador(number) + string segundoDigito = new DigitoVerificador(ieSemDigitos) + .AddDigito(primeiroDigito) .ComMultiplicadoresDeAte(2, 11) .Substituindo("0", 10, 11) .CalculaDigito();