Přidán podprojekt Recepty (eRecept SÚKL)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,133 @@
|
||||
"""
|
||||
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 VARCHAR(20),
|
||||
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 <name>
|
||||
cur.execute(ddl)
|
||||
print(f" OK {tabulka}")
|
||||
conn.commit()
|
||||
print("\nHotovo.")
|
||||
finally:
|
||||
conn.close()
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
vytvor_tabulky()
|
||||
Reference in New Issue
Block a user