Jump to content

Validação NIFs iniciados por 3


nunosalves
 Share

Recommended Posts

Bom dia,

alguém tem ideia do algoritmo para validação de nif's iniciados por 3?

Estes nif's começaram a ser atribuidos em 2019 dado que os iniciados por 2 esgotaram.

O algoritmo anterior falha na validação dos nif's iniciados por 3.

Obrigado.

Link to comment
Share on other sites

8 horas atrás, nunosalves disse:

Bom dia,

alguém tem ideia do algoritmo para validação de nif's iniciados por 3?

Estes nif's começaram a ser atribuidos em 2019 dado que os iniciados por 2 esgotaram.

O algoritmo anterior falha na validação dos nif's iniciados por 3.

Obrigado.

Tanto quanto sei o algoritmo de calculo do último dígito de controlo deveria ser o mesmo.
https://info.portaldasfinancas.gov.pt/pt/destaques/Paginas/Atribuicao_Nova_Gama_de_NIF_a_Pessoas_Singulares.aspx

Nota:
- há por aí muitos algoritmos NIFPT que logo no início tem algo assim a limitar o primeiro digito

if ("1256789".indexOf(nif.charAt(0)) == -1) return false;

- no caso acima, iria falhar por [ainda] não estar a ser considerado o novo início por "3"

- corrigida esta linha, o restante [linhas seguintes] cálculo do último dígito de controlo deveria manter-se correcto

Questões:
- Que algoritmo está a usar? Tem um exemplo de um novo nif começado por "3"?

Edited by antseq
  • Vote 1
Link to comment
Share on other sites

Bom dia,

obrigado pela resposta.

Depois de muita insistência, o cliente resolveu confirmar o NIF facultado e confirmamos que estava errado.

Em termos de algoritmo estava tudo bem, inclusivê a limitação do primeiro digito.

Obrigado.

Link to comment
Share on other sites

rubenAlves

Tenho esta função para validar NIF 

public static bool IsValidNIFOLD(this string Contrib)
        {
            if (string.IsNullOrEmpty(Contrib)) return false;
            if (Contrib.Length < 9) return false;
            var functionReturnValue = false;
            var s = new string[9];

            s[0] = Convert.ToString(Contrib[0]);
            s[1] = Convert.ToString(Contrib[1]);
            s[2] = Convert.ToString(Contrib[2]);
            s[3] = Convert.ToString(Contrib[3]);
            s[4] = Convert.ToString(Contrib[4]);
            s[5] = Convert.ToString(Contrib[5]);
            s[6] = Convert.ToString(Contrib[6]);
            s[7] = Convert.ToString(Contrib[7]);
            s[8] = Convert.ToString(Contrib[8]);

            if (Contrib.Length == 9)
            {
                var C = s[0];
                if (s[0] == "1" || s[0] == "2" || s[0] == "3" || s[0] == "5" || s[0] == "6" || s[0] == "7" || s[0] == "8" || s[0] == "9")
                {
                    long checkDigit = Convert.ToInt32(C) * 9;
                    int i;
                    for (i = 2; i <= 8; i++)
                    {
                        checkDigit = checkDigit + (Convert.ToInt32(s[i - 1]) * (10 - i));
                    }
                    checkDigit = 11 - (checkDigit % 11);
                    if (checkDigit >= 10)
                        checkDigit = 0;
                    if (checkDigit == Convert.ToInt32(s[8]))
                        functionReturnValue = true;
                }
            }
            return functionReturnValue;
        }

Se o NIF começar por 3 não funciona,

303730587 nunca valida, se for ao nif.pt diz que é válido.

 

alguém consegue-me dizer o que está mal?

Obrigado.

 

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.