Calcular se um Numero se segurança social é real

Boa tarde pessoal estou aqui com o um problema estou a fazer um projeto em asp.netcore8 para calcular se um determinado nif e um determinado Numero de segurança social é real e e valido

Aqui esta o meu codigo esta Presente o Model , o Controlador e a View



Model
C#:
namespace TaskProject.Models
{
 
    public class People
    {
        [Key]
        public int IdPeople { get; set; }
        [Required]
        public int FiscalNumber { get; set; }
        [Required]
        [MaxLength(11)]
        [MinLength(11)]
        public string SocialSecurityNumber { get; set;}
        [Required]
        [MaxLength(250)]
        public string Name { get; set; }
        [Required]
        [MaxLength(250)]
        public string NameShort { get; set; }
        [Required]
        [MaxLength(50)]
        public string Insignia { get; set; }
        [Required]
        [MaxLength(250)]
        public string Address  { get; set; }
        [Required]
        [MaxLength(250)]
        public string Adresse1 { get; set; }
        [Required]
        [MaxLength(50)]
        public string Local { get; set; }
        [Required]
        [MaxLength(250)]
        public string PostalCode { get; set; }
        [Required]
        [MaxLength(250)]
        public string PostalCodeLocal { get; set; }
        [Required]
        [MaxLength(50)]
        public string Country { get; set; }
        [Required]
        [MaxLength(50)]
        public string WeAddress { get; set; }
        [Required]
        public DateTime DateCreation { get; set; } = DateTime.Now;
        [Required]
        [MaxLength(50)]
        public string CreatedFrom { get; set; } = "Web";
    }
}



Controlador
C#:
        [HttpGet]
        public IActionResult Create()
        {
            People peoples = new People();
            return View(peoples);
        }

        [ValidateAntiForgeryToken]
        [HttpPost]
        public IActionResult Create(People people)
        {
            // Verificar se o NIF é válido antes de adicionar ao contexto
            if (!IsValidNIF(people.FiscalNumber))
            {
                ModelState.AddModelError("FiscalNumber", "NIF inválido.");
                return View(people);
            }

            // Verificar se o número de segurança social é válido antes de adicionar ao contexto
            if (!IsValidSocialSecurityNumber(people.SocialSecurityNumber))
            {
                ModelState.AddModelError("SocialSecurityNumber", "Número de segurança social inválido.");
                return View(people);
            }

            _context.Add(people);
            _context.SaveChanges();
            return RedirectToAction(nameof(Index));
        }
        // Método para verificar se um NIF é válido
        private bool IsValidNIF(int nif)
        {
            // Transformar o NIF em string e garantir que tenha 9 dígitos
            string nifString = nif.ToString().PadLeft(9, '0');

            // Verificar se tem 9 dígitos
            if (nifString.Length != 9)
                return false;

            // Verificar se os primeiros 8 dígitos são números
            foreach (char c in nifString.Substring(0, 8))
            {
                if (!char.IsDigit(c))
                    return false;
            }

            // Calcular dígito de controlo
            int sum = 0;
            for (int i = 0; i < 8; i++)
            {
                int digit = int.Parse(nifString[i].ToString());
                sum += digit * (9 - i);
            }

            int checkDigit = 11 - (sum % 11);
            if (checkDigit >= 10)
                checkDigit = 0;

            // Verificar se o dígito de controlo coincide com o último dígito do NIF
            return checkDigit == int.Parse(nifString[8].ToString());
        }
        // Método para verificar se um número de segurança social é válido
        private bool IsValidSocialSecurityNumber(string socialSecurityNumber)
        {
            // Verificar se o número tem 11 dígitos
            if (socialSecurityNumber.Length != 11)
            {
                Console.WriteLine("O número de segurança social deve ter exatamente 11 dígitos.");
                return false;
            }

            // Converter o número de segurança social em uma matriz de inteiros
            int[] digits;

            try
            {
                // Tentar converter cada caractere da string em um inteiro
                digits = socialSecurityNumber.Select(c => int.Parse(c.ToString())).ToArray();
            }
            catch (FormatException)
            {
                // Se ocorrer uma exceção de formato durante a conversão, significa que a string
                // contém caracteres não numéricos
                Console.WriteLine("O número de segurança social contém caracteres não numéricos.");
                return false;
            }
            catch (OverflowException)
            {
                // Se ocorrer um estouro durante a conversão, significa que o número é muito grande
                // para ser representado como um inteiro
                Console.WriteLine("O número de segurança social é muito grande.");
                return false;
            }

            // Calcular o primeiro dígito de controlo
            int sum = 0;
            for (int i = 0; i < 9; i++)
            {
                sum += digits[i] * (9 - i);
            }
            int firstControlDigit = (11 - (sum % 11)) % 10;

            Console.WriteLine($"Primeiro dígito de controle calculado: {firstControlDigit}");

            // Verificar se o primeiro dígito de controlo coincide
            if (firstControlDigit != digits[9])
            {
                Console.WriteLine("O primeiro dígito de controlo do número de segurança social não coincide.");
                return false;
            }

            // Calcular o segundo dígito de controlo
            sum = 0;
            for (int i = 0; i < 10; i++)
            {
                sum += digits[i] * (10 - i);
            }
            int secondControlDigit = (11 - (sum % 11)) % 10;

            Console.WriteLine($"Segundo dígito de controle calculado: {secondControlDigit}");

            // Verificar se o segundo dígito de controlo coincide
            if (secondControlDigit != digits[10])
            {
                Console.WriteLine("O segundo dígito de controlo do número de segurança social não coincide.");
                return false;
            }

            // Se chegou até aqui, significa que o número de segurança social é válido
            return true;
        }



