""" Vytvoří tabulky recept_doklad a recept_plp v MySQL databázi medicus. Spuštění: python 09_VytvorTabulky.py Tabulky: recept_doklad — jeden řádek na celý recept (ID_Dokladu) recept_plp — jeden řádek na PLP položku (id_lp = predpis.id_lp_predpis) Bezpečné opakované spuštění — používá CREATE TABLE IF NOT EXISTS. Neprovádí DROP. """ import pymysql import pymysql.cursors DB = dict( host = "192.168.1.76", user = "root", password = "Vlado9674+", database = "medicus", charset = "utf8mb4", cursorclass = pymysql.cursors.DictCursor, ) DDL = [ # ── recept_doklad ───────────────────────────────────────────────────────── # Jeden řádek na celý recept (ID_Dokladu = ERP kód, např. PPIBVF93285E). # Data na úrovni dokladu: stav, platnost, pacient snapshot, předepisující. # # stav_terminal: # 0 = PREDEPSANY nebo CASTECNE_VYDANY → skript má znovu stahovat XML # 1 = PLNE_VYDANY nebo ZRUSENY nebo expirovaný → stahování ukončeno # # xml_soubor: relativní cesta k poslednímu naparsovanému XML souboru """ CREATE TABLE IF NOT EXISTS recept_doklad ( id_dokladu VARCHAR(20) NOT NULL PRIMARY KEY, -- stav a platnost stav ENUM( 'PREDEPSANY', 'CASTECNE_VYDANY', 'PLNE_VYDANY', 'ZRUSENY' ) NOT NULL, stav_terminal TINYINT(1) NOT NULL DEFAULT 0 COMMENT '1 = nepotřebuje další stahování', datum_vystaveni DATE NOT NULL, platnost_do DATE, vypis_do DATE COMMENT 'prodloužení platnosti výpisem', akutni TINYINT(1), rodina TINYINT(1) COMMENT 'ad usum proprium', opakovani INT COMMENT 'NULL = není opakovací', druh_pojisteni ENUM('VEREJNE','OSTATNI'), modry_pruh TINYINT(1), pozn VARCHAR(1000), zap_doplatek DECIMAL(10,2) COMMENT 'ZapocitatelnyDoplatekZbyvaDoLimitu', -- časové razítko z eReceptu zalozeni DATETIME, zmena DATETIME, -- předepisující lékař (FK na existující tabulku z lékového záznamu) lekar_kod CHAR(36), odbornost_kod VARCHAR(10), odbornost_nazev VARCHAR(100), lekar_email VARCHAR(100), -- pacient snapshot (hodnoty platné k datu předpisu — mohou se měnit) cp VARCHAR(10) COMMENT 'číslo pojištěnce / RČ', zp_kod CHAR(3), zp_nazev VARCHAR(100), pac_telefon VARCHAR(20), pac_notifikace ENUM('SMS','EMAIL'), pac_pohlavi ENUM('M','Z'), -- meta xml_soubor VARCHAR(255) COMMENT 'cesta k poslednímu XML souboru', stazeno DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'poslední aktualizace záznamu', FOREIGN KEY (lekar_kod) REFERENCES predepisujici (lekar_kod) ON DELETE SET NULL, INDEX idx_stav (stav), INDEX idx_stav_terminal (stav_terminal), INDEX idx_platnost (platnost_do), INDEX idx_lekar (lekar_kod) ) ENGINE=InnoDB COMMENT='Detail receptu (NacistPredpis) — jeden řádek na ID_Dokladu' """, # ── recept_plp ──────────────────────────────────────────────────────────── # Jeden řádek na PLP položku (jeden lék na receptu). # id_lp = UUID = predpis.id_lp_predpis → přímý JOIN s lékovým záznamem. # Lékové detaily (ATC, název, forma…) jsou záměrně vynechány — # jsou už v tabulce predpis, duplikovat je nemá smysl. """ CREATE TABLE IF NOT EXISTS recept_plp ( id_lp CHAR(36) NOT NULL PRIMARY KEY COMMENT 'UUID PLP = predpis.id_lp_predpis', id_dokladu VARCHAR(20) NOT NULL, uhrada ENUM('ZAKLADNI','ZVYSENA','NEHRAZENY'), prekroceni TINYINT(1), FOREIGN KEY (id_dokladu) REFERENCES recept_doklad (id_dokladu) ON DELETE CASCADE, INDEX idx_id_dokladu (id_dokladu) ) ENGINE=InnoDB COMMENT='PLP položky receptu — JOIN přes id_lp na predpis.id_lp_predpis' """, ] def vytvor_tabulky(): conn = pymysql.connect(**DB) try: with conn.cursor() as cur: for ddl in DDL: tabulka = ddl.strip().split()[5] # CREATE TABLE IF NOT EXISTS cur.execute(ddl) print(f" OK {tabulka}") conn.commit() print("\nHotovo.") finally: conn.close() if __name__ == "__main__": vytvor_tabulky()