Artigos & Ideias

Regras Validação Contribuinte (NIF) ASP + JavaScript

Escrito por:

É normal, diversos sites terem requisitos de introdução do Número de Contribuinte.
Mas o que nem toda a gente sabe, é como se procede à sua validação.
Em um dos trabalhos que já efectuei, tive de pesquisar sobre isso, entrei em contacto com o IIES o qual me facultou o algoritmo para a sua verificação. Podes consultar aqui a descrição do algoritmo em PDF.

A regra geral da validação é:

  1. O NIF tem que ter 9 dígitos
  2. O primeiro dígito tem que ser 1, 2, 5, 6, 8 ou 9
  3. A soma de controle dada por 9xd1+8xd2+7xd3+6xd4+5xd5+4xd6+3xd7+2xd8+d9 tem que ser múltipla de 11 (congruente com o módulo 11, isto é, dê resto 0 quando dividida por 11). d1 é o dígito mais à esquerda, e d9 o digito mais à direita (digito de controle).
  4. d9, em alguns casos, precisava de ter o valor 10, para que a soma de controle fosse divisível por 11. Neste caso d9 tomará o valor 0. Nitidamente uma decisão mal tomada, pois um dígito de controle igual a zero, poderá significar uma soma de controle correcta ou uma cujo resto da divisão por onze dá 1. O dígito de controle deveria ser, por exemplo, uma letra com os 11 possíveis valores de A a K. Por curiosidade, o mesmo erro, existe na validação dos BI.

Agora o código em ASP:

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title>Validação do NIF</title>

    <script src="valida.js" type="text/javascript"></script>

</head>
<body>
<form id="form1" runat="server">
<div>
        <asp :Label ID="Label1" runat="server" Text="Nº de Contribuinte:"></asp>
        <asp :TextBox ID="txtNIF" runat="server"></asp>
        <asp :RequiredFieldValidator ID="RequiredFieldValidator1" runat="server" ControlToValidate="txtNIF"
            Display="Dynamic" ErrorMessage="Tem de preencher o nº de Contribuinte." ValidationGroup="NIF"
            Enabled="False">*</asp>
        <asp :CustomValidator ID="CustomValidator1" runat="server" ClientValidationFunction="ValidateNIF"
            ControlToValidate="txtNIF" Display="Dynamic" ErrorMessage="Número de Contribuinte Inválido."
            ValidationGroup="NIF">*</asp>
    </div>

    <asp :Button ID="Button1" runat="server" Text="Enviar" ValidationGroup="NIF" />

    <asp :ValidationSummary ID="ValidationSummary1" runat="server" ValidationGroup="NIF" />
    </form>

</body>
</html>

Agora com recurso ao JavaScript, validamos o NIF:

function ValidateNIF(sender, args)
{
    args.IsValid = IsValidNIF(args.Value);
}

function IsValidNIF(nif)
{
    var c;
    var checkDigit = 0;

    //Verifica se é nulo, se é numérico e se tem 9 dígitos
    if(nif != null && IsNumeric(nif) && nif.length == 9)
    {
        //Obtem o primeiro número do NIF
        c = nif.charAt(0);

        //Verifica se o primeiro número é (1, 2, 5, 6, 8 ou 9)
        if(c == '1' || c == '2' || c == '5' || c == '6' || c == '8' || c == '9')
        {
            //Calculo do Digito de Controle
            checkDigit = c * 9;
            var i = 0;
            for(i = 2; i < = 8; i++)
            {
                checkDigit += nif.charAt(i-1) * (10-i);
            }
            checkDigit = 11 - (checkDigit % 11);

            //Se o digito de controle é maior que dez, coloca-o a zero
            if(checkDigit >= 10)
                checkDigit = 0;

            //Compara o digito de controle com o último numero do NIF
            //Se igual, o NIF é válido.
            if(checkDigit == nif.charAt(8))
                return true;
        }
    }
    return false;
}

function IsNumeric(ObjVal)
{
return /^\d+$/.test(ObjVal);
}

8


Sobre o Autor

Carlos Gonçalves é um Freelancer com bastante experiência em linguagens de programação e webdesign. Vocacionado para as novas tecnologias, aposta na qualidade dos serviços, atendimento rápido e sempre disponível para melhor satisfazer os seus clientes. Autor do site cgoncalves.com

Comentários

  1. Programador  16 Dezembro 2010

    ATENÇÃO!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

    Estas regras não coincidem com a legislação!

    Poupem problemas e contactem as Finanças antes de implementarem uma rotina deste género!

    (responder)
    • Carlos Gonçalves  18 Dezembro 2010

      Caro Visitante,

      “Esconder-se” por detrás do nome “Programador” em nada suscita uma discussão saudável.
      No entanto, e verifique a data do Post (31 de Janeiro de 2009), apesar de ter cerca de 2 anos, na altura as regras eram essas, e tenho quase a certeza que não mudaram.
      Mais, se se deu ao trabalho de ler todo o post, pode verificar que o algoritmo foi obtido após ter entrado em contacto com o IIES, vulgo Segurança Social, o qual forneceu o seu algorítmo, como pode verificar aqui, link que também se encontra no post inicial.

      Como tal, sem qualquer fundamento válido da sua parte, torna-se ridículo o seu comentário.

      (responder)
      • Romeu Costa  12 Janeiro 2011

        Atenção que o algoritmo que pôs é o do Número da Segurança Social (NISS) que como sabe é diferente do Número de Contribuinte (NIF) por isso o comentário do “Programador” foi muito oportuno.

        (responder)
        • Carlos Gonçalves  12 Janeiro 2011

          No entanto não invalida o que disse, a intervenção em nada foi esclarecedora. De facto houve sim um erro, não no algoritmo pois esse está correcto, o que está errado é o PDF, que está de facto a linkar para o NISS, porém o descrito no artigo é a rotina para validar NIF. Obrigado pelo reparo irei rectificar assim que me for possível.

          (responder)
          • DaMatta  20 Julho 2011

            Boas, pelo que vi do seu algoritmo este já resolve o ‘bug’ com o 0(zero) do digito de controlo ou estou errado?
            Digo isto depois de várias verificações com numeros oficiais utilizando o seu algoritmo e uns outros mais ‘oficiais’, o seu validou sempre os numeros como correctos onde outros devolviam inválidos (alguns dos casos com 0 no digito de controlo).

          • Carlos Gonçalves  20 Julho 2011

            Sim, o digito de controlo não deve ser 0, por isso que se tiver como dígito de controlo o 0 ele vai acusar como erro.

  2. Eduardo Jorge  18 Agosto 2011

    Boas. Tenho estado a tentar aplicar as regras de validação do NIF com recurso ao javascript no adobe acrobat, mas francamente sem sucesso. Tenho vários scripts mas este é o que me tem dificultado a validação. Dás-me uma dica? Um Abraço

    (responder)
  3. Luís Ramalho  18 Novembro 2011

    Obrigado pelo script Carlos, de fato o script não verifica corretamente o NIF. Acabei de colocar o meu e diz que não é válido… estou à procura de um algorítmo mas não estou a encontrar.

    (responder)

Comentar

Nota: A moderação de comentários está activada e pode atrasar o teu comentário. Não há necessidade de reenviares o teu comentário.

More in Outros (1 of 12 articles)

# #