John Hebert Trindade Posted December 7, 2023 at 11:18 AM Report Share #632342 Posted December 7, 2023 at 11:18 AM 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 More sharing options...
tiago.f Posted December 7, 2023 at 11:29 AM Report Share #632343 Posted December 7, 2023 at 11:29 AM (edited) 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 December 7, 2023 at 11:31 AM by tiago.f 1 Report Link to comment Share on other sites More sharing options...
Solution Ivo Vicente Posted December 7, 2023 at 11:42 AM Solution Report Share #632344 Posted December 7, 2023 at 11:42 AM 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 More sharing options...
John Hebert Trindade Posted December 7, 2023 at 02:24 PM Author Report Share #632350 Posted December 7, 2023 at 02:24 PM Realmente esta correcta a função, o problema estava que as vezes devolvia as letras do pais em minúsculo e as vezes em maiúsculas. adicionei isso no inicio e resolveu. //recebe os caracteres do pais e transforma em maiuscula $this->paisnif = strtoupper($paisnif); Link to comment Share on other sites More sharing options...
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now