Array
(
)

Validar código EAN/GTIN

Jonathan Lazaro
|
MVP
Pontos: 1005
    15 fev 2016

Pessoal, tive necessidade esses dias de criar uma rotina que valide códigos GTIN. Como não achei nada parecido, decidi criar a minha própria e postar aqui, caso alguém mais precise. E claro, críticas, correções e sugestões são muito bem vindas!
Obs¹: Pra quem não sabe o código GTIN é o famoso código de barras, também conhecido com EAN. O código GTIN é aceito no SPED se tiver 8, 12, 13 ou 14 posições. Nos meus testes eu utilizei códigos GTIN-13 (maioria no Brasil).
Obs²: É necessário importar o namespace System.Linq para fazer uso das funções "ElementAt" e "Contains".
Segue o código:
#Código
public static bool ValidaGTIN(string vGTIN)
{
//Tamanhos permitidos no GTIN = 8 / 12 / 13 / 14
int[] GTINlength = { 8, 12, 13, 14 };
int n, soma, resultado, base10;
if (!GTINlength.Contains(vGTIN.Length))
{
return false;
}
//Checa se todos os caracteres do GTIN são números
for (int i = 0; i <= vGTIN.Length - 1; i++)
{
if (!int.TryParse(vGTIN.ElementAt(i).ToString(), out n))
{
return false;
}
}
soma = 0;
//Se for GTIN-13 multiplica todas as posições pares menos a última por 1 e as ímpares por 3. Nos outros tamanhos, faz o inverso
if (vGTIN.Length == 13)
{
for (int i = 0; i <= vGTIN.Length - 2; i++)
{
if (i % 2 == 0)
{
soma += (Convert.ToInt32(vGTIN.ElementAt(i).ToString()) * 1);
}
else
{
soma += (Convert.ToInt32(vGTIN.ElementAt(i).ToString()) * 3);
}
}
}
else
{
for (int i = 0; i <= vGTIN.Length - 2; i++)
{
if (i % 2 == 0)
{
soma = soma + Convert.ToInt32(vGTIN.ElementAt(i).ToString()) * 3;
}
else
{
soma = soma + Convert.ToInt32(vGTIN.ElementAt(i).ToString()) * 1;
}
}
}
//Procura pelo número de base 10 mais próximo do total somado (arredondando sempre para cima, se necessário)
base10 = soma;
if (base10 % 10 != 0)
{
while (base10 % 10 != 0)
{
base10 += 1;
}
}
//Diminui o total do número de base 10. O resultado deve ser o último digito do código de barras
resultado = base10 - soma;
if (resultado != Convert.ToInt32(vGTIN.ElementAt(vGTIN.Length - 1).ToString()))
{
return false;
}
return true;
}