""" Report posledních receptů — generuje HTML soubor. Spuštění: python report/report_predpisy.py Výstup: report/report_predpisy.html """ from pathlib import Path from datetime import date import pymysql import pymysql.cursors # ── Konfigurace ─────────────────────────────────────────────────────────────── DB = dict( host = "192.168.1.76", user = "root", password = "Vlado9674+", database = "medicus", charset = "utf8mb4", cursorclass = pymysql.cursors.DictCursor, ) LIMIT = 100 VYSTUP = Path(__file__).parent / "report_predpisy.html" # ── Odbornosti ──────────────────────────────────────────────────────────────── def nacti_odbornosti(conn): with conn.cursor() as cur: cur.execute(""" SELECT vp.icp, o.nazev FROM vzp_pracoviste vp JOIN odbornost o ON o.kod = vp.odbornost WHERE CURDATE() BETWEEN vp.platnost_od AND vp.platnost_do ORDER BY vp.platnost_od DESC """) result = {} for row in cur.fetchall(): result.setdefault(row["icp"], row["nazev"]) return result def odbornost_z_icp(icp, slovnik): if not icp or len(icp) < 3: return "" return slovnik.get(icp, f"odb. {icp[-3:]}") # ── Data ────────────────────────────────────────────────────────────────────── def nacti_predpisy(conn, limit): with conn.cursor() as cur: cur.execute(""" SELECT p.datum_vystaveni, z.pacient_prijmeni, z.pacient_jmena, z.pacient_datum_narozeni, COALESCE(v.nazev, p.nazev) AS vydany_lek, v.nazev IS NULL AS nevyzvednuto, p.atc, p.navod, pr.prijmeni AS lekar_prijmeni, pr.jmena AS lekar_jmena, pr.icp, pr.pzs_nazev, pr.ulice, pr.psc, pr.mesto, rd.stav, rd.druh_pojisteni FROM predpis p JOIN zprava z ON z.id = p.zprava_id JOIN predepisujici pr ON pr.lekar_kod = p.kod_predepisujiciho LEFT JOIN vydej v ON v.id_lp_predpis = p.id_lp_predpis LEFT JOIN recept_plp rp ON rp.id_lp = p.id_lp_predpis LEFT JOIN recept_doklad rd ON rd.id_dokladu = rp.id_dokladu ORDER BY p.datum_vystaveni DESC, p.id DESC LIMIT %s """, (limit,)) return cur.fetchall() # ── HTML ────────────────────────────────────────────────────────────────────── def stav_badge(stav, nevyzvednuto): if nevyzvednuto: return 'nevyzvednut' if stav == "PLNE_VYDANY": return 'vydán' if stav == "CASTECNE_VYDANY": return 'část. vydán' if stav == "ZRUSENY": return 'zrušen' if stav == "PRIPRAVOVANY": return 'připravován' if stav == "PREDEPSANY": return 'předepsán' return "" def e(s): """HTML escape.""" if s is None: return "" return str(s).replace("&", "&").replace("<", "<").replace(">", ">") def render_html(rows, odbornosti, dnes): radky = [] for i, r in enumerate(rows, 1): lekar = f"{e(r['lekar_prijmeni'])} {e(r['lekar_jmena'])}".strip() pacient = f"{e(r['pacient_prijmeni'])} {e(r['pacient_jmena'])}".strip() odb = e(odbornost_z_icp(r["icp"], odbornosti)) adresa = ", ".join(filter(None, [e(r["pzs_nazev"]), e(r["ulice"]), f"{e(r['psc'])} {e(r['mesto'])}".strip()])) badge = stav_badge(r["stav"], r["nevyzvednuto"]) tr_class = "tr-nv" if r["nevyzvednuto"] else ("tr-even" if i % 2 == 0 else "") radky.append(f"""
Vygenerováno: {dnes} | Počet záznamů: {len(rows)}
| # | Datum | Pacient | Vydaný lék | Návod | Lékař / Odbornost | Pracoviště |
|---|