Skip to content

Instantly share code, notes, and snippets.

@dusnm
Last active July 23, 2023 23:33
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save dusnm/4d674e723b47ab32d9d2798450ff8355 to your computer and use it in GitHub Desktop.
Save dusnm/4d674e723b47ab32d9d2798450ff8355 to your computer and use it in GitHub Desktop.
Матични број
#!/usr/bin/env python3
import sys
from datetime import date
def parse_umcn_dob(dob: str) -> date:
day = int(dob[0:2])
month = int(dob[2:4])
year = int(f"2{dob[4:7]}") if dob[5] == "0" else int(f"1{dob[4:7]}")
return date(day=day, month=month, year=year)
def parse_umcn_region(region: str) -> str|None:
regions = {
'70': 'Српски држављани регистровани у иностранству',
'71': 'Београд',
'72': 'Регион Шумадије и Поморавља',
'73': 'Ниш',
'74': 'Регион Јужне Мораве',
'75': 'Зајечар',
'76': 'Регион Подунавља',
'77': 'Регион Подриња и Колубаре',
'78': 'Краљево',
'79': 'Ужице',
'80': 'Нови Сад',
'81': 'Сомбор',
'82': 'Суботица',
'84': 'Кикинда',
'85': 'Зрењанин',
'86': 'Панчево',
'87': 'Вршац',
'88': 'Рума',
'89': 'Сремска Митровица',
'91': 'Приштина',
'92': 'Косовска Митровица',
'93': 'Пећ',
'94': 'Ђаковица',
'95': 'Призрен',
'96': 'Гњилане',
}
return regions[region] if region in regions else None
def parse_sex(sex: int) -> str|None:
if sex < 0 or sex > 999:
return None
if sex < 500:
return "мушки"
return "женски"
def parse_and_validate_control_digit(umcn: str) -> dict:
digits = []
for digit in umcn:
digits.append(int(digit))
control = digits[len(digits) - 1]
calculated_control = 11 - ((
7 * (digits[0] + digits[6]) +
6 * (digits[1] + digits[7]) +
5 * (digits[2] + digits[8]) +
4 * (digits[3] + digits[9]) +
3 * (digits[4] + digits[10]) +
2 * (digits[5] + digits[11])
) % 11)
if calculated_control == 10 or calculated_control == 11:
calculated_control = 0
return {
'digit': control,
'valid': control == calculated_control,
}
def parse_umcn(umcn: str) -> dict|None:
if len(umcn) != 13:
return None
dob = umcn[0:7]
region = umcn[7:9]
sex = umcn[9:12]
return {
'dob': parse_umcn_dob(dob),
'region': parse_umcn_region(region),
'sex': parse_sex(int(sex)),
'checksum': parse_and_validate_control_digit(umcn),
}
def main() -> None:
umcn = input("Упиши свој матични број:")
if not umcn.isdigit():
print("невалидан унос", file=sys.stderr)
sys.exit(1)
print(parse_umcn(umcn))
if __name__ == '__main__':
main()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment