diff --git a/.claude/settings.local.json b/.claude/settings.local.json new file mode 100644 index 0000000..f521b32 --- /dev/null +++ b/.claude/settings.local.json @@ -0,0 +1,13 @@ +{ + "permissions": { + "allow": [ + "Bash(mysql -u root -e \"SELECT pr.prijmeni, pr.jmena, pr.pzs_nazev, pr.mesto, COUNT\\(*\\) AS pocet_predpisu FROM pacient pac JOIN zprava z ON z.pacient_id = pac.id JOIN predpis p ON p.zprava_id = z.id JOIN predepisujici pr ON pr.lekar_kod = p.kod_predepisujiciho WHERE pac.prijmeni = 'Strnadová' AND pac.jmena = 'Jitka' GROUP BY pr.lekar_kod, pr.prijmeni, pr.jmena, pr.pzs_nazev, pr.mesto ORDER BY pocet_predpisu DESC;\" medicus)", + "Bash(where mysql:*)", + "Read(//c/Program Files/**)", + "Read(//c/xampp/mysql/**)", + "Bash(find /c -name \"mysql.exe\")", + "Bash(python3 -c ':*)", + "Bash(python -c ':*)" + ] + } +} diff --git a/Dotazy/prehled_pacienta.py b/Dotazy/prehled_pacienta.py new file mode 100644 index 0000000..2ce24bd --- /dev/null +++ b/Dotazy/prehled_pacienta.py @@ -0,0 +1,183 @@ +""" +Prehled lekoveho zaznamu pacienta z MySQL. + +Zobrazuje: + 1. Lekare, kteri pacientovi predepsali leky (sestupne podle poctu predpisu) + 2. Vsechny predpisy od zadaneho data — s nazvem VYDANEHO leku (ne predepsaneho) + +Nastaveni: + RODNE_CISLO ... rodne cislo pacienta (cifry, bez lomitka) + DATUM_OD ... predpisy od tohoto data ve formatu DD.MM.RRRR (None = vsechny) +""" + +from datetime import date, datetime +import sys +import fdb +import pymysql +import pymysql.cursors + +# ── NASTAVENÍ ───────────────────────────────────────────────────────────────── +RODNE_CISLO = "765821/1234" # s lomitkem i bez lomitka +DATUM_OD = "01.01.2025" # None = vsechny predpisy +# ───────────────────────────────────────────────────────────────────────────── + +FB = dict( + dsn = r"localhost:c:\medicus 3\data\medicus.fdb", + user = "SYSDBA", + password= "masterkey", + charset = "win1250", +) + +DB = dict( + host = "192.168.1.76", + user = "root", + password = "Vlado9674+", + database = "medicus", + charset = "utf8mb4", + cursorclass = pymysql.cursors.DictCursor, +) + +SEP = "-" * 100 +SEP2 = "-" * 140 + + +def parse_datum(s, nazev): + try: + return datetime.strptime(s, "%d.%m.%Y").date() + except (ValueError, TypeError): + sys.exit(f"Nespravny format data '{nazev}': '{s}'. Pouzijte DD.MM.RRRR.") + + +def normalizuj_rc(rc): + """Odstrani lomitko a mezery z rodneho cisla.""" + return rc.replace("/", "").replace(" ", "").strip() + + +def najdi_v_firebirdu(rodne_cislo): + """Vrati prijmeni, jmeno a datum narozeni z Medicusu podle rodneho cisla.""" + rc = normalizuj_rc(rodne_cislo) + conn = fdb.connect(**FB) + try: + cur = conn.cursor() + cur.execute( + "SELECT KAR.PRIJMENI, KAR.JMENO, KAR.DATNAR " + "FROM KAR WHERE KAR.RODCIS = ?", + (rc,) + ) + row = cur.fetchone() + if not row: + sys.exit(f"Rodne cislo '{rodne_cislo}' nenalezeno v Medicusu.") + return {"prijmeni": row[0].strip(), "jmeno": row[1].strip(), "datnar": row[2]} + finally: + conn.close() + + +def najdi_pacienty(cur, prijmeni, datum_narozeni): + cur.execute( + "SELECT id, prijmeni, jmena, datum_narozeni " + "FROM pacient WHERE prijmeni = %s AND datum_narozeni = %s", + (prijmeni, datum_narozeni), + ) + return cur.fetchall() + + +def tiskni_lekare(cur, pacient_id, prijmeni, jmena, datum_narozeni): + cur.execute( + """ + SELECT pr.prijmeni, pr.jmena, + CONCAT(pr.pzs_nazev, ', ', pr.ulice, ', ', pr.psc, ' ', pr.mesto) AS adresa, + COUNT(*) AS pocet_predpisu + FROM zprava z + JOIN predpis p ON p.zprava_id = z.id + JOIN predepisujici pr ON pr.lekar_kod = p.kod_predepisujiciho + WHERE z.pacient_id = %s + GROUP BY pr.lekar_kod, pr.prijmeni, pr.jmena, pr.pzs_nazev, pr.ulice, pr.psc, pr.mesto + ORDER BY pocet_predpisu DESC + """, + (pacient_id,), + ) + rows = cur.fetchall() + + print(f"\n{SEP}") + print(f" PACIENT: {prijmeni} {jmena} | nar. {datum_narozeni.strftime('%d.%m.%Y')}") + print(SEP) + print(f"\nPREDEPISUJICI LEKARI:") + print(f"{'#':<4} {'Lekar':<30} {'Pracoviste a adresa':<55} {'Predpisu':>8}") + print(SEP) + for i, r in enumerate(rows, 1): + lekar = f"{r['prijmeni']} {r['jmena']}" + print(f"{i:<4} {lekar:<30} {r['adresa']:<55} {r['pocet_predpisu']:>8}") + if not rows: + print(" Zadne predpisy nenalezeny.") + + +def tiskni_predpisy(cur, pacient_id, datum_od): + podminka = "AND p.datum_vystaveni >= %s" if datum_od else "" + params = (pacient_id, datum_od) if datum_od else (pacient_id,) + + cur.execute( + f""" + SELECT p.datum_vystaveni, + COALESCE(v.nazev, '(nevyzvednuto)') AS vydany_lek, + p.atc, + p.navod, + pr.prijmeni, + pr.jmena, + CONCAT(pr.pzs_nazev, ', ', pr.ulice, ', ', pr.psc, ' ', pr.mesto) AS adresa + FROM zprava z + JOIN predpis p ON p.zprava_id = z.id + JOIN predepisujici pr ON pr.lekar_kod = p.kod_predepisujiciho + LEFT JOIN vydej v ON v.id_lp_predpis = p.id_lp_predpis + WHERE z.pacient_id = %s + {podminka} + ORDER BY p.datum_vystaveni DESC + """, + params, + ) + rows = cur.fetchall() + + od_text = f"od {datum_od.strftime('%d.%m.%Y')}" if datum_od else "vse" + print(f"\nVSECHNY PREDPISY ({od_text}) — celkem {len(rows)}:") + print(f"{'#':<4} {'Datum':<12} {'Vydany lek':<30} {'ATC':<8} {'Navod':<25} {'Lekar':<25} Adresa") + print(SEP2) + for i, r in enumerate(rows, 1): + datum = r["datum_vystaveni"].strftime("%d.%m.%Y") + lekar = f"{r['prijmeni']} {r['jmena']}" + lek = (r["vydany_lek"] or "")[:29] + navod = (r["navod"] or "")[:24] + atc = (r["atc"] or "") + print(f"{i:<4} {datum:<12} {lek:<30} {atc:<8} {navod:<25} {lekar:<25} {r['adresa']}") + if not rows: + print(" Zadne predpisy nenalezeny.") + print() + + +def main(): + datum_od = parse_datum(DATUM_OD, "DATUM_OD") if DATUM_OD else None + + # 1. Najdi pacienta v Medicusu (Firebird) podle rodneho cisla + fb_pac = najdi_v_firebirdu(RODNE_CISLO) + prijmeni = fb_pac["prijmeni"] + datum_narozeni = fb_pac["datnar"] + + print(f"\nFirebird: nalezen {prijmeni} {fb_pac['jmeno']} nar. {datum_narozeni}") + + # 2. Dotaz do MySQL + conn = pymysql.connect(**DB) + try: + with conn.cursor() as cur: + pacienti = najdi_pacienty(cur, prijmeni, datum_narozeni) + + if not pacienti: + print(f"Pacient '{prijmeni}' nar. {datum_narozeni} nema zaznam v MySQL (lekovy zaznam nebyl stazeny).") + return + + for pac in pacienti: + tiskni_lekare(cur, pac["id"], pac["prijmeni"], pac["jmena"], pac["datum_narozeni"]) + tiskni_predpisy(cur, pac["id"], datum_od) + finally: + conn.close() + + +if __name__ == "__main__": + main() diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..ba81b72 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,7 @@ +requests +requests-pkcs12 +pymysql +fdb +zeep +mysql-connector-python +playwright diff --git a/setup.ps1 b/setup.ps1 new file mode 100644 index 0000000..2782897 --- /dev/null +++ b/setup.ps1 @@ -0,0 +1,43 @@ +# setup.ps1 - vytvor .venv a nainstaluj zavislosti +# Spustit jednou po naklonovani projektu: +# .\setup.ps1 + +$PythonExe = "C:\Python\python.exe" +$VenvDir = Join-Path $PSScriptRoot ".venv" + +# kontrola Pythonu +if (-not (Test-Path $PythonExe)) { + Write-Error "Python nenalezen na '$PythonExe'. Uprav cestu v setup.ps1." + exit 1 +} + +Write-Host "Python: $PythonExe" +& $PythonExe --version + +# vytvoreni venv +if (Test-Path $VenvDir) { + Write-Host ".venv jiz existuje, preskakuji vytvoreni." +} else { + Write-Host "Vytvarim .venv ..." + & $PythonExe -m venv $VenvDir + if ($LASTEXITCODE -ne 0) { Write-Error "Nepodarilo se vytvorit venv."; exit 1 } +} + +# instalace zavislosti +$Pip = Join-Path $VenvDir "Scripts\pip.exe" +Write-Host "Instaluji zavislosti z requirements.txt ..." +& $Pip install --upgrade pip --quiet +& $Pip install -r (Join-Path $PSScriptRoot "requirements.txt") +if ($LASTEXITCODE -ne 0) { Write-Error "pip install selhal."; exit 1 } + +# playwright browsers +$Playwright = Join-Path $VenvDir "Scripts\playwright.exe" +Write-Host "Instaluji Playwright browsery (chromium) ..." +& $Playwright install chromium +if ($LASTEXITCODE -ne 0) { + Write-Warning "Playwright install chromium selhal - zkus rucne: .venv\Scripts\playwright install chromium" +} + +Write-Host "" +Write-Host "Hotovo! Aktivuj prostredi prikazem:" +Write-Host " .venv\Scripts\Activate.ps1"