Jump to content

Validação NIF


John Hebert Trindade
Go to solution Solved by Ivo Vicente,

Recommended Posts

Bom dia a todos,

Tenho o código abaixo a realizar a validação do NIF em português, caso seja de outro pais não faz validação nenhuma, só que infelizmente não esta a resultar. Se puderem digam onde errei.

function validaNIF(string $paisnif, $nif)
  {
    $this->paisnif = $paisnif;

    if (!empty($this->paisnif) and ($this->paisnif == 'PT')) {

      //Limpamos eventuais espaços a mais
      $nif = trim($nif);

      //Remove os pontos
      $nif = str_replace(array('.', '-', '/'), "", $nif);

      //Verificamos se é numérico e tem comprimento 9
      if (!is_numeric($nif) || strlen($nif) != 9) {
        $this->utils->setSessionMsg('Erro: Número de Identificação Fiscal inválido, por favor verifique!', 'danger');
        $this->result = false;
      } else {
        $nifSplit = str_split($nif);
        //O primeiro digíto tem de ser 1, 2, 3, 5, 6, 7, 8 ou 9
        if (in_array($nifSplit[0], array(1, 2, 3, 5, 6, 7, 8, 9))) {
          //Calculamos o dígito de controlo
          $checkDigit = 0;
          for ($i = 0; $i < 8; $i++) {
            $checkDigit += $nifSplit[$i] * (10 - $i - 1);
          }
          $checkDigit = 11 - ($checkDigit % 11);
          //Se der 10 então o dígito de controlo tem de ser 0
          if ($checkDigit >= 10) $checkDigit = 0;
          //Comparamos com o último dígito
          if ($checkDigit == $nifSplit[8]) {
            $this->result = true;
          } else {
            $this->utils->setSessionMsg('Erro: Número de Identificação Fiscal inválido, por favor verifique!', 'danger');
            //$_SESSION['msg'] = "<p class='alert-danger'>Erro: Email já utilizado, por favor verifique!</p>";
            $this->result = false;
          }
        } else {
          $this->utils->setSessionMsg('Erro: Número de Identificação Fiscal inválido, por favor verifique!', 'danger');
          //$_SESSION['msg'] = "<p class='alert-danger'>Erro: Email já utilizado, por favor verifique!</p>";
          $this->result = false;
        }
      }
    } else {
      $this->result = true;
    }
  }

 

Link to comment
Share on other sites

Olá.

 

Tens aqui 2 classes que implementam esta validação: https://github.com/square-bit/laravel-pt-rules/tree/main/src/Rules

Copiando:

 

protected function check(string $nif): bool
{
    $nif_split = str_split($nif);
    $nif_primeiros_digito = [1, 2, 3, 5, 6, 7, 8, 9];
  
    if (is_numeric($nif) && strlen($nif) === 9 && in_array($nif_split[0], $nif_primeiros_digito)) {
        
        $check_digit = 0;
        
        for ($i = 0; $i < 8; $i++) {
            $check_digit += $nif_split[$i] * (10 - $i - 1);
        }
        
        $check_digit = 11 - ($check_digit % 11);
        $check_digit = $check_digit >= 10 ? 0 : $check_digit;
        
        if ($check_digit === (int) $nif_split[8]) {
            return true;
        }
    }
    return false;
}

 

Edited by tiago.f
  • Vote 1
Link to comment
Share on other sites

  • Solution

Viva,

Copie e testei o algoritmo e está a funcionar (com alguns ajustes para executar fora de uma classe, podes ver aqui )

Podes usar esta página para gerar nifs válidos para fazeres testes

Já agora,o alerta que 123456789 passa como sendo válido, fica ao teu critério excluir ou aceitar

Feito é melhor que perfeito

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
×
×
  • 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.