@@ -115,4 +115,95 @@ public static function isValidMobilePhone($phone)
115115 $ phone
116116 );
117117 }
118+
119+ /**
120+ * @param string $cns only string
121+ * @return bool
122+ */
123+ public static function isValidCns ($ cns )
124+ {
125+ $ cns = preg_replace ('/\D/ ' , '' , $ cns );
126+
127+ if (strlen ($ cns ) != 15 ) {
128+ return false ;
129+ }
130+
131+ $ first = (int ) $ cns [0 ];
132+
133+ if (in_array ($ first , [7 , 8 , 9 ])) {
134+ return Validate::validate_cns_tmp ($ cns );
135+ }
136+
137+ if (in_array ($ first , [1 , 2 ])) {
138+ return Validate::validate_cns_fixed ($ cns );
139+ }
140+ return false ;
141+ }
142+
143+ private static function validate_cns_fixed ($ cns )
144+ {
145+ $ pis = substr ($ cns , 0 , 11 );
146+
147+ $ soma = (((substr ($ pis , 0 , 1 )) * 15 ) +
148+ ((substr ($ pis , 1 , 1 )) * 14 ) +
149+ ((substr ($ pis , 2 , 1 )) * 13 ) +
150+ ((substr ($ pis , 3 , 1 )) * 12 ) +
151+ ((substr ($ pis , 4 , 1 )) * 11 ) +
152+ ((substr ($ pis , 5 , 1 )) * 10 ) +
153+ ((substr ($ pis , 6 , 1 )) * 9 ) +
154+ ((substr ($ pis , 7 , 1 )) * 8 ) +
155+ ((substr ($ pis , 8 , 1 )) * 7 ) +
156+ ((substr ($ pis , 9 , 1 )) * 6 ) +
157+ ((substr ($ pis , 10 , 1 )) * 5 ));
158+
159+ $ resto = fmod ($ soma , 11 );
160+ $ dv = 11 - $ resto ;
161+ if ($ dv == 11 ) {
162+ $ dv = 0 ;
163+ }
164+ if ($ dv == 10 ) {
165+ $ soma = ((((substr ($ pis , 0 , 1 )) * 15 ) +
166+ ((substr ($ pis , 1 , 1 )) * 14 ) +
167+ ((substr ($ pis , 2 , 1 )) * 13 ) +
168+ ((substr ($ pis , 3 , 1 )) * 12 ) +
169+ ((substr ($ pis , 4 , 1 )) * 11 ) +
170+ ((substr ($ pis , 5 , 1 )) * 10 ) +
171+ ((substr ($ pis , 6 , 1 )) * 9 ) +
172+ ((substr ($ pis , 7 , 1 )) * 8 ) +
173+ ((substr ($ pis , 8 , 1 )) * 7 ) +
174+ ((substr ($ pis , 9 , 1 )) * 6 ) +
175+ ((substr ($ pis , 10 , 1 )) * 5 )) + 2 );
176+
177+ $ resto = fmod ($ soma , 11 );
178+ $ dv = 11 - $ resto ;
179+ $ resultado = $ pis . '001 ' . $ dv ;
180+ } else {
181+ $ resultado = $ pis . '000 ' . $ dv ;
182+ }
183+
184+ return $ cns === $ resultado ;
185+ }
186+
187+ private static function validate_cns_tmp ($ cns )
188+ {
189+ $ soma = (((substr ($ cns , 0 , 1 )) * 15 ) +
190+ ((substr ($ cns , 1 , 1 )) * 14 ) +
191+ ((substr ($ cns , 2 , 1 )) * 13 ) +
192+ ((substr ($ cns , 3 , 1 )) * 12 ) +
193+ ((substr ($ cns , 4 , 1 )) * 11 ) +
194+ ((substr ($ cns , 5 , 1 )) * 10 ) +
195+ ((substr ($ cns , 6 , 1 )) * 9 ) +
196+ ((substr ($ cns , 7 , 1 )) * 8 ) +
197+ ((substr ($ cns , 8 , 1 )) * 7 ) +
198+ ((substr ($ cns , 9 , 1 )) * 6 ) +
199+ ((substr ($ cns , 10 , 1 )) * 5 ) +
200+ ((substr ($ cns , 11 , 1 )) * 4 ) +
201+ ((substr ($ cns , 12 , 1 )) * 3 ) +
202+ ((substr ($ cns , 13 , 1 )) * 2 ) +
203+ ((substr ($ cns , 14 , 1 )) * 1 ));
204+ $ resto = fmod ($ soma , 11 );
205+
206+ return $ resto == 0 ;
207+ }
208+
118209}
0 commit comments