# download_lab_reports_v1.1.py **Verze:** 1.1  |  **Datum:** 2026-06-16 Stahuje PDF **Lab Reports** ze `xsp.labcorp.com` (studie **77242113UCO3001**, interní `36940`, 10 CZ center) a ukládá je **přímo do MongoDB** — metadata z tabulky + skutečné PDF (inline Binary). **Na disk neukládá.** ## Princip Playwright + perzistentní profil (`browser_profile/`), jednorázový login, klik na „English" ve sloupci Download. PDF bajty se čtou z Playwright temp souboru (`download.path()`), `save_as` se nevolá → nic netrvalého na disku. Materializaci adresáře z Monga řeší samostatný (budoucí) skript. ## Inkrementálně (stop-at-known) List je řazený **Posted DESC** (nejnovější nahoře). Skript jde shora dolů; u každého řádku nejdřív přečte metadata a spočítá `record_id`. Jakmile narazí na **už uložený** report, **končí** (vše pod ním je starší a už v Mongo je) — stahuje tedy jen nové. **Korekce výsledků** = stejný report znovu vystavený s **novým Posted** → nový `record_id` → stáhne se jako nový, původní zůstává. ## MongoDB - db `covance`, kolekce **`labreports`** - klíč `record_id = "{site}|{subject}|{accession}|{visit}|{posted}"` (Posted vč. času odlišuje reissue) - dokument: `study`, `studyCode`, `type`, `site`, `subject`, `accession`, `visit`, `collected` (yyyy-mm-dd), `posted` (yyyy-mm-dd HH:MM), `fields` (sloupce tabulky), `fileName`, **`pdf`** (Binary ~260 KB), `pdfSize`, `pdfSha256`, `firstSeen`, `lastSeen`, `history[]` - upsert: nový → insert; změna sha/fields → push do `history` + update; shoda → jen `lastSeen` ## Spuštění ``` python download_lab_reports_v1.1.py --dry-run # jen vypíše NOVÉ, nestahuje, nepíše python download_lab_reports_v1.1.py --limit 5 # test: max 5 řádků python download_lab_reports_v1.1.py # inkrementální běh (stop-at-known) python download_lab_reports_v1.1.py --full # projít vše (rekonciliace) ``` ## Pozn. ke spuštění Otevírá viditelné GUI Chrome — musí běžet z **terminálu uživatele s desktop session** (ne headless/agent prostředí). ## Nahrazuje `download_lab_reports_v1.0.py` (ukládal na disk) — po dokončení jeho běhu přesunout v1.0 (.py i .md) do `TRASH/`.