Skip to content

Commit 5e986bb

Browse files
authored
Merge pull request #54 from MrEko/arrumando-cnh
Arrumando cnh
2 parents 5464a7e + c8c5a10 commit 5e986bb

File tree

2 files changed

+30
-10
lines changed

2 files changed

+30
-10
lines changed

src/validator-docs/Rules/Cnh.php

+23-10
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,8 @@
1010
final class Cnh extends Sanitization
1111
{
1212
/**
13-
* Trecho retirado do respect validation
13+
* @author Evandro Kondrat
14+
* Trecho reescrito com base no algoritmo passado pelo Detran-PR
1415
*/
1516
public function validateCnh($attribute, $value): bool
1617
{
@@ -24,20 +25,32 @@ public function validateCnh($attribute, $value): bool
2425
return false;
2526
}
2627

27-
for ($c = $s1 = $s2 = 0, $p = 9; $c < 9; $c++, $p--) {
28-
$s1 += (int) $value[$c] * $p;
29-
$s2 += (int) $value[$c] * (10 - $p);
28+
$parcial = substr($value, 0, 9);
29+
30+
for ($i = 0 , $j = 2, $s = 0; $i < mb_strlen($parcial); $i++, $j++) {
31+
$s += (int) $parcial[$i] * $j;
3032
}
3133

32-
$dv1 = $s1 % 11;
33-
if ($value[9] != ($dv1 > 9) ? 0 : $dv1) {
34-
return false;
34+
$resto = $s % 11;
35+
if ($resto <= 1) {
36+
$dv1 = 0;
37+
} else {
38+
$dv1 = 11 - $resto;
3539
}
3640

37-
$dv2 = $s2 % 11 - ($dv1 > 9 ? 2 : 0);
41+
$parcial = $dv1.$parcial;
3842

39-
$check = $dv2 < 0 ? $dv2 + 11 : ($dv2 > 9 ? 0 : $dv2);
43+
for ($i = 0, $j = 2, $s = 0; $i < mb_strlen($parcial); $i++, $j++) {
44+
$s += (int) $parcial[$i] * $j;
45+
}
46+
47+
$resto = $s % 11;
48+
if ($resto <= 1) {
49+
$dv2 = 0;
50+
} else {
51+
$dv2 = 11 - $resto;
52+
}
4053

41-
return $value[10] == $check;
54+
return $dv1.$dv2 == substr($value, -2);
4255
}
4356
}

tests/TestValidator.php

+7
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,13 @@ public function cnh()
130130
$this->assertTrue($correct->passes());
131131

132132
$this->assertTrue($incorrect->fails());
133+
134+
$correct = \Validator::make(
135+
['certo' => '04463004100'],
136+
['certo' => 'cnh']
137+
);
138+
139+
$this->assertTrue($correct->passes());
133140
}
134141

135142
/** @test **/

0 commit comments

Comments
 (0)