Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
28 changes: 25 additions & 3 deletions DocsBr/Utils/DigitoVerificador.cs
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ public class DigitoVerificador
private bool somarAlgarismos = false;
private IDictionary<int, string> substituicoes = new Dictionary<int, string>();
private bool complementarDoModulo = true;
private bool primeiraDezenaSuperior = false;

public DigitoVerificador(string numero)
{
Expand Down Expand Up @@ -82,6 +83,16 @@ public DigitoVerificador SomandoAlgarismos()
return this;
}

/// <summary>
/// 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.
/// </summary>
public DigitoVerificador PrimeiraDezenaSuperior()
{
this.primeiraDezenaSuperior = true;
return this;
}

/// <summary>
/// Multiplicação da esquerda para a direita.
/// </summary>
Expand All @@ -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()
Expand All @@ -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))
{
Expand Down
11 changes: 5 additions & 6 deletions DocsBr/Validation/IE/IEMinasGeraisValidator.cs
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ namespace DocsBr.Validation.IE
/// Validação da IE de Minas Gerais
/// </summary>
/// <remarks>
/// 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
/// </remarks>
public class IEMinasGeraisValidator : IIEValidator
Expand All @@ -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();
Expand Down