# materialize_lab_reports_v1.0.py
**Verze:** 1.0 | **Datum:** 2026-06-16
Materializuje **Lab Reports** z MongoDB (`covance.labreports`) do **Dropboxu**.
Cíl: adresář = **identická kopie Monga** (plné zrcadlo) — doplní chybějící PDF
a **smaže přebytečné**. Žádná jiná ambice. (Opak download skriptu, který plní
Mongo z portálu.)
## Cílové cesty (klíč = `studyCode`)
```
77242113UCO3001 -> u:\Dropbox\!77242113UCO3001\#020 Reporty\LabCorp
42847922MDD3003 -> u:\Dropbox\!!42847922MDD3003\#000 Reports\LabCorp
```
## Struktura
`\\.pdf` — podsložka **per centrum**
(`CZ10003\`, …), do ní všechna PDF toho centra.
## Název souboru
= `doc.fileName` z Monga. Když víc **různých** reportů (různé `reportId`) má
v jednom centru **stejný** název, přidá se ke všem z té skupiny ` []`
→ vždy unikátní a stabilní (idempotentní zrcadlo). Běžné případy (liší se datum
Posted) zůstávají s čistým názvem.
## Zrcadlení
- **+ zapsat** chybějící (PDF binárka se z Monga tahá až teď, jen pro chybějící;
existující se shodnou velikostí se přeskočí — obsah reportu je v čase neměnný).
- **− smazat** PDF, které v Mongu nejsou; odstranit prázdné podsložky center.
- Mazání **naostro** (žádný potvrzovací krok) — je to čistý mirror.
- **Pojistka:** pokud Mongo vrátí pro studii 0 dokumentů, studie se **přeskočí**
(nesmaže celý adresář kvůli výpadku DB) — obejde `--allow-empty`.
## Spuštění (čistá Mongo+FS operace, GUI netřeba)
```
python materialize_lab_reports_v1.0.py --dry-run # jen náhled (+X/−Y), nic nezapíše
python materialize_lab_reports_v1.0.py # zrcadlí naostro
python materialize_lab_reports_v1.0.py --verify # u existujících porovná i sha256
python materialize_lab_reports_v1.0.py --study 42847922MDD3003 # jen jedna studie
```
## Návaznost
Plní [[project_covance_labreports]] download_lab_reports_v1.4 (portál → Mongo),
tento skript dělá druhý směr (Mongo → Dropbox). Idempotentní — lze pouštět
opakovaně / na konci download běhu.