Last active
September 13, 2022 10:39
-
-
Save jensens/e46fe42e7df930a59ad081ac8e2eed30 to your computer and use it in GitHub Desktop.
Calculate the check digit of an Austrian social insurance number; Berechnen der Prüfziffer einer österreichischen Sozialversicherungsnummer
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
# -*- coding: utf-8 -*- | |
"""Calculate the check digit of an Austrian social insurance number | |
Berechnen der Prüfziffer einer österreichischen Sozialversicherungsnummer | |
copyright Klein & Partner KG. | |
License: Gnu Public License 2.0 | |
from https://de.wikipedia.org/wiki/Sozialversicherungsnummer#.C3.96sterreich | |
Die Prüfziffer kann wie folgt errechnet werden: | |
Jede einzelne Ziffer der Versicherungsnummer wird mit einer bestimmten Zahl | |
multipliziert: | |
Laufnummer mit 3, 7, 9 | |
Geburtsdatum mit 5, 8, 4, 2, 1, 6 | |
Die Prüfziffer errechnet sich aus dem Divisionsrest der Summe der | |
einzelnen Produkte geteilt durch 11. | |
Wenn der Divisionsrest 10 ergibt, so wird die Laufnummer um 1 erhöht und eine | |
neue Berechnung durchgeführt. | |
Beispiel: | |
123X 010180 | |
X=(1×3 + 2×7 + 3×9 + 0×5 + 1×8 + 0×4 + 1×2 + 8×1 + 0×6) mod 11 | |
X=7 | |
Die Sozialversicherungsnummer lautet somit 1237 010180. | |
""" | |
MULT = [3, 7, 9, 0, 5, 8, 4, 2, 1, 6] | |
MULT.reverse() | |
def _checkdigit(svnr): | |
"""calculate the checkdigit of a svnr | |
""" | |
def zx(p): | |
"""calculate a single checkdigit given the position ``p`` | |
""" | |
return ((svnr % 10**(p + 1) - svnr % 10**p) / 10**p) * MULT[p] | |
return sum(map(zx, range(0, 10))) % 11 | |
def svnr_checkdigit(svnr): | |
laufnr = s / (10**7) | |
datepart = svnr - laufnr * (10**7) | |
checkdigit = _checkdigit(svnr) | |
while checkdigit == 10: | |
# in case of 10 a rule is to increase the laufnummer | |
# and check again | |
laufnr += 1 | |
svnr = laufnr * 10**7 + datepart | |
checkdigit = _checkdigit(svnr) | |
return checkdigit |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment