This commit is contained in:
2026-06-16 14:32:28 +02:00
parent b825e4ee7c
commit f385d7bf0b
95 changed files with 43120 additions and 0 deletions
@@ -0,0 +1,56 @@
# 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/`.