REGON
Z Wikipedii
REGON (akronim od Rejestr Gospodarki Narodowej) - Krajowy Rejestr Urzędowy Podmiotów Gospodarki Narodowej, rejestr statystyczny prowadzony przez Prezesa Głównego Urzędu Statystycznego. Pod pojęciem REGONu rozumiany jest także Numer REGON, czyli dziewięciocyfrowy numer statystyczny podmiotu gospodarczego w powyższym rejestrze.
Spis treści |
[edytuj] Budowa numeru REGON
[edytuj] 9-cyfrowy REGON
Początkowo, REGON był 7-cyfrowy, a numery były nadawane centralnie. Później (ok. 1985-90 r.) rozszerzono REGON na 9 cyfr, gdzie regonom "starym" (7-cyfrowym) po prostu dołożono na początku 2 zera, a nowe zaczęto tworzyć wg klucza: 2 cyfry wyróżnika województwa + 6 cyfr "nru seryjnego" + 1 cyfra kontrolna. Województw było 49 i miały nadane kolejne numery nieparzyste – od 01 (warszawskie) do 97 (zielonogórskie).
[edytuj] Suma kontrolna
Dziewiąta cyfra jest cyfrą kontrolną obliczaną następująco:
Wagi: 8 9 2 3 4 5 6 7
Pierwsze osiem cyfr REGON: 1 2 3 4 5 6 7 8
Wynik: 1*8 + 2*9 + 3*2 + 4*3 + 5*4 + 6*5 + 7*6 + 8*7 = 192
Cyfra kontrolna: 192 mod 11 = 5
Cały REGON: 123456785
W przypadku, gdy mod zwraca 10 za cyfrę kontrolną przyjmuje się 0.
[edytuj] 14-cyfrowy REGON
Jednostkom organizacyjnym, które mają swoje siedziby w różnych województwach nadaje się REGON 14-cyfrowy (identyfikator jednostki lokalnej). Dziewięć pierwszych cyfr takiego numeru pokrywa się z REGONem jednostki macierzystej. Cyfra kontrolna numeru obliczana jest tym samym sposobem, ale wagi są inne. Ponieważ jeden ze współczynników wagowych wynosi zero to weryfikacja "długiego" REGONu wymaga weryfikacji 9 cyfr z wagami jak dla 9-cyfrowego numeru, a następnie weryfikacji długiego REGONu z innymi wagami.
[edytuj] Suma kontrolna
W przypadku REGONów 14-cyfrowych cyfrę kontrolną oblicza się następująco:
Wagi: 2 4 8 5 0 9 7 3 6 1 2 4 8
Pierwsze trzynaście cyfr REGON: 1 2 3 4 5 6 7 8 5 1 2 3 4
Wynik: 1*2 + 2*4 + 3*8 + 4*5 + 5*0 + 6*9 + 7*7 + 8*3 + 5*6 + 1*1 + 2*2 + 3*4 + 4*8 = 260
Cyfra kontrolna: 260 mod 11 = 7
Cały REGON: 12345678512347
[edytuj] Implementacja algorytmu w języku Python
def check_REGON(regon): weights = { 7: (2, 3, 4, 5, 6, 7), 9: (8, 9, 2, 3, 4, 5, 6, 7), 14: (2, 4, 8, 5, 0, 9, 7, 3, 6, 1, 2, 4, 8), } try: regon = map(int, regon) weights = weights[len(regon)] except: return False checksum = sum(n * w for n, w in zip(regon, weights)) return checksum % 11 % 10 == regon[-1]
[edytuj] Implementacja algorytmu w języku Ruby
def valid_regon?(regon_string) case regon_string.size when 7 weights = [2, 3, 4, 5, 6, 7] when 9 weights = [8, 9, 2, 3, 4, 5, 6, 7] when 14 weights = [2, 4, 8, 5, 0, 9, 7, 3, 6, 1, 2, 4, 8] else return false end regon_string = regon_string.split(//).map {|d| d.to_i } checksum = 0 weights.each_with_index { |w, i| checksum += w * regon_string[i] } return checksum % 11 % 10 == regon_string.last end
[edytuj] Implementacja algorytmu w języku PHP
function CheckRegon( $regon ) { switch( strlen( $regon ) ) { case 7: $weights = array(2, 3, 4, 5, 6, 7); break; case 9: $weights = array(8, 9, 2, 3, 4, 5, 6, 7); break; case 14: $weights = array(2, 4, 8, 5, 0, 9, 7, 3, 6, 1, 2, 4, 8); break; default: return false; } $checksum = 0; foreach( $weights as $i => $w ) { $checksum += $w * $regon[$i]; } return $checksum % 11 % 10 == substr( $regon, -1, 1 ); }
[edytuj] Implementacja algorytmu w języku PL/SQL
CREATE OR REPLACE FUNCTION PKCORE."WALIDUJ_REGON" (p_regon VARCHAR) RETURN VARCHAR2 AS crc NUMBER; v_last NUMBER; BEGIN IF LENGTH(p_regon) = 9 THEN crc:= 8 * TO_NUMBER(SUBSTR(p_regon,1,1)) + 9 * TO_NUMBER(SUBSTR(p_regon,2,1)) + 2 * TO_NUMBER(SUBSTR(p_regon,3,1)) + 3 * TO_NUMBER(SUBSTR(p_regon,4,1)) + 4 * TO_NUMBER(SUBSTR(p_regon,5,1)) + 5 * TO_NUMBER(SUBSTR(p_regon,6,1)) + 6 * TO_NUMBER(SUBSTR(p_regon,7,1)) + 7 * TO_NUMBER(SUBSTR(p_regon,8,1)); v_last:=TO_NUMBER(SUBSTR(p_regon,9,1)); ELSIF LENGTH(p_regon) = 14 THEN crc:=2 * TO_NUMBER(SUBSTR(p_regon,1,1)) +4 * TO_NUMBER(SUBSTR(p_regon,2,1)) +8 * TO_NUMBER(SUBSTR(p_regon,3,1)) +5 * TO_NUMBER(SUBSTR(p_regon,4,1)) +0 * TO_NUMBER(SUBSTR(p_regon,5,1)) +9 * TO_NUMBER(SUBSTR(p_regon,6,1)) +7 * TO_NUMBER(SUBSTR(p_regon,7,1)) +3 * TO_NUMBER(SUBSTR(p_regon,8,1)) +6 * TO_NUMBER(SUBSTR(p_regon,9,1)) +1 * TO_NUMBER(SUBSTR(p_regon,10,1)) +2 * TO_NUMBER(SUBSTR(p_regon,11,1)) +4 * TO_NUMBER(SUBSTR(p_regon,12,1)) +8 * TO_NUMBER(SUBSTR(p_regon,13,1)); v_last:=TO_NUMBER(SUBSTR(p_regon,14,1)); ELSE RETURN('ERR'); END IF; crc:=MOD(crc,11); IF crc=10 THEN crc:=0; END IF; IF v_last = crc THEN RETURN 'OK'; ELSE RETURN 'ERR'; END IF; EXCEPTION WHEN OTHERS THEN RETURN 'ERR'; END;

