#!/usr/bin/env python3 # -*- coding: utf-8 -*- """ sipiq_send_v1.0.py ================== Verze: 1.0 Datum: 2026-06-19 Autor: Claude Code (pro MUDr. Vladimíra Buzalku) Popis ----- Vygeneruje .eml draft PRVNÍHO ROZESLÁNÍ feasibility dotazníku SIPIQ ke studii 77242113UCO3002 (DAWN, icotrokinra, ulcerózní kolitida) lékaři, který podepsal CDA (KROK 5). Tělo: poděkování za podpis CDA + zaslání odkazu na dotazník specifický pro centrum (link z Trilia / argumentu) + nabídka pomoci. Zároveň (s --apply): - uloží odkaz do investigators.sipiq.link (aby fungovaly pozdější připomínky), - posune lékaře na KROK "6 - SIPIQ odeslán" a předřadí řádek do STATUS. To = email + email2 (dd-proxy vynechány), Cc = koordinátorky, BEZ hlavičky From (JNJ Outlook doplní odesílatele z GAL a odešle přes JNJ Exchange). Tělo BASE64. Draft ≠ odesláno — STATUS / KROK 6 se ale na přání píše rovnou (uživatel link odešle ručně). Použití: python sipiq_send_v1.0.py --name Leksa --link "https://...." # dry-run python sipiq_send_v1.0.py --name Leksa --link "https://...." --apply # .eml + Mongo Mongo 192.168.1.76:27017, bez auth, pymongo. """ import argparse import os import unicodedata from datetime import date from email.message import EmailMessage from pymongo import MongoClient OUT_DIR = r"u:\Dropbox\!!!Days\Downloads Z230\UploadToJNJ" CC = "AKocourk@ITS.JNJ.com, EBartoso@its.jnj.com" SIG = ("MUDr. Vladimír BUZALKA
" "ICON plc / Performing Local Trial Management Services for Janssen – Cilag s.r.o. " "/ Global Clinical Operations
" "Mobile: +420 775 735 276 / Fax: +420 227 012 284
" "E-mail: vbuzalka@its.jnj.com, vladimir.buzalka@iconplc.com") CZ_MON = {1: "ledna", 2: "února", 3: "března", 4: "dubna", 5: "května", 6: "června", 7: "července", 8: "srpna", 9: "září", 10: "října", 11: "listopadu", 12: "prosince"} def ascii_slug(s): return "".join(c for c in unicodedata.normalize("NFKD", str(s or "")) if not unicodedata.combining(c)).lower().replace(" ", "") def is_female(prijmeni): p = (prijmeni or "").lower() return p.endswith("ová") or p.endswith("ova") or p.endswith("á") def build_body(prijmeni, link): f = is_female(prijmeni) greet = "Vážená paní doktorko," if f else "Vážený pane doktore," return ( f'

{greet}

' f'

velmi děkuji za podpis dohody o mlčenlivosti (CDA) ke studii ' f'77242113UCO3002 (DAWN) (přípravek icotrokinra, ulcerózní kolitida).

' f'

Dovoluji si Vám nyní zaslat feasibility dotazník SIPIQ, který je ' f'klíčový pro posouzení vhodnosti Vašeho centra a další postup. Níže najdete ' f'odkaz na dotazník specifický pro Vaše centrum:

' f'

{link}

' f'

Budu velmi rád za jeho vyplnění v co nejkratším termínu. V případě ' f'jakýchkoli dotazů (např. potíže s odkazem) jsem Vám plně k dispozici.

' f'

Předem děkuji za Váš čas a vstřícnost.

' f'

S pozdravem,
{SIG}

' ) def main(): ap = argparse.ArgumentParser() ap.add_argument("--name", required=True, help="příjmení (pi v investigators)") ap.add_argument("--link", required=True, help="SIPIQ odkaz specifický pro centrum") ap.add_argument("--apply", action="store_true") args = ap.parse_args() db = MongoClient("mongodb://192.168.1.76:27017", serverSelectionTimeoutMS=8000).feasibility d = db.investigators.find_one({"prijmeni": args.name}) if not d: print(f" ! nenalezeno: {args.name}"); return tos = [e for e in [d.get("email"), d.get("email2")] if e] tos = [e for e in dict.fromkeys(tos) if "dd-proxy" not in e.lower()] to = ", ".join(tos) body = build_body(d["prijmeni"], args.link) today = date.today() today_cz = f"{today.day}. {CZ_MON[today.month]} {today.year}" print(f" {d.get('jmeno')} {d['prijmeni']} | To: {to} | Cc: {CC}") print(f" Link: {args.link}") print(f" KROK: {d.get('KROK')} -> 6 - SIPIQ odeslán") if not args.apply: print("\n[DRY-RUN] nic nezapsáno. Ostrý: --apply"); return subject = "77242113UCO3002 (DAWN) — feasibility dotazník SIPIQ k vyplnění" msg = EmailMessage() # ŽÁDNÝ From — JNJ Outlook doplní odesílatele z GAL (odešle přes JNJ Exchange) msg["To"] = to msg["Cc"] = CC msg["Subject"] = subject msg["X-Unsent"] = "1" html = (f'' f'{body}') msg.set_content(html, subtype="html", charset="utf-8", cte="base64") os.makedirs(OUT_DIR, exist_ok=True) DD = today.strftime("%d") + ["JAN", "FEB", "MAR", "APR", "MAY", "JUN", "JUL", "AUG", "SEP", "OCT", "NOV", "DEC"][today.month - 1] + today.strftime("%Y") fn = f"sipiq_odeslani_{ascii_slug(d['prijmeni'])}_{DD}.eml" with open(os.path.join(OUT_DIR, fn), "wb") as fh: fh.write(bytes(msg)) old_status = d.get("STATUS", "") or "" new_line = (f"{DD}: SIPIQ ROZESLÁN — odkaz specifický pro centrum zaslán lékaři " f"(.eml draft {fn}, Cc koordinátorky). KROK 6.") db.investigators.update_one({"_id": d["_id"]}, {"$set": { "KROK": "6 - SIPIQ odeslán", "STATUS": new_line + "\n" + old_status, "sipiq.link": args.link, "sipiq.odeslano": today_cz, }}) print(f"\n[APPLY] Draft: {fn} | sipiq.link uložen | KROK 6") if __name__ == "__main__": main()