Files
ordinaceprojekt/Recepty/REPORT_LEKY.md
T
Vladimir Buzalka adb84523cd Přidán podprojekt Recepty (eRecept SÚKL)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-19 07:06:17 +02:00

3.0 KiB
Raw Blame History

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)

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 100185 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:

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á