# download_lab_reports_v1.2.py **Verze:** 1.2  |  **Datum:** 2026-06-16 Stahuje PDF **Lab Reports** ze `xsp.labcorp.com` (studie **77242113UCO3001**, interní `36940`, 10 CZ center) přímo do **MongoDB** (`covance.labreports`) — metadata + skutečné PDF (inline Binary). **Na disk neukládá.** ## Klíč `record_id = reportId` `reportId` = stabilní 32-hex ID dokumentu z dat AG Gridu, **napříč všemi řádky unikátní** (ověřeno: 997 řádků → 997 unikátních `reportId`/`fileId`). **Proč ne metadata:** na portálu se reálně vyskytují **různá PDF se shodnými viditelnými metadaty** — stejný `site|subject|accession|visit|posted` i na minutu (korekce výsledku / reissue se shodným časem Posted). Ověřeno: 5 souborů pro accession `6227697718` má 5 různých sha256. Klíčování podle metadat (v1.1) by je chybně sloučilo → **ztráta dat**. `reportId` to řeší. ## Odkud data Z **in-memory dat AG Gridu** přes grid API (`__agComponent.gridApi`): `getDisplayedRowAtIndex(i).data` → `reportId`, `fileLinks[].fileId`+`fileName` (server), `postedDateTime` (ISO), `siteNum`, `subjectNumber`. `reportId` jde přečíst **bez scrollování** → levný pre-check „už mám". Accession/Visit/Collected leží v gridu níž (ve struktuře `visits`), proto se berou z buněk (po scrollu). **Pozn.:** `accession` se nijak nepočítá ani neodvozuje — je to reálný identifikátor přidělený kitu v laboratoři; čte se **doslova** z buňky a ukládá 1:1 (`accession` i `fields.Accession`). ## Stahování + inkrementálně Klik na „English" → `expect_download`, PDF z `download.path()` (bez `save_as`). List je Posted DESC; ze seznamu (rowIndex, reportId) se shora hledá první už uložený `reportId` → **stop-at-known** (zbytek je starší a v Mongo je). Stahují se jen nové (nahoře). Korekce = nový `reportId` → uloží se jako nový. ## MongoDB dokument `record_id`(=reportId), `study`, `studyCode`, `type`, `site`, `subject`, `accession`, `visit`, `collected`, `posted`, `postedIso`, `fileId`, `serverFileName`, `fields` (sloupce tabulky), `fileName` (náš název), **`pdf`** (Binary ~260 KB), `pdfSize`, `pdfSha256`, `firstSeen`, `lastSeen`, `history[]`. Upsert: nový→insert; změna sha/fields→push history+update; shoda→jen `lastSeen`. Název v `fileName`: `77242113UCO3001 {odběr} {Site} {Subject} {Visit} {Accession} posted {posted}.pdf` ## Spuštění (z terminálu uživatele — otevírá GUI Chrome) ``` python download_lab_reports_v1.2.py --dry-run # vypíše NOVÉ, nestahuje python download_lab_reports_v1.2.py --limit 5 # test: 5 nových python download_lab_reports_v1.2.py # inkrementální běh python download_lab_reports_v1.2.py --full # rekonciliace přes vše ``` ## Nahrazuje `download_lab_reports_v1.0.py` (disk) a `v1.1` (klíč podle metadat — chybný). Obě → `TRASH/`.