89 lines
2.8 KiB
C#
89 lines
2.8 KiB
C#
using System.Net.NetworkInformation;
|
|
|
|
namespace GeradoresService
|
|
{
|
|
public class NIF
|
|
{
|
|
public static string Generate(string? type)
|
|
{
|
|
return GenerateRandomNIF(type);
|
|
}
|
|
|
|
public static string GenerateRandomNIF(string? nifType)
|
|
{
|
|
var firstDigitValidate = new char[] { '1', '2','3', '5', '6', '8', '9' };
|
|
Random rnd = new Random();
|
|
char firstDigit;
|
|
|
|
if (string.IsNullOrEmpty(nifType))
|
|
{
|
|
// Gera o primeiro dígito aleatório dentro dos válidos
|
|
int firstDigitIndex = rnd.Next(0, 6); // Escolhe um índice de 0 a 5
|
|
firstDigit = firstDigitValidate[firstDigitIndex];
|
|
} else {
|
|
if (firstDigitValidate.Contains(nifType[0])){
|
|
firstDigit = nifType[0];
|
|
}else
|
|
{
|
|
int firstDigitIndex = rnd.Next(0, 6); // Escolhe um índice de 0 a 5
|
|
firstDigit = firstDigitValidate[firstDigitIndex];
|
|
}
|
|
}
|
|
|
|
// Gera os próximos 7 dígitos aleatórios
|
|
string nextDigits = "";
|
|
for (int i = 0; i < 7; i++)
|
|
{
|
|
nextDigits += rnd.Next(0, 10); // Gera um dígito aleatório de 0 a 9
|
|
}
|
|
|
|
// Calcula o dígito de controlo
|
|
int checkDigit = (firstDigit - '0') * 9;
|
|
for (int i = 2; i <= 8; i++)
|
|
{
|
|
checkDigit += (nextDigits[i - 2] - '0') * (10 - i);
|
|
}
|
|
checkDigit = 11 - (checkDigit % 11);
|
|
if (checkDigit >= 10)
|
|
checkDigit = 0;
|
|
|
|
// Concatena os dígitos gerados e o dígito de controlo
|
|
string randomNIF = firstDigit + nextDigits + checkDigit;
|
|
|
|
return randomNIF;
|
|
}
|
|
|
|
|
|
public static bool Validate(string nif)
|
|
{
|
|
// Verificar se o NIF tem 9 dígitos
|
|
if (nif.Length != 9)
|
|
{
|
|
return false;
|
|
}
|
|
|
|
// Converter o NIF para um array de dígitos
|
|
int[] digitos = new int[9];
|
|
for (int i = 0; i < 9; i++)
|
|
{
|
|
if (!int.TryParse(nif[i].ToString(), out digitos[i]))
|
|
{
|
|
return false; // Se algum caractere não for um dígito, o NIF é inválido
|
|
}
|
|
}
|
|
|
|
// Calcular o dígito de controlo
|
|
int soma = 0;
|
|
for (int i = 0; i < 8; i++)
|
|
{
|
|
soma += digitos[i] * (9 - i);
|
|
}
|
|
int resto = soma % 11;
|
|
int digitoControlo = resto <= 1 ? 0 : 11 - resto;
|
|
|
|
// Verificar se o dígito de controlo coincide com o último dígito do NIF
|
|
return digitoControlo == digitos[8];
|
|
}
|
|
|
|
}
|
|
} |