""" 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""" {i} {e(r['datum_vystaveni'])} {pacient}
{e(r['pacient_datum_narozeni'])} {e(r['vydany_lek'])}{badge}
{e(r['atc'])} {e(r['navod'])} {lekar}
{odb} {adresa} """) return f""" Přehled receptů

Přehled receptů — posledních {LIMIT}

Vygenerováno: {dnes}  |  Počet záznamů: {len(rows)}

{"".join(radky)}
# Datum Pacient Vydaný lék Návod Lékař / Odbornost Pracoviště
""" def main(): conn = pymysql.connect(**DB) print("Načítám odbornosti...") odbornosti = nacti_odbornosti(conn) print(f"Načítám posledních {LIMIT} receptů...") rows = nacti_predpisy(conn, LIMIT) conn.close() html = render_html(rows, odbornosti, date.today().isoformat()) VYSTUP.write_text(html, encoding="utf-8") print(f"Hotovo: {VYSTUP}") if __name__ == "__main__": main()