#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
sipiq_thankyou_v1.1.py
======================
Verze: 1.1
Datum: 2026-06-18
Autor: Claude Code (pro MUDr. Vladimíra Buzalku)
Změna proti v1.0
----------------
- OPRAVA KÓDOVÁNÍ: tělo se kóduje BASE64 (cte="base64"), jediná text/html část.
v1.0 použil default quoted-printable → Outlook zobrazoval „=" místo písmen
(=ážený, =ladimír, Service=, jnj.co=). Base64 = čistý text (jako create_draft_eml).
v1.0 přesunuta do TRASH.
Popis
-----
.eml draft poděkování za vyplnění SIPIQ (77242113UCO3002 / DAWN) pro jedno centrum.
Struktura (BEZ Shrnutí): úvod → podpis → ÚPLNĚ POD PODPISEM kompletní výpis SIPIQ
(sekce → otázka → odpověď, dle order/section, vynechána Confidentiality, jen neprázdné).
To = email+email2 z investigators (fallback pi_email), Cc = koordinátorky, from = its.jnj.com.
Draft ≠ odesláno — STATUS „poděkováno" psát až po ověření odeslání.
Použití:
python sipiq_thankyou_v1.1.py --last Bruncak # dry-run
python sipiq_thankyou_v1.1.py --last Bruncak --apply # zapíše .eml
Mongo 192.168.1.76:27017, bez auth, pymongo.
"""
import argparse
import os
from datetime import datetime
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"
FROM = "vbuzalka@its.jnj.com"
SKIP_SECTIONS = {"Confidentiality Statement"}
SUBJECT = "77242113UCO3002 (DAWN) — poděkování za vyplnění feasibility dotazníku SIPIQ"
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")
def esc(s):
return str(s).replace("&", "&").replace("<", "<").replace(">", ">")
def build_sipiq_html(db, resp):
ans = resp.get("answers") or {}
qs = list(db.sipiq_questions.find().sort("order", 1))
out, cur = [], None
for q in qs:
sec = q.get("section") or "Other"
if sec in SKIP_SECTIONS:
continue
items = q.get("items") or []
pairs = []
if not items:
v = ans.get(q["_id"])
if v not in (None, ""):
pairs.append((None, v))
else:
for it in items:
v = ans.get(it["key"])
if v not in (None, ""):
pairs.append((it.get("label") or "(odpověď)", v))
if not pairs:
continue
if sec != cur:
cur = sec
out.append(f'
[{q["_id"]}] {stem}
') if len(pairs) == 1 and pairs[0][0] is None: out.append(f'{esc(pairs[0][1])}
') else: out.append('Vážený pane doktore,
' 'děkujeme za zaslání vyplněného dotazníku SIPIQ studie ' '77242113UCO3002 (DAWN). Vaše odpovědi uvádíme pro úplnost v plném znění ' 'níže, pod podpisem. Odeslaný dotazník již není možné editovat, takže kdybychom ' 'při dalším zpracování našli položky chybějící, nejasné nebo nekonzistentní, ' 'ještě bychom si vyžádali upřesnění e-mailem.
' ) sig = f'S pozdravem,
{SIG}
Vyplněné SIPIQ (kopie Vašich odpovědí):
' + sipiq) print(f"Centrum: {resp.get('pi_first_name')} {resp.get('pi_last_name')} | {resp.get('site_name')}") print(f"To: {to}\nCc: {CC}\nSubject: {SUBJECT}") print(f"SIPIQ – sekcí: {sipiq.count('