# 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