1010final 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}
0 commit comments