#!/usr/bin/env python3 # -*- coding: utf-8 -*- import sys as _sys _sys.stdout.reconfigure(encoding="utf-8", errors="replace") _sys.stderr.reconfigure(encoding="utf-8", errors="replace") """ 01_parse_seznam.py ================== Najde a rozparsuje dávky VZP – Seznam registrovaných pojištěnců (III-1.1.2). Formát souboru: Fxxxmmur.nnn, pevná šířka, kódování CP852. Záhlaví (typ H, délka 20): HTYP C 1 0 typ věty 'H' HICP N 8 1 IČP lékaře HPUP N 5 9 počet uznávaných pojištěnců HROK N 2 14 poslední dvojčíslí roku HMES N 2 16 měsíc HDEN N 2 18 den Registrace (typ I, délka 82): ITYP C 1 0 typ věty 'I' IPOR N 4 1 pořadové číslo IVS N 2 5 věková skupina IPRI C 30 7 příjmení IJME C 24 37 jméno ICIP C 10 61 číslo pojištěnce IDUOD D 8 71 datum uznání registrace (DDMMRRRR) ICPO C 3 79 kód pojišťovny """ import re from pathlib import Path from datetime import date, timedelta DAVKY_DIR = Path(r"U:\Dropbox\Ordinace\Dokumentace_ke_zpracování\Zúčtovací zprávy\111 VZP Podání") ENCODING = "cp852" def parse_davku(path: Path) -> dict: """Vrátí dict s klíči 'hlavicka' a 'pojistenci'.""" lines = path.read_bytes().splitlines() hlavicka = None pojistenci = [] for raw in lines: line = raw.decode(ENCODING, errors="replace") if not line: continue if line[0] == "H": hlavicka = { "icp": line[1:9].strip(), "pocet": int(line[9:14].strip() or 0), "rok": 2000 + int(line[14:16]), "mesic": int(line[16:18]), "den": int(line[18:20]), } elif line[0] == "I": if len(line) < 82: continue dat_raw = line[71:79] # DDMMRRRR try: datum = date(int(dat_raw[4:8]), int(dat_raw[2:4]), int(dat_raw[0:2])) except ValueError: datum = None pojistenci.append({ "por": int(line[1:5].strip() or 0), "vs": line[5:7].strip(), "prijmeni": line[7:37].strip(), "jmeno": line[37:61].strip(), "cip": line[61:71].strip(), "datum_od": datum, "pojistovna": line[79:82].strip(), }) return {"hlavicka": hlavicka, "pojistenci": pojistenci, "soubor": path.name} def najdi_davky(adresar: Path) -> list[Path]: """Vrátí seřazený seznam souborů odpovídajících vzoru Fxxx*.nnn.""" return sorted( [p for p in adresar.iterdir() if re.search(r"F\d{3}.*\.\d{3}$", p.name, re.IGNORECASE)], key=lambda p: p.name ) def tiskni_davku(d: dict) -> None: h = d["hlavicka"] if h: print(f"\n=== {d['soubor']} ===") print(f" IČP: {h['icp']} | datum: {h['den']:02d}.{h['mesic']:02d}.{h['rok']} | pojištěnců: {h['pocet']}") print(f" {'#':>4} {'Příjmení':<30} {'Jméno':<24} {'ČIP':<10} {'Datum od':>10} Pojiš.") print(f" {'-'*4} {'-'*30} {'-'*24} {'-'*10} {'-'*10} {'-'*6}") else: print(f"\n=== {d['soubor']} === (záhlaví chybí)") for p in d["pojistenci"]: datum_str = p["datum_od"].strftime("%d.%m.%Y") if p["datum_od"] else "?" print(f" {p['por']:>4} {p['prijmeni']:<30} {p['jmeno']:<24} {p['cip']:<10} {datum_str:>10} {p['pojistovna']}") # ── MAIN ────────────────────────────────────────────────────────────────────── davky = najdi_davky(DAVKY_DIR) print(f"Nalezeno dávek: {len(davky)}") for cesta in davky: data = parse_davku(cesta) tiskni_davku(data) print(f"\nCelkem dávek: {len(davky)}")