z230
This commit is contained in:
@@ -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 ':*)"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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()
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
requests
|
||||||
|
requests-pkcs12
|
||||||
|
pymysql
|
||||||
|
fdb
|
||||||
|
zeep
|
||||||
|
mysql-connector-python
|
||||||
|
playwright
|
||||||
@@ -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"
|
||||||
Reference in New Issue
Block a user