# Report: Pravidelná medikace z lékového záznamu ## Soubor `report_server.py` — HTTP server na portu 8765, generuje HTML report z MySQL (`medicus`). Spuštění: `.venv/Scripts/python report_server.py` --- ## Zdroj dat Tabulky v MySQL (db `medicus`): | Tabulka | Obsah | |---------|-------| | `predpis` | předepsané léky, ATC, datum, množství, návod | | `vydej` | vydání léku lékárnou | | `predepisujici` | lékař — UUID, jméno, IČZ, IČP | | `vydavajici` | lékárník — UUID, jméno, PZS | | `vzp_pracoviste` | VZP číselník IČP → odbornost (import týdně) | --- ## Algoritmus pravidelnosti ### Krok 1 — Základní metriky (SQL) ```sql GROUP BY LEFT(atc, 5) -- ATC na 5. místě (4. úroveň) pocet_predpisu = COUNT(DISTINCT predpis.id) celkove_mnozstvi = SUM(mnozstvi) avg_mnozstvi = AVG(mnozstvi) rozpeti_dni = DATEDIFF(MAX(datum), MIN(datum)) ``` ### Krok 2 — Výpočet normalizovaného intervalu (Python) ``` avg_interval = rozpeti_dni / (pocet_predpisu - 1) # průměr dní mezi předpisy norm_interval = avg_interval / avg_mnozstvi # normalizováno na 1 balení ``` `norm_interval` = odhad, na kolik dní jedno balení vystačí. ### Krok 3 — Klasifikace | Kategorie | Podmínka | |-----------|----------| | **nepravidelný** | `pocet_predpisu < 2` nebo `rozpeti_dni = 0` | | **dle potřeby** (PRN) | většina návodů obsahuje klíčová slova: *dle potřeby, p.p., D.p., při bolesti* | | **pravidelný** | `norm_interval ≤ 100 dní` | | **možná** | `norm_interval 100–185 dní` | | **epizodický** | `norm_interval > 185 dní` | > **Důležité:** `rozpeti_dni = 0` znamená, že všechny předpisy byly vystaveny ve stejný den > (lékař dal více balení najednou). Není to opakované předepisování — musí být klasifikováno > jako nepravidelné. ### Krok 4 — Řazení výstupu 1. Pravidelné 2. Možná pravidelné 3. Epizodické 4. PRN V rámci kategorie sestupně dle počtu vydání. --- ## Odbornost předepisujícího JOIN: `predpis → predepisujici → vzp_pracoviste` Číselník VZP je aktuální snapshot — neobsahuje historická data. Recepty starší než `platnost_od` nejnovějšího záznamu pro dané IČP by JOIN na datum nesplnily. **Řešení:** vždy vzít nejnovější záznam pro IČP bez ohledu na datum předpisu: ```sql LEFT JOIN vzp_pracoviste vp ON vp.icp = pre.icp AND vp.id = ( SELECT id FROM vzp_pracoviste WHERE icp = pre.icp ORDER BY platnost_od DESC LIMIT 1 ) ``` Odbornost se prakticky nemění — IČP ordinace praktického lékaře zůstane `001` bez ohledu na datum předpisu. --- ## Barevné kódování reportu | Barva řádku | Kategorie | |-------------|-----------| | Zelená | pravidelný | | Žlutá | možná pravidelný | | Šedá | epizodický | | Červená | dle potřeby (PRN) | | Odznak odbornosti | Barva | |-------------------|-------| | Praktický lékař (001, 002) | zelená | | Specialista | modrá | | Neznámá | šedá |