""" ================================================================================ run_all_v1.0.py — IWRS: kompletní pipeline Pacienti + Léky (obě studie) Verze: 1.0 Datum: 2026-06-10 ================================================================================ Stáhne z janssen.4gclinical.com a naimportuje do MongoDB (db `studie`): Pacienti: Subject Summary, Subject Details, notifikace (PDF+JSON) Léky: Onsite Inventory, IP Destruction, Shipments Report, Shipment Details Tok souborů: vše se stahuje do IWRS/Incoming/, po úspěšném importu se přesouvá do IWRS/Incoming/Processed/. Při chybě soubor zůstává v Incoming/ a zpracuje se při příštím běhu. Přihlášení: 2× (jednou per studie) — studie se vybírá až po přihlášení, takže jedna browser session stáhne pacienty i léky pro jednu studii. 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 Detaily v run_all_v1.0.md. """ import os import sys import argparse import traceback BASE_DIR = os.path.dirname(os.path.abspath(__file__)) for _p in (os.path.join(BASE_DIR, "Drugs"), os.path.join(BASE_DIR, "Patients"), BASE_DIR): if _p not in sys.path: sys.path.insert(0, _p) from playwright.sync_api import sync_playwright from common.iwrs_portal import login from common.paths import STUDIES, INCOMING_DIR, PROCESSED_DIR, ensure_dirs from common.mongo_writer import ensure_indexes import download_patients import import_patients import download_drugs import import_drugs def download_phase(studies, do_patients, do_drugs): with sync_playwright() as p: for study in studies: print(f"\n{'='*60}") print(f"[{study}] STAHOVÁNÍ") print(f"{'='*60}") browser = p.chromium.launch(headless=False) context = browser.new_context(accept_downloads=True) page = context.new_page() try: print(" Přihlášení...") login(page, study) if do_patients: print(f"\n ── PACIENTI [{study}] ──") try: download_patients.run(page, study) except Exception as e: print(f" CHYBA při stahování pacientů: {e}") traceback.print_exc() if do_drugs: print(f"\n ── LÉKY [{study}] ──") try: download_drugs.run(page, study) except Exception as e: print(f" CHYBA při stahování léků: {e}") traceback.print_exc() except Exception as e: print(f" CHYBA (login/session): {e}") traceback.print_exc() finally: browser.close() def import_phase(studies, do_patients, do_drugs): print(f"\n{'='*60}") print("IMPORT DO MongoDB") print(f"{'='*60}") ensure_indexes() if do_patients: try: import_patients.run(studies) except Exception as e: print(f" CHYBA při importu pacientů: {e}") traceback.print_exc() if do_drugs: try: import_drugs.run(studies) except Exception as e: print(f" CHYBA při importu léků: {e}") traceback.print_exc() def main(): ap = argparse.ArgumentParser( description="IWRS pipeline: stažení + import pacientů a léků (obě studie)") ap.add_argument("--download-only", action="store_true", help="jen stažení do Incoming/") ap.add_argument("--import-only", action="store_true", help="jen import čekajících souborů") ap.add_argument("--only-patients", action="store_true", help="jen pacientská část") ap.add_argument("--only-drugs", action="store_true", help="jen léková část") ap.add_argument("--study", choices=STUDIES, help="jen jedna studie") args = ap.parse_args() if args.download_only and args.import_only: ap.error("--download-only a --import-only nelze kombinovat") if args.only_patients and args.only_drugs: ap.error("--only-patients a --only-drugs nelze kombinovat") studies = [args.study] if args.study else STUDIES do_patients = not args.only_drugs do_drugs = not args.only_patients ensure_dirs() if not args.import_only: download_phase(studies, do_patients, do_drugs) if not args.download_only: import_phase(studies, do_patients, do_drugs) print(f"\n{'='*60}") print("Vše hotovo.") print(f" Incoming: {INCOMING_DIR}") print(f" Processed: {PROCESSED_DIR}") print(f"{'='*60}") if __name__ == "__main__": main()