[34288f42] Keine Zusammenfassung angegeben.

Keine Zusammenfassung angegeben.
This commit is contained in:
2026-04-14 14:09:58 +00:00
parent 0cca30a956
commit 1a3568f69e
14 changed files with 347 additions and 48 deletions

View File

@@ -26,7 +26,7 @@ def generate_siblings_pdf_from_csv(csv_path: str, institution: str, calendly_eve
except:
raise Exception("CSV konnte nicht gelesen werden.")
df.columns = df.columns.str.strip().str.replace("\"", "")
df.columns = df.columns.str.strip().str.replace('"', "")
# Identify Email Column
email_col = next((c for c in df.columns if "email" in c.lower()), None)
@@ -56,8 +56,6 @@ def generate_siblings_pdf_from_csv(csv_path: str, institution: str, calendly_eve
try:
start_dt = datetime.datetime.fromisoformat(event['start_time'].replace('Z', '+00:00'))
start_dt = start_dt.astimezone(ZoneInfo("Europe/Berlin"))
# Allow all events for siblings logic, regardless of date, just to be sure we match them
calendly_map[event['invitee_email'].lower().strip()] = start_dt.strftime("%d.%m. %H:%M")
except:
pass
@@ -123,3 +121,63 @@ def generate_siblings_pdf_from_csv(csv_path: str, institution: str, calendly_eve
with open(output_path, "wb") as f:
f.write(pdf)
logger.info(f"Siblings PDF saved to {output_path}")
def get_sibling_families_from_csv(csv_path: str, calendly_events: list = None) -> list:
df = None
for sep in [";", ","]:
try:
test_df = pd.read_csv(csv_path, sep=sep, encoding="utf-8-sig", nrows=5)
if len(test_df.columns) > 1:
df = pd.read_csv(csv_path, sep=sep, encoding="utf-8-sig")
break
except Exception as e:
continue
if df is None:
try:
df = pd.read_csv(csv_path, sep=";", encoding="latin1")
except:
raise Exception("CSV konnte nicht gelesen werden.")
df.columns = df.columns.str.strip().str.replace('"', "")
email_col = next((c for c in df.columns if "email" in c.lower()), None)
if not email_col:
email_col = next((c for c in df.columns if "e-mail" in c.lower()), None)
if not email_col:
return []
lastname_col = next((c for c in df.columns if "nachname" in c.lower()), None)
# Build Calendly Email Set for filtering
booked_emails = set()
if calendly_events:
for event in calendly_events:
email = event.get('invitee_email', '').lower().strip()
if email:
booked_emails.add(email)
families_dict = defaultdict(list)
df = df.fillna("")
for _, row in df.iterrows():
email = str(row[email_col]).strip().lower()
if email and "@" in email:
families_dict[email].append(row)
families = []
for email, rows in families_dict.items():
if len(rows) > 1: # SIBLINGS DETECTED
# FILTER OUT if they already have an appointment
if email in booked_emails:
logger.info(f"Family {email} already has Calendly appointment, skipping QR card.")
continue
family_last_name = str(rows[0][lastname_col]).strip() if lastname_col else "Unbekannt"
families.append({
"nachname": family_last_name
})
families.sort(key=lambda x: x["nachname"])
return families