Files
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

104 lines
3.0 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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á |