134 lines
5.6 KiB
Python
134 lines
5.6 KiB
Python
#!/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()
|