This commit is contained in:
87
api/app/Rules/Cns.php
Normal file
87
api/app/Rules/Cns.php
Normal file
@@ -0,0 +1,87 @@
|
||||
<?php
|
||||
|
||||
namespace App\Rules;
|
||||
|
||||
use Illuminate\Contracts\Validation\Rule;
|
||||
|
||||
class Cns implements Rule
|
||||
{
|
||||
/**
|
||||
* Determine if the validation rule passes.
|
||||
*
|
||||
* @param string $attribute
|
||||
* @param mixed $value
|
||||
* @return bool
|
||||
*/
|
||||
public function passes($attribute, $value)
|
||||
{
|
||||
return self::isValid($value);
|
||||
}
|
||||
|
||||
public static function isValid($value)
|
||||
{
|
||||
$cns = preg_replace('/[^0-9]/', '', $value);
|
||||
|
||||
if ((strlen(trim($cns))) != 15)
|
||||
return false;
|
||||
|
||||
$acao = substr($cns, 0, 1);
|
||||
switch ($acao)
|
||||
{
|
||||
case '1':
|
||||
case '2': $ret = self::validaCNS($cns); break;
|
||||
case '5':
|
||||
case '7':
|
||||
case '8':
|
||||
case '9': $ret = self::validaCNS_PROVISORIO($cns); break;
|
||||
default: $ret = false;
|
||||
}
|
||||
|
||||
return $ret;
|
||||
}
|
||||
|
||||
private static function validaCNS($cns)
|
||||
{
|
||||
$pis = substr($cns,0,11);
|
||||
$soma = 0;
|
||||
for ( $i = 0, $j = strlen($pis), $k = 15; $i < $j; $i++, $k-- )
|
||||
{
|
||||
$soma += $pis[$i] * $k;
|
||||
}
|
||||
$dv = 11 - fmod($soma, 11);
|
||||
$dv = ($dv != 11) ? $dv : '0';
|
||||
if ( $dv == 10 )
|
||||
{
|
||||
$soma += 2;
|
||||
$dv = 11 - fmod($soma, 11);
|
||||
$resultado = $pis.'001'.$dv;
|
||||
}
|
||||
else
|
||||
{
|
||||
$resultado = $pis.'000'.$dv;
|
||||
}
|
||||
|
||||
return $cns == $resultado;
|
||||
}
|
||||
|
||||
private static function validaCNS_PROVISORIO($cns)
|
||||
{
|
||||
$soma = 0;
|
||||
for ( $i = 0, $j = strlen($cns), $k = $j; $i < $j; $i++, $k-- )
|
||||
{
|
||||
$soma += $cns[$i] * $k;
|
||||
}
|
||||
|
||||
return $soma % 11 == 0 && $j == 15;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the validation error message.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function message()
|
||||
{
|
||||
return 'CNS Inválido.';
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user