z230
This commit is contained in:
@@ -0,0 +1,112 @@
|
||||
# run_all_v1.0.py — IWRS: kompletní pipeline Pacienti + Léky
|
||||
|
||||
**Verze:** 1.0 | **Datum:** 2026-06-10
|
||||
|
||||
Jeden vstupní skript na úrovni `IWRS/`, který stáhne z janssen.4gclinical.com
|
||||
a naimportuje do MongoDB (db `studie`) data pacientů i léků pro obě studie
|
||||
(77242113UCO3001, 42847922MDD3003). Nahrazuje dřívější `Drugs/run_all.py`
|
||||
a `Patients/download_all.py` + `Patients/import_all.py` (přesunuty do `Trash/`).
|
||||
|
||||
## Tok souborů
|
||||
|
||||
```
|
||||
IWRS/Incoming/ ← sem padá vše stažené (pacienti i léky, datumované názvy)
|
||||
IWRS/Incoming/Processed/ ← sem se přesouvá po úspěšném importu
|
||||
```
|
||||
|
||||
- Při chybě importu soubor **zůstává v Incoming/** a zpracuje se při příštím běhu.
|
||||
- Import jde vždy **nejstarší soubor napřed** (mtime) — chronologická správnost snapshotů.
|
||||
- Kolize jména v Processed/ → přepíše se (Mongo už data má, soubor je jen archiv).
|
||||
- Adresář `IWRS/Incoming/` je v `.gitignore` (stejně jako dříve `Patients/Incoming/`).
|
||||
- Původní adresáře `Drugs/xls_*` zůstávají zmrazené na místě jako archiv — nový kód je nepoužívá.
|
||||
|
||||
## Názvy souborů v Incoming/
|
||||
|
||||
| Typ | Vzor |
|
||||
|---|---|
|
||||
| Subject Summary | `YYYY-MM-DD {study} Subject Summary Report.xlsx` |
|
||||
| Subject Detail | `YYYY-MM-DD {study} {subject} Subject Detail.xlsx` |
|
||||
| Notifikace | `{datum}_{study}_{subject}_{label}.pdf` + `.json` |
|
||||
| Onsite Inventory | `YYYY-MM-DD {study} Onsite Inventory {site}.xlsx` |
|
||||
| IP Destruction | `YYYY-MM-DD {study} IP Destruction {basket}.xlsx` |
|
||||
| Shipments Report | `YYYY-MM-DD {study} Shipments Report.xlsx` |
|
||||
| Shipment Details | `YYYY-MM-DD {study} Shipment Details {shipment_id}.xlsx` |
|
||||
|
||||
Při kolizi (druhý běh ve stejný den) se před příponu přidá ` HHMM`.
|
||||
Metadata (site, basket, study) se při importu čtou primárně z **obsahu** souboru;
|
||||
z názvu se bere jen `shipment_id` u Shipment Details.
|
||||
|
||||
## Průběh
|
||||
|
||||
### Fáze 1 — stahování (2 přihlášení, per studie jedna browser session)
|
||||
|
||||
1. Login + výběr studie (`common/iwrs_portal.py`)
|
||||
2. **Pacienti** (`Patients/download_patients.py`):
|
||||
- Subject Summary Report
|
||||
- per subjekt: Subject Detail XLSX + notifikace PDF+JSON (stahují se jen
|
||||
notifikace, jejichž `pk` ještě není v Mongo `iwrs_notifications`)
|
||||
3. **Léky** (`Drugs/download_drugs.py`):
|
||||
- Onsite Inventory — všechna centra, vždy znovu
|
||||
- IP Destruction — přeskočí košíky už importované v `iwrs_destruction`
|
||||
(destrukce je immutable); dříve se přeskakovalo podle existence souboru
|
||||
- Shipments Report — vždy znovu
|
||||
- Shipment Details — jen CZ zásilky; přeskočí zásilky, jejichž položky
|
||||
jsou v `iwrs_shipment_items` se statusem RECEIVED (finální stav);
|
||||
dříve „soubor existuje a status RECEIVED“. CANCELLED zásilky se stahují
|
||||
při každém běhu (záměrně zachováno z původní verze).
|
||||
|
||||
### Fáze 2 — import (po stažení obou studií)
|
||||
|
||||
1. `ensure_indexes()` (jednou)
|
||||
2. **Pacienti** (`Patients/import_patients.py`): summary → detaily → notifikace;
|
||||
per soubor, po úspěchu přesun do Processed/
|
||||
3. **Léky** (`Drugs/import_drugs.py`): jeden `import_id` per studie a běh;
|
||||
parsuje všechny čekající soubory (nejstarší napřed, poslední vyhrává per `_id`),
|
||||
pak hromadný zápis:
|
||||
- `iwrs_shipments`, `iwrs_shipment_items`, `iwrs_inventory` — upsert + snapshot
|
||||
- `iwrs_destruction` — upsert bez snapshotu
|
||||
Po úspěšném zápisu se zparsované soubory přesunou do Processed/;
|
||||
soubor s chybou parsování zůstává v Incoming/.
|
||||
Prázdný inventory report (centrum bez zásob — jen meta řádky `Site:` atd.,
|
||||
bez tabulky léků) se bere jako 0 položek a normálně se archivuje.
|
||||
|
||||
## Použití
|
||||
|
||||
```
|
||||
python run_all_v1.0.py # vše (download + import, obě studie)
|
||||
python run_all_v1.0.py --download-only # jen stažení do Incoming/
|
||||
python run_all_v1.0.py --import-only # jen import čekajících souborů
|
||||
python run_all_v1.0.py --only-patients # jen pacientská část
|
||||
python run_all_v1.0.py --only-drugs # jen léková část
|
||||
python run_all_v1.0.py --study 42847922MDD3003 # jen jedna studie
|
||||
```
|
||||
|
||||
Prohlížeč běží s `headless=False` (viditelné okno) jako dosud.
|
||||
Moduly `import_patients.py` a `import_drugs.py` lze spustit i samostatně.
|
||||
|
||||
## Mapa modulů
|
||||
|
||||
```
|
||||
IWRS/
|
||||
run_all_v1.0.py ← vstupní skript (CLI, orchestrace)
|
||||
common/
|
||||
iwrs_portal.py ← BASE_URL, credentials, login(page, study)
|
||||
paths.py ← INCOMING/PROCESSED, unique_path, move_done, sorted_by_mtime
|
||||
mongo_writer.py ← beze změny (konvertory, upserty, snapshoty, import log)
|
||||
Patients/
|
||||
download_patients.py ← summary + delegace na download_subject_details.run()
|
||||
import_patients.py ← logika z bývalého import_all.py, nové cesty
|
||||
download_subject_details.py, import_to_mongo.py,
|
||||
import_notifications_to_mongo.py, parse_notifications_to_mongo.py ← beze změny
|
||||
Trash/download_all.py, Trash/import_all.py ← nahrazeno
|
||||
Drugs/
|
||||
download_drugs.py ← 4 typy reportů → Incoming/, skip-logika přes Mongo
|
||||
import_drugs.py ← parsery z bývalého import_to_mongo.py, čte Incoming/
|
||||
Trash/run_all.py, Trash/import_to_mongo.py ← nahrazeno
|
||||
```
|
||||
|
||||
## Jednorázová migrace (provedeno 2026-06-10)
|
||||
|
||||
- `Patients/Incoming/Zpracováno/` (1343 souborů) → `IWRS/Incoming/Processed/`
|
||||
- `.gitignore`: `IWRS/Patients/Incoming/` → `IWRS/Incoming/`
|
||||
- Staré vstupní skripty → `Trash/` (viz mapa výše)
|
||||
Reference in New Issue
Block a user