Files
Geradores/GeradoresService/NIF.cs
Marco Santos 11e532ac9a New Layout
2025-07-13 21:43:37 +01:00

98 lines
2.8 KiB
C#

using GeradoresService.DAL;
using System;
using System.ComponentModel;
using System.Linq;
using System.Text.Json.Serialization;
namespace GeradoresService
{
public class NIF
{
private readonly GeradoresContext _geradoresContext;
public NIF(GeradoresContext geradoresContext)
{
_geradoresContext = geradoresContext;
}
[JsonConverter(typeof(JsonStringEnumConverter))]
public enum NIFType
{
[Description("Pessoa singular (1)")]
PessoaSingular1 = 1,
[Description("Pessoa singular (2)")]
PessoaSingular2 = 2,
[Description("Pessoa singular (3; novo em 2019)")]
PessoaSingular3 = 3,
[Description("Pessoa colectiva (5)")]
PessoaColectiva = 5,
[Description("Pessoa colectiva pública (6)")]
PessoaColectivaPublica = 6,
[Description("Empresário em nome individual (8)")]
EmpresarioIndividual = 8,
[Description("Pessoa colectiva irregular ou número provisório (9)")]
PessoaColectivaIrregular = 9
}
public string Generate(NIFType? type)
{
var nif = GenerateRandomNIF(type);
return nif;
}
public string GenerateRandomNIF(NIFType? nifType)
{
char firstDigit;
Random rnd = new Random();
if (nifType.HasValue)
{
firstDigit = ((int)nifType.Value).ToString()[0];
}
else
{
var validFirstDigits = Enum.GetValues(typeof(NIFType)).Cast<int>().Select(v => v.ToString()[0]).ToArray();
firstDigit = validFirstDigits[rnd.Next(validFirstDigits.Length)];
}
string nextDigits = string.Concat(Enumerable.Range(0, 7).Select(_ => rnd.Next(0, 10).ToString()));
int checkDigit = (firstDigit - '0') * 9;
for (int i = 0; i < 7; i++)
{
checkDigit += (nextDigits[i] - '0') * (8 - i);
}
checkDigit = 11 - (checkDigit % 11);
if (checkDigit >= 10)
checkDigit = 0;
return firstDigit + nextDigits + checkDigit;
}
public bool Validate(string nif)
{
if (nif.Length != 9 || !nif.All(char.IsDigit))
return false;
int[] digitos = nif.Select(c => c - '0').ToArray();
int soma = digitos.Take(8).Select((num, i) => num * (9 - i)).Sum();
int digitoControlo = (11 - (soma % 11)) % 10;
return digitoControlo == digitos[8];
}
public void SaveNIF(string NIF)
{
var ger = new Geradore() { Valor = NIF };
_geradoresContext.Geradores.Add(ger);
_geradoresContext.SaveChanges();
}
}
}