adb84523cd
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
104 lines
3.0 KiB
Markdown
104 lines
3.0 KiB
Markdown
# 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á |
|