View
ASP.net:
@model TaskProject.Models.People

@{
    ViewData["Title"] = "Create";
    Layout = "~/Views/Shared/_LayoutCriar.cshtml";
}

<h1>Create</h1>

<h4>People</h4>
<hr />
<div class="row">
    <div class="col-md-4">
        <form asp-action="Create">
            <div asp-validation-summary="ModelOnly" class="text-danger"></div>
            <div class="form-group">
                <label asp-for="FiscalNumber" class="control-label">Numero Fiscal</label>
                <input asp-for="FiscalNumber" class="form-control" />
                <span asp-validation-for="FiscalNumber" class="text-danger"></span>
            </div>
            <div class="form-group">
                <label asp-for="SocialSecurityNumber" class="control-label">Numero de Segurança Social</label>
                <input asp-for="SocialSecurityNumber" class="form-control" />
                <span asp-validation-for="SocialSecurityNumber" class="text-danger"></span>
            </div>
            <div class="form-group">
                <label asp-for="Name" class="control-label">Nome</label>
                <input asp-for="Name" class="form-control" />
                <span asp-validation-for="Name" class="text-danger"></span>
            </div>
            <div class="form-group">
                <label asp-for="NameShort" class="control-label">Apelido</label>
                <input asp-for="NameShort" class="form-control" />
                <span asp-validation-for="NameShort" class="text-danger"></span>
            </div>
            <div class="form-group">
                <label asp-for="Insignia" class="control-label">Insignia</label>
                <input asp-for="Insignia" class="form-control" />
                <span asp-validation-for="Insignia" class="text-danger"></span>
            </div>
            <div class="form-group">
                <label asp-for="Address" class="control-label">Morada</label>
                <input asp-for="Address" class="form-control" />
                <span asp-validation-for="Address" class="text-danger"></span>
            </div>
            <div class="form-group">
                <label asp-for="Adresse1" class="control-label">Morada1</label>
                <input asp-for="Adresse1" class="form-control" />
                <span asp-validation-for="Adresse1" class="text-danger"></span>
            </div>
            <div class="form-group">
                <label asp-for="Local" class="control-label">Local</label>
                <input asp-for="Local" class="form-control" />
                <span asp-validation-for="Local" class="text-danger"></span>
            </div>
            <div class="form-group">
                <label asp-for="PostalCode" class="control-label">Codigo Postal</label>
                <input asp-for="PostalCode" class="form-control" />
                <span asp-validation-for="PostalCode" class="text-danger"></span>
            </div>
            <div class="form-group">
                <label asp-for="PostalCodeLocal" class="control-label">Local do Codigo Postal</label>
                <input asp-for="PostalCodeLocal" class="form-control" />
                <span asp-validation-for="PostalCodeLocal" class="text-danger"></span>
            </div>
            <div class="form-group">
                <label asp-for="Country" class="control-label">Cidade</label>
                <input asp-for="Country" class="form-control" />
                <span asp-validation-for="Country" class="text-danger"></span>
            </div>
            <div class="form-group">
                <label asp-for="WeAddress" class="control-label">Email</label>
                <input asp-for="WeAddress" class="form-control" />
                <span asp-validation-for="WeAddress" class="text-danger"></span>
            </div>
            <div class="form-group">
                <label asp-for="DateCreation" class="control-label">Data de Criação</label>
                <input asp-for="DateCreation" class="form-control" />
                <span asp-validation-for="DateCreation" class="text-danger"></span>
            </div>
            <div class="form-group">
                <label asp-for="CreatedFrom" class="control-label">Criado por</label>
                <input asp-for="CreatedFrom" class="form-control" />
                <span asp-validation-for="CreatedFrom" class="text-danger"></span>
            </div>
            <div class="form-group">
                <input type="submit" value="Create" class="btn btn-primary" />
            </div>
        </form>
    </div>
