# 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á |
