10
10
final class Cnh extends Sanitization
11
11
{
12
12
/**
13
- * Trecho retirado do respect validation
13
+ * @author Evandro Kondrat
14
+ * Trecho reescrito com base no algoritmo passado pelo Detran-PR
14
15
*/
15
16
public function validateCnh ($ attribute , $ value ): bool
16
17
{
@@ -24,20 +25,32 @@ public function validateCnh($attribute, $value): bool
24
25
return false ;
25
26
}
26
27
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 ;
30
32
}
31
33
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 ;
35
39
}
36
40
37
- $ dv2 = $ s2 % 11 - ( $ dv1 > 9 ? 2 : 0 ) ;
41
+ $ parcial = $ dv1. $ parcial ;
38
42
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
+ }
40
53
41
- return $ value [ 10 ] == $ check ;
54
+ return $ dv1 . $ dv2 == substr ( $ value , - 2 ) ;
42
55
}
43
56
}
0 commit comments