</div>

<div>
    <a asp-action="Index">Back to List</a>
</div>

@section Scripts {
    @{
        await Html.RenderPartialAsync("_ValidationScriptsPartial");
    }
}
 
Última edição pelo moderador:
Ajustei as tags [CODE] disso, e coloquei como C# porque o syntax highlight de ASP.NET não estava a fazer a coisa certa.

Que problema estás a ter e onde é que precisas de ajuda?
 
Ajustei as tags [CODE] disso, e coloquei como C# porque o syntax highlight de ASP.NET não estava a fazer a coisa certa.

Que problema estás a ter e onde é que precisas de ajuda?
O erro que esta acontecer ou pelo menos o que eu achei estranho é no controlador

na verificação do primeiro digito diz sempre que o primeiro digito de controlo não coincide ,e no projeto mostra sempre que o numero não é valido sendo que estou a testar com um numero real que é o meu
 
Não conheço o algoritmo para validar NISS, nem tenho como testar código ASP.NET, portanto não te consigo ajudar muito, mas pode ser que alguém consiga.
Era melhor se conhecesses alguma plataforma online para partilhar snippets de código que eu pudesse alterar, porque mesmo que tenha sugestões não tenho como testar.

// Verificar se os primeiros 8 dígitos são números
foreach (char c in nifString.Substring(0, 8))
{
if (!char.IsDigit(c))
return false;
}
Não há forma de verificar logo se "nifString" é numérico? Parece-me que sim:
https://stackoverflow.com/questions...alue-entered-is-numeric-it-could-be-decimal-o


Quanto ao algoritmo que estás a usar, onde o obtiveste? Estou a ter algumas dificuldades em encontrar alguma referência sobre como é que isso se faz.

Encontrei este código Python, que testei com o meu NISS e funciona, portanto podes usá-lo como referência. Também te recomendo fazeres prints no teu código para confirmar que cada passo te parece estar certo. Não consigo ajudar muito mais:

https://gist.github.com/dreispt/024dd11c160af58268e2b44019080bbf

Se tiveres como partilhar esse código em alguma sandbox online para o alterar e testar, força.
 
Vamos começar definindo um modelo para representar os dados de uma pessoa e um controlador para lidar com as solicitações de validação.

Modelo Person​

public class Person
{
public int Id { get; set; }
public string Name { get; set; }
public string NIF { get; set; }
public string NISS { get; set; }
}

Controlador ValidationController​


using Microsoft.AspNetCore.Mvc;

public class ValidationController : Controller
{
[HttpPost]
public IActionResult Validate(Person person)
{
// Validação do NIF e NISS
bool isNIFValid = IsValidNIF(person.NIF);
bool isNISSValid = IsValidNISS(person.NISS);

// Retorne uma resposta adequada (por exemplo, JSON)
return Json(new { NIFValid = isNIFValid, NISSValid = isNISSValid });
}

private bool IsValidNIF(string nif)
{
// Lógica de validação do NIF
// Este é apenas um exemplo básico, você precisa implementar a lógica real de validação
return !string.IsNullOrEmpty(nif) && nif.Length == 9;
}

private bool IsValidNISS(string niss)
{
// Lógica de validação do NISS
// Este é apenas um exemplo básico, você precisa implementar a lógica real de validação
return !string.IsNullOrEmpty(niss) && niss.Length == 11;
}
}

