@@ -23,11 +23,19 @@ class REGONRule implements Rule
2323 */
2424 public function passes ($ attribute , $ value )
2525 {
26- return $ this ->checkREGON ($ value );
26+ if ($ value === null ) {
27+ return false ;
28+ }
29+
30+ return match (strlen ($ value )) {
31+ 9 => $ this ->checkREGON ($ value ),
32+ 14 => $ this ->checkLongREGON ($ value ),
33+ default => false ,
34+ };
2735 }
2836
2937 /**
30- * Check if given REGON number is valid.
38+ * Check if given REGON number is valid - 9 digit version .
3139 *
3240 * @param null|string $string
3341 *
@@ -38,25 +46,46 @@ public function passes($attribute, $value)
3846 */
3947 private function checkREGON (?string $ string ): bool
4048 {
41- if ($ string === null ) {
42- return false ;
49+ $ arrSteps = [8 , 9 , 2 , 3 , 4 , 5 , 6 , 7 ];
50+ $ intSum = 0 ;
51+
52+ for ($ i = 0 ; $ i < 8 ; $ i ++) {
53+ $ intSum += $ arrSteps [$ i ] * $ string [$ i ];
4354 }
4455
45- if (strlen ($ string ) != 9 ) {
46- return false ;
56+ $ int = $ intSum % 11 ;
57+ $ intControlNr = ($ int == 10 ) ? 0 : $ int ;
58+
59+ if ($ intControlNr == $ string [8 ]) {
60+ return true ;
4761 }
4862
49- $ arrSteps = [8 , 9 , 2 , 3 , 4 , 5 , 6 , 7 ];
63+ return false ;
64+ }
65+
66+ /**
67+ * Check if given REGON number is valid - 14 digits version.
68+ *
69+ * @param null|string $string
70+ *
71+ * @return bool
72+ *
73+ * @see http://phpedia.pl/wiki/REGON Souce of this algorithm
74+ * @since 2023-05-22
75+ */
76+ private function checkLongRegon (?string $ string ): bool
77+ {
78+ $ arrSteps = [2 , 4 , 8 , 5 , 0 , 9 , 7 , 3 , 6 , 1 , 2 , 4 , 8 ];
5079 $ intSum = 0 ;
5180
52- for ($ i = 0 ; $ i < 8 ; $ i ++) {
81+ for ($ i = 0 ; $ i < 13 ; $ i ++) {
5382 $ intSum += $ arrSteps [$ i ] * $ string [$ i ];
5483 }
5584
5685 $ int = $ intSum % 11 ;
5786 $ intControlNr = ($ int == 10 ) ? 0 : $ int ;
5887
59- if ($ intControlNr == $ string [8 ]) {
88+ if ($ intControlNr == $ string [13 ]) {
6089 return true ;
6190 }
6291
0 commit comments