98 lines
2.8 KiB
C#
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();
|
|
}
|
|
}
|
|
}
|