View Validation.cshtml​

<!DOCTYPE html>
<html>
<head>
<title>Validation</title>
</head>
<body>
<h1>Validation</h1>

<form id="validationForm">
<label for="name">Name:</label>
<input type="text" id="name" name="Name" required>
<br>
<label for="nif">NIF:</label>
<input type="text" id="nif" name="NIF" required>
<br>
<label for="niss">NISS:</label>
<input type="text" id="niss" name="NISS" required>
<br>
<button type="submit">Validate</button>
</form>

<div id="result"></div>

<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
<script>
$(document).ready(function () {
$('#validationForm').submit(function (event) {
event.preventDefault();

var formData = $(this).serialize();

$.ajax({
type: 'POST',
url: '/Validation/Validate',
data: formData,
success: function (response) {
$('#result').html('NIF Valid: ' + response.NIFValid + '<br>NISS Valid: ' + response.NISSValid);
}
});
});
});
</script>
</body>
</html>

Neste exemplo, quando o formulário é enviado, os dados são enviados para o método Validate no controlador ValidationController. Esse método verifica se o NIF e o NISS são válidos usando as funções IsValidNIF e IsValidNISS. Os resultados da validação são retornados como uma resposta JSON e exibidos na página.

Lembre-se de que este é apenas um exemplo básico. Você precisará adaptar a lógica de validação de acordo com os requisitos específicos do país para validar o NIF e o NISS.
 
Vamos começar definindo um modelo para representar os dados de uma pessoa e um controlador para lidar com as solicitações de validação.

Modelo Person​

public class Person
{
public int Id { get; set; }
public string Name { get; set; }
public string NIF { get; set; }
public string NISS { get; set; }
}

Controlador ValidationController​


using Microsoft.AspNetCore.Mvc;

public class ValidationController : Controller
{
[HttpPost]
public IActionResult Validate(Person person)
{
// Validação do NIF e NISS
bool isNIFValid = IsValidNIF(person.NIF);
bool isNISSValid = IsValidNISS(person.NISS);

// Retorne uma resposta adequada (por exemplo, JSON)
return Json(new { NIFValid = isNIFValid, NISSValid = isNISSValid });
}

private bool IsValidNIF(string nif)
{
// Lógica de validação do NIF
// Este é apenas um exemplo básico, você precisa implementar a lógica real de validação
return !string.IsNullOrEmpty(nif) && nif.Length == 9;
}

private bool IsValidNISS(string niss)
{
// Lógica de validação do NISS
// Este é apenas um exemplo básico, você precisa implementar a lógica real de validação
return !string.IsNullOrEmpty(niss) && niss.Length == 11;
}
}

View Validation.cshtml​

<!DOCTYPE html>
<html>
<head>
<title>Validation</title>
</head>
<body>
<h1>Validation</h1>

<form id="validationForm">
<label for="name">Name:</label>
<input type="text" id="name" name="Name" required>
<br>
<label for="nif">NIF:</label>
<input type="text" id="nif" name="NIF" required>
<br>
<label for="niss">NISS:</label>
<input type="text" id="niss" name="NISS" required>
<br>
<button type="submit">Validate</button>
</form>

<div id="result"></div>

<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
<script>
$(document).ready(function () {
$('#validationForm').submit(function (event) {
event.preventDefault();

var formData = $(this).serialize();

$.ajax({
type: 'POST',
url: '/Validation/Validate',
data: formData,
success: function (response) {
$('#result').html('NIF Valid: ' + response.NIFValid + '<br>NISS Valid: ' + response.NISSValid);
}
});
});
});
</script>
</body>
</html>

Neste exemplo, quando o formulário é enviado, os dados são enviados para o método Validate no controlador ValidationController. Esse método verifica se o NIF e o NISS são válidos usando as funções IsValidNIF e IsValidNISS. Os resultados da validação são retornados como uma resposta JSON e exibidos na página.

