Přidán podprojekt Recepty (eRecept SÚKL)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Vladimir Buzalka
2026-04-19 07:06:17 +02:00
parent a59a565586
commit adb84523cd
11334 changed files with 113692 additions and 0 deletions
+103
View File
@@ -0,0 +1,103 @@
# 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 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:
```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á |