notebookvb

This commit is contained in:
Vladimir Buzalka
2026-05-03 07:02:22 +02:00
parent d013e43d34
commit 371eed9971
9 changed files with 1260 additions and 0 deletions
@@ -0,0 +1,114 @@
#!/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)}")