Created
July 14, 2026 13:31
-
-
Save heyalexej/be04332d59e405a448213b8cdac17c1c to your computer and use it in GitHub Desktop.
Prüfziffern-Validierung für die Unternehmensnummer (UNR.S) der gesetzlichen Unfallversicherung nach DGUV-Verfahrensbeschreibung
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| """Prüft die Prüfziffer einer Unternehmensnummer (UNR.S) der gesetzlichen Unfallversicherung. | |
| Aufbau (15 Stellen): Stellen 1-11 Unternehmernummer, Stelle 12 Prüfziffer, | |
| Stellen 13-15 Unternehmenskennzeichen (nicht "000"). | |
| Algorithmus laut DGUV-Verfahrensbeschreibung UV-Meldeverfahren: | |
| Stellen 1-11 mit den Faktoren 4, 9, 4, 9, ... multiplizieren, Produkte | |
| aufsummieren, Prüfziffer = 10 - (Summe mod 10); ergibt das 10, ist sie 0. | |
| Quelle: https://www.dguv.de/medien/inhalt/versicherung/uv-meldeverfahren/verfahrensbeschreibung_neu/verfahrensbeschreibung_2-1/verfahrensbeschreibung-ln_2_1.pdf | |
| """ | |
| import sys | |
| FAKTOREN = [4, 9, 4, 9, 4, 9, 4, 9, 4, 9, 4] | |
| def pruefziffer(unr_stellen_1_bis_11: str) -> int: | |
| summe = sum(int(z) * f for z, f in zip(unr_stellen_1_bis_11, FAKTOREN)) | |
| return (10 - summe % 10) % 10 | |
| def pruefe_unrs(unrs: str) -> tuple[bool, str]: | |
| unrs = unrs.replace(" ", "") | |
| if len(unrs) != 15 or not unrs.isdigit(): | |
| return False, "UNR.S muss aus genau 15 Ziffern bestehen" | |
| if unrs[12:] == "000": | |
| return False, "Unternehmenskennzeichen (Stellen 13-15) darf nicht 000 sein" | |
| erwartet = pruefziffer(unrs[:11]) | |
| ist = int(unrs[11]) | |
| if ist != erwartet: | |
| return False, f"Prüfziffer falsch: Stelle 12 ist {ist}, erwartet {erwartet}" | |
| return True, "gültig" | |
| # Synthetische Beispielnummern (keine real vergebenen UNR.S): | |
| # Stellen 1-11 = 12345678901, Summe der Produkte = 284, Prüfziffer = 6 | |
| BEISPIEL_GUELTIG = "123456789016001" | |
| BEISPIEL_UNGUELTIG = "123456789017001" # Prüfziffer absichtlich falsch (7 statt 6) | |
| def _selbsttest() -> None: | |
| assert pruefe_unrs(BEISPIEL_GUELTIG) == (True, "gültig") | |
| ok, meldung = pruefe_unrs(BEISPIEL_UNGUELTIG) | |
| assert not ok and "Prüfziffer falsch" in meldung | |
| assert not pruefe_unrs("123456789016000")[0] # Kennzeichen 000 unzulässig | |
| assert not pruefe_unrs("12345")[0] # falsche Länge | |
| print("Selbsttest OK") | |
| if __name__ == "__main__": | |
| if len(sys.argv) > 1: | |
| nummer = sys.argv[1] | |
| ok, meldung = pruefe_unrs(nummer) | |
| print(f"UNR.S {nummer}: {meldung}") | |
| sys.exit(0 if ok else 1) | |
| _selbsttest() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment