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().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(); } } }