Lembre-se de que este é apenas um exemplo básico. Você precisará adaptar a lógica de validação de acordo com os requisitos específicos do país para validar o NIF e o NISS.
mas a logica para a verificar no niss é simples esta apenas a verificar se tem os 11 digitos
 
Seu código está indo na direção certa para criar um projeto em ASP.NET Core para validar um NIF (Número de Identificação Fiscal) e um NISS (Número de Identificação da Segurança Social). No entanto, algumas melhorias podem ser feitas para torná-lo mais robusto e preciso. Vou fazer algumas sugestões de melhorias abaixo:

Modelo Person​

Seu modelo Person parece estar bem definido. Ele contém os campos necessários para armazenar informações sobre uma pessoa, incluindo o nome, NIF e NISS.

Controlador ValidationController​

Seu controlador ValidationController possui um método Validate que recebe uma instância de Person e valida o NIF e NISS usando os métodos IsValidNIF e IsValidNISS. No entanto, você pode melhorar a lógica de validação para ser mais precisa e adequada às regras de validação de NIF e NISS em seu país.

View Validation.cshtml​

Sua view Validation.cshtml contém um formulário para inserir informações sobre uma pessoa, incluindo nome, NIF e NISS. Quando o formulário é enviado, ele envia uma solicitação AJAX para o método Validate no controlador ValidationController e exibe o resultado da validação na página.
 
Dei-me ao trabalho de copiar o post dele e pôr no GPT. Não é a minha area e quis saber qual seria a resposta dele.
Podes ver isso para ti e pela tua curiosidade, mas agradeço que te abstenhas de dar esse tipo de respostas - que são spam - porque não só estamos a perder tempo a ler coisas que não estão relacionadas com o problema como estás potencialmente a induzir o autor do tópico em erro, pelos vistos sem sequer tentares perceber se é o caso.

Se fosse para perguntar ao ChatGPT, qualquer um - incluindo o autor - podia tê-lo feito. Num fórum esperam-se respostas escritas por humanos.

Finalmente, recomendo-te que leias isto e reflitas um pouco: https://en.wikipedia.org/wiki/Hallucination_(artificial_intelligence) .
 
Podes ver isso para ti e pela tua curiosidade, mas agradeço que te abstenhas de dar esse tipo de respostas - que são spam - porque não só estamos a perder tempo a ler coisas que não estão relacionadas com o problema como estás potencialmente a induzir o autor do tópico em erro, pelos vistos sem sequer tentares perceber se é o caso.

Se fosse para perguntar ao ChatGPT, qualquer um - incluindo o autor - podia tê-lo feito. Num fórum esperam-se respostas escritas por humanos.

Finalmente, recomendo-te que leias isto e reflitas um pouco: https://en.wikipedia.org/wiki/Hallucination_(artificial_intelligence) .
Eu já tentei por varias horas procurar no ChatGPT mas ele não me da nada que seja certo a única coisa que ele ajudou foi na parte do NIF mas na parte do NISS não diz nada que se aproveite
 
Eu já tentei por varias horas procurar no ChatGPT mas ele não me da nada que seja certo a única coisa que ele ajudou foi na parte do NIF mas na parte do NISS não diz nada que se aproveite
Provavelmente não sabe qual é o algoritmo usado na validação do NISS. Acho estranho ser tão difícil, mas de facto também não encontro nenhuma fonte que o confirme, para além do gist que referi acima:
pelo que a minha sugestão ainda é comparares os códigos e veres se te parece ser o mesmo algoritmo.
 
Provavelmente não sabe qual é o algoritmo usado na validação do NISS. Acho estranho ser tão difícil, mas de facto também não encontro nenhuma fonte que o confirme, para além do gist que referi acima:

pelo que a minha sugestão ainda é comparares os códigos e veres se te parece ser o mesmo algoritmo.
Vou ver agora
chegou ao ponto do ChatGPT dizer para ir buscar a API da segurança social , mas de certo que eles não vão dar isso a um simples programador porque é uma base de dados muitos dados
 
Back
Topo