z230
This commit is contained in:
@@ -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/`.
|
||||
Reference in New Issue
Block a user