# Kontext práce — IWRS Notifications Pipeline
## Datum: 2026-06-01

## Co bylo uděláno

### Nové soubory
- `download_subject_notifications.py` — standalone skript pro stažení notifikací (referenční, nepoužívaný v pipeline)
- `test_notifications.py` — testovací skript pro jednoho pacienta (CZ100222003 / UCO3001)
- `create_iwrs_tables.py` — jednorázový skript pro vytvoření MySQL tabulek

### Upravené soubory
- `download_subject_details.py` — přidáno stahování notifikací (PDF + JSON) pro každý subjekt přímo v loopě
- `import_to_mysql.py` — přidána funkce `import_notifications()` která importuje JSON+PDF do DB a přesouvá do `Zpracováno/`
- `create_iwrs_tables.sql` — přidána tabulka `iwrs_notifications`
- `run_all.py` — krok 2 nyní volá `dsd.run()` z `download_subject_details.py`

## Jak to funguje

### Stahování notifikací (v `download_subject_details.py`)
1. Při výběru subjektu se zachytí `table_1` API response (obsahuje notifikace s `pk`, `et_title`, `label`, `body`, `actual_date_raw`)
2. Porovná `pk` s DB (`iwrs_notifications`) — stahuje jen nové
3. Stáhne PDF přes `page.request.get()` s Bearer tokenem (JWT se načítá čerstvě před každým requestem)
4. Uloží PDF + JSON do `IncomingSourceReportsDetails/{study}/`
5. Název souboru: `{actual_date_raw}_{label_s_podtržítky}.pdf` (při kolizi přidá `_pk{pk}`)

### API endpointy
- **Notifikace data**: `POST /_/p/{instance_id}/api/v1/reports_api/report_data?path=patient_detail_report&id={subject}&key=table_1&unblinded=false`
- **PDF download**: `GET /_/p/{instance_id}/api/v1/meta_api/pdfnotification?pk={pk}&title={et_title}&html=true`
- **app_instances** (pro zjištění instance_id): `GET /_/api/dispatch/app_instances/`
- Headers: `Authorization: Bearer {JWT}`, `lang: en`, `prancer_study: {study_code}`

### Instance ID mapping
- `77242113UCO3001` → `/_/p/106`
- `42847922MDD3003` → `/_/p/70`
- `77242113CRD3001` → `/_/p/103`

### Import (`import_to_mysql.py`)
- Čte všechny `.json` soubory z `IncomingSourceReportsDetails/{study}/`
- Načte příslušné `.pdf` jako binární data
- Uloží do tabulky `iwrs_notifications` (UNIQUE KEY na `pk` — bez duplikátů)
- Přesune soubory do `IncomingSourceReportsDetails/{study}/Zpracováno/`

## MySQL tabulka `iwrs_notifications`
```sql
id, study, subject, pk (UNIQUE), title, label, event, actual_date, text (TEXT), pdf (MEDIUMBLOB), source_file, imported_at
```

## Aktuální stav
- UCO3001: ~76 notifikací importováno
- MDD3003: ~119 notifikací importováno (část 403 chyb — JWT expiroval, opraveno načítáním JWT čerstvě)
- MDD3003 notifikace s 403 čekají na příští `run_all.py` (soubory nejsou v `Zpracováno`, takže se znovu stáhnou)

## Co zbývá / možná vylepšení
- Ověřit že MDD3003 403 chyby jsou opraveny (JWT refresh)
- `CZ100132003` UCO3001 — timeout při stahování XLS (subjekt přeskočen, zkusit znovu)
- Případně přidat retry logiku pro timeout
