Files
janssen/Feasibility/sipiq_send_v1.0.py
2026-06-19 14:28:54 +02:00

134 lines
5.6 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/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<br>"
"ICON plc / Performing Local Trial Management Services for Janssen Cilag s.r.o. "
"/ Global Clinical Operations<br>"
"Mobile: +420 775 735 276 / Fax: +420 227 012 284<br>"
"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'<p>{greet}</p>'
f'<p>velmi děkuji za podpis dohody o mlčenlivosti (CDA) ke studii '
f'<b>77242113UCO3002 (DAWN)</b> (přípravek icotrokinra, ulcerózní kolitida).</p>'
f'<p>Dovoluji si Vám nyní zaslat feasibility dotazník <b>SIPIQ</b>, 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:</p>'
f'<p><a href="{link}">{link}</a></p>'
f'<p><b>Budu velmi rád za jeho vyplnění v co nejkratším termínu.</b> V případě '
f'jakýchkoli dotazů (např. potíže s odkazem) jsem Vám plně k dispozici.</p>'
f'<p>Předem děkuji za Váš čas a vstřícnost.</p>'
f'<p>S pozdravem,<br>{SIG}</p>'
)
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'<html><body style="font-family:Calibri,Arial,sans-serif;font-size:11pt">'
f'{body}</body></html>')
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()