11<?php
22
3+ declare (strict_types=1 );
4+
35namespace geekcom \ValidatorDocs ;
46
57use Illuminate \Validation \Validator as BaseValidator ;
68
79use function preg_match ;
810use function preg_replace ;
9- use function strlen ;
11+ use function mb_strlen ;
1012use function str_repeat ;
1113use function sprintf ;
1214use function substr ;
1820 */
1921class Validator extends BaseValidator
2022{
21- protected function validateFormatoCpf ($ attribute , $ value )
23+ protected function validateFormatoCpf ($ attribute , $ value ): bool
2224 {
2325 return preg_match ('/^\d{3}\.\d{3}\.\d{3}-\d{2}$/ ' , $ value ) > 0 ;
2426 }
2527
26- protected function validateFormatoCnpj ($ attribute , $ value )
28+ protected function validateFormatoCnpj ($ attribute , $ value ): bool
2729 {
2830 return preg_match ('/^\d{2}\.\d{3}\.\d{3}\/\d{4}-\d{2}$/ ' , $ value ) > 0 ;
2931 }
3032
31- protected function validateFormatoCpfCnpj ($ attribute , $ value )
33+ protected function validateFormatoCpfCnpj ($ attribute , $ value ): bool
3234 {
3335 return $ this ->validateFormatoCpf ($ attribute , $ value ) || $ this ->validateFormatoCnpj ($ attribute , $ value );
3436 }
3537
36- protected function validateFormatoNis ($ attribute , $ value )
38+ protected function validateFormatoNis ($ attribute , $ value ): bool
3739 {
3840 return preg_match ('/^\d{3}\.\d{5}\.\d{2}-\d{1}$/ ' , $ value ) > 0 ;
3941 }
4042
41- /*
42- * O Número de Matrícula tem a configuração aaaaaa.bb.cc.dddd.e.fffff.ggg.hhhhhhh-ii
43- */
44- protected function validateFormatoCertidao ($ attribute , $ value )
43+ protected function validateFormatoCertidao ($ attribute , $ value ): bool
4544 {
4645 return preg_match ('/^\d{6}[. ]\d{2}[. ]\d{2}[. ]\d{4}[. ]\d{1}[. ]\d{5}[. ]\d{3}[. ]\d{7}[- ]\d{2}$/ ' , $ value ) > 0 ;
4746 }
4847
49- protected function validateCpf ($ attribute , $ value )
48+ protected function validateCpf ($ attribute , $ value ): bool
5049 {
51- $ c = preg_replace ( ' /\D/ ' , '' , $ value );
50+ $ c = $ this -> removeCaracteresNaoNumericos ( $ value );
5251
53- if (strlen ($ c ) != 11 || preg_match ("/^ {$ c [0 ]}{11}$/ " , $ c )) {
52+ if (mb_strlen ($ c ) != 11 || preg_match ("/^ {$ c [0 ]}{11}$/ " , $ c )) {
5453 return false ;
5554 }
5655
@@ -69,11 +68,11 @@ protected function validateCpf($attribute, $value)
6968 return true ;
7069 }
7170
72- protected function validateCnpj ($ attribute , $ value )
71+ protected function validateCnpj ($ attribute , $ value ): bool
7372 {
74- $ c = preg_replace ( ' /\D/ ' , '' , $ value );
73+ $ c = $ this -> removeCaracteresNaoNumericos ( $ value );
7574
76- if (strlen ($ c ) != 14 || preg_match ("/^ {$ c [0 ]}{14}$/ " , $ c )) {
75+ if (mb_strlen ($ c ) != 14 || preg_match ("/^ {$ c [0 ]}{14}$/ " , $ c )) {
7776 return false ;
7877 }
7978
@@ -94,52 +93,51 @@ protected function validateCnpj($attribute, $value)
9493 return true ;
9594 }
9695
97- protected function validateCpfCnpj ($ attribute , $ value )
96+ protected function validateCpfCnpj ($ attribute , $ value ): bool
9897 {
9998 return ($ this ->validateCpf ($ attribute , $ value ) || $ this ->validateCnpj ($ attribute , $ value ));
10099 }
101100
102101 /**
103102 * Trecho retirado do respect validation
104103 */
105- protected function validateCnh ($ attribute , $ value )
104+ protected function validateCnh ($ attribute , $ value ): bool
106105 {
107- $ ret = false ;
106+ if (!is_scalar ($ value )) {
107+ return false ;
108+ }
108109
109- if ((strlen ($ input = preg_replace ('/[^\d]/ ' , '' , $ value )) == 11 )
110- && (str_repeat ($ input [1 ], 11 ) != $ input )
111- ) {
112- $ dsc = 0 ;
110+ $ value = $ this ->removeCaracteresNaoNumericos ($ value );
113111
114- for ( $ i = 0 , $ j = 9 , $ v = 0 ; $ i < 9 ; ++ $ i , -- $ j ) {
115- $ v += ( int ) $ input [ $ i ] * $ j ;
116- }
112+ if ( mb_strlen ( $ value ) != 11 || (( int ) $ value === 0 ) ) {
113+ return false ;
114+ }
117115
118- if (( $ vl1 = $ v % 11 ) >= 10 ) {
119- $ vl1 = 0 ;
120- $ dsc = 2 ;
121- }
116+ for ( $ c = $ s1 = $ s2 = 0 , $ p = 9 ; $ c < 9 ; $ c ++, $ p -- ) {
117+ $ s1 += ( int ) $ value [ $ c ] * $ p ;
118+ $ s2 += ( int ) $ value [ $ c ] * ( 10 - $ p ) ;
119+ }
122120
123- for ($ i = 0 , $ j = 1 , $ v = 0 ; $ i < 9 ; ++$ i , ++$ j ) {
124- $ v += (int ) $ input [$ i ] * $ j ;
125- }
121+ $ dv1 = $ s1 % 11 ;
122+ if ($ value [9 ] != ($ dv1 > 9 ) ? 0 : $ dv1 ) {
123+ return false ;
124+ }
126125
127- $ vl2 = ( $ x = ( $ v % 11 )) >= 10 ? 0 : $ x - $ dsc ;
126+ $ dv2 = $ s2 % 11 - ( $ dv1 > 9 ? 2 : 0 ) ;
128127
129- $ ret = sprintf ('%d%d ' , $ vl1 , $ vl2 ) == substr ($ input , -2 );
130- }
128+ $ check = $ dv2 < 0 ? $ dv2 + 11 : $ dv2 > 9 ? 0 : $ dv2 ;
131129
132- return $ ret ;
130+ return $ value [ 10 ] == $ check ;
133131 }
134132
135- protected function validateTituloEleitor ($ attribute , $ value )
133+ protected function validateTituloEleitor ($ attribute , $ value ): bool
136134 {
137- $ input = preg_replace ( ' /[^\d]/ ' , '' , $ value );
135+ $ input = $ this -> removeCaracteresNaoNumericos ( $ value );
138136
139137 $ uf = substr ($ input , -4 , 2 );
140138
141- if (((strlen ($ input ) < 5 ) || (strlen ($ input ) > 13 )) ||
142- (str_repeat ($ input [1 ], strlen ($ input )) == $ input ) ||
139+ if (((mb_strlen ($ input ) < 5 ) || (mb_strlen ($ input ) > 13 )) ||
140+ (str_repeat ($ input [1 ], mb_strlen ($ input )) == $ input ) ||
143141 ($ uf < 1 || $ uf > 28 )) {
144142 return false ;
145143 }
@@ -153,7 +151,7 @@ protected function validateTituloEleitor($attribute, $value)
153151 $ fator = 9 ;
154152 $ soma = 0 ;
155153
156- for ($ j = (strlen ($ sequencia ) - 1 ); $ j > -1 ; $ j --) {
154+ for ($ j = (mb_strlen ($ sequencia ) - 1 ); $ j > -1 ; $ j --) {
157155 $ soma += $ sequencia [$ j ] * $ fator ;
158156
159157 if ($ fator == $ base ) {
@@ -185,11 +183,11 @@ protected function validateTituloEleitor($attribute, $value)
185183 return true ;
186184 }
187185
188- protected function validateNis ($ attribute , $ value )
186+ protected function validateNis ($ attribute , $ value ): bool
189187 {
190- $ nis = sprintf ('%011s ' , preg_replace ( ' {\D} ' , '' , $ value ));
188+ $ nis = sprintf ('%011s ' , $ this -> removeCaracteresNaoNumericos ( $ value ));
191189
192- if (strlen ($ nis ) != 11 || preg_match ("/^ {$ nis [0 ]}{11}$/ " , $ nis )) {
190+ if (mb_strlen ($ nis ) != 11 || preg_match ("/^ {$ nis [0 ]}{11}$/ " , $ nis )) {
193191 return false ;
194192 }
195193
@@ -200,9 +198,9 @@ protected function validateNis($attribute, $value)
200198 return ($ nis [10 ] == (((10 * $ d ) % 11 ) % 10 ));
201199 }
202200
203- protected function validateCns ($ attribute , $ value )
201+ protected function validateCns ($ attribute , $ value ): bool
204202 {
205- $ cns = preg_replace ( ' /[^\d]/ ' , '' , $ value );
203+ $ cns = $ this -> removeCaracteresNaoNumericos ( $ value );
206204
207205 // CNSs definitivos começam em 1 ou 2 / CNSs provisórios em 7, 8 ou 9
208206 if (preg_match ("/[1-2][0-9]{10}00[0-1][0-9]/ " , $ cns ) || preg_match ("/[7-9][0-9]{14}/ " , $ cns )) {
@@ -212,27 +210,26 @@ protected function validateCns($attribute, $value)
212210 return false ;
213211 }
214212
215- private function somaPonderadaCns ($ value )
213+ private function somaPonderadaCns ($ value ): int
216214 {
217215 $ soma = 0 ;
218216
219- for ($ i = 0 ; $ i < strlen ($ value ); $ i ++) {
217+ for ($ i = 0 ; $ i < mb_strlen ($ value ); $ i ++) {
220218 $ soma += $ value [$ i ] * (15 - $ i );
221219 }
222220
223221 return $ soma ;
224222 }
225-
223+
226224 /*
227225 * CERTIDÃO DE NASCIMENTO/CASAMENTO/ÓBITO
228226 * Fonte: http://ghiorzi.org/DVnew.htm#zc
229227 *
230228 * Nota: se o resto for "10", o DV será "1"
231229 */
232- protected function validateCertidao ($ attribute , $ value )
230+ protected function validateCertidao ($ attribute , $ value ): bool
233231 {
234- // Remove não numericos
235- $ certidao = preg_replace ('/[^\d]/ ' , '' , $ value );
232+ $ certidao = $ this ->removeCaracteresNaoNumericos ($ value );
236233
237234 if (!preg_match ("/[0-9]{32}/ " , $ certidao )) {
238235 return false ;
@@ -249,16 +246,19 @@ protected function validateCertidao($attribute, $value)
249246 // Compara o dv recebido com os dois numeros calculados
250247 if ($ dv === $ dv1 .$ dv2 ) {
251248 return true ;
252- } else {
253- return false ;
254249 }
250+
251+ return false ;
255252 }
256253
257- private function somaPonderadaCertidao ($ value ) {
254+ private function somaPonderadaCertidao ($ value ): int
255+ {
258256 $ soma = 0 ;
259257
260- $ multiplicador = 32 - strlen ($ value );
261- for ($ i = 0 ; $ i < strlen ($ value ); $ i ++) {
258+ $ multiplicador = 32 - mb_strlen ($ value );
259+
260+ for ($ i = 0 ; $ i < mb_strlen ($ value ); $ i ++) {
261+
262262 $ soma += $ value [$ i ] * $ multiplicador ;
263263
264264 $ multiplicador += 1 ;
@@ -267,4 +267,9 @@ private function somaPonderadaCertidao($value) {
267267
268268 return $ soma ;
269269 }
270+
271+ private function removeCaracteresNaoNumericos ($ value ): string
272+ {
273+ return preg_replace ('/[^\d]/ ' , '' , $ value );
274+ }
270275}
0 commit comments