changes to he pdf sending

This commit is contained in:
2026-08-27 13:24:51 +02:00
parent 708274bd8f
commit cb6627bd3d
2 changed files with 81 additions and 70 deletions
+34 -30
View File
@@ -202,12 +202,11 @@ def generate_main_contract_pdf(
software_name: str = "Invario Inventarsystem"
):
"""Generiert den Hauptvertrag mit zentrierter und aufeinander abgestimmter Kopf- und Fußzeilen-Formatierung."""
from datetime import datetime
pdf = FPDF()
pdf.add_page()
pdf.set_auto_page_break(auto=True, margin=15)
# --- KOPFBEREICH (ZENTRIERT & BÜNDIG UNTEREINANDER) ---
# --- KOPFBEREICH ---
pdf.set_font("Helvetica", style="B", size=13)
pdf.cell(0, 6, "Vertrag über die Nutzung der Software-Lizenz", ln=True, align="C")
pdf.cell(0, 6, f'"{software_name}"', ln=True, align="C")
@@ -231,7 +230,7 @@ def generate_main_contract_pdf(
pdf.cell(0, 5, "- Auftraggeber / Schule -", ln=True, align="C")
pdf.ln(8)
# --- PARAGRAPHEN (1 BIS 8) ---
# --- PARAGRAPHEN ---
pdf.set_font("Helvetica", style="B", size=10)
pdf.cell(0, 6, "1. Vertragsgegenstand", ln=True)
pdf.set_font("Helvetica", size=10)
@@ -309,28 +308,25 @@ def generate_main_contract_pdf(
)
pdf.ln(6)
# --- FUSSBEREICH / UNTERSCHRIFTEN (ZENTRIERT & SYMMETRISCH) ---
# --- UNTERSCHRIFTEN ---
pdf.set_font("Helvetica", style="B", size=10)
pdf.cell(0, 6, "Unterschriften und Einverständnis", ln=True, align="C")
pdf.set_font("Helvetica", size=9)
pdf.multi_cell(0, 4, "Mit der Unterzeichnung bestätigen die Parteien den Abschluss des Hauptvertrages inklusive der beigefügten Anlagen (AGB, EULA und AVV).", align="C")
pdf.ln(8)
# Exakte Zentrierung der zwei Unterschriften-Blöcke
col_width = 85
start_x = (210 - (col_width * 2)) / 2 # Berechnet den exakten linken Rand für Symmetrie (20mm)
start_x = (210 - (col_width * 2)) / 2
pdf.set_font("Helvetica", size=9)
pdf.set_x(start_x)
pdf.cell(col_width, 5, "Für den Auftraggeber", align="C", ln=False)
pdf.cell(col_width, 5, "Für den Anbieter", align="C", ln=True)
pdf.ln(8)
pdf.set_x(start_x)
pdf.cell(col_width, 5, f"{datetime.today().strftime('%d.%m.%Y')} ________________________", align="C", ln=False)
pdf.cell(col_width, 5, f"{datetime.today().strftime('%d.%m.%Y')} ___________ _____________", align="C", ln=True)
pdf.cell(col_width, 5, f"{date} ________________________", align="C", ln=False)
pdf.cell(col_width, 5, f"{date} ___________ _____________", align="C", ln=True)
pdf.set_x(start_x)
pdf.cell(col_width, 5, "(Verantwortlicher)", align="C", ln=False)
@@ -339,27 +335,31 @@ def generate_main_contract_pdf(
pdf.output(output_path)
return output_path
def send_accreditation_email(
recipient: str,
domain: str,
username: str,
password: str,
invoice_pdf_path: str,
contract_pdf_path: str,
school_name: str = "[Name der Schule / des Auftraggebers]",
address: str = "[Straße, Hausnummer] [PLZ, Ort]",
price: str = "250,00",
date: str = "[Ort, Datum]"
date: str = "[Ort, Datum]",
software_name: str = "Invario Inventarsystem"
) -> bool:
"""Generiert den Hauptvertrag und sendet diesen zusammen mit Rechnung, AGB und AVV per E-Mail."""
"""Generiert den Hauptvertrag temporär und versendet ihn zusammen mit AGB & AVV per E-Mail."""
# 1. Hauptvertrag generieren
# Clean Sanitization für Dateinamen
safe_school_name = "".join([c for c in school_name if c.isalnum() or c in (' ', '_', '-')]).rstrip()
contract_filename = f"Hauptvertrag_Invario_{safe_school_name}.pdf"
contract_pdf_path = os.path.join(tempfile.gettempdir(), contract_filename)
# 1. Hauptvertrag dynamisch erzeugen
generate_main_contract_pdf(
school_name=school_name,
address=address,
price=price,
date=date,
software_name=software_name,
output_path=contract_pdf_path
)
@@ -367,13 +367,13 @@ def send_accreditation_email(
agb_pdf_path = os.path.join("static", "download", "AGB Invario.pdf")
avv_pdf_path = os.path.join("static", "download", "AVV Invario.pdf")
# 3. E-Mail Texte
# 3. E-Mail Inhalte
subject = "Ihre Zugangsdaten und Unterlagen für Invario"
text_note = (
f"Sehr geehrte/r {username},\n\n"
"Vielen Dank für Ihre Akkreditierung bei Invario. "
"Im Anhang finden Sie Ihre Rechnung, den Hauptvertrag sowie die AGB und den AVV.\n\n"
"Im Anhang finden Sie Ihren Hauptvertrag sowie die AGB und den AVV.\n\n"
f"Ihre Zugangsdaten:\n"
f"Domain: https://{domain}\n"
f"Benutzername: {username}\n"
@@ -385,7 +385,7 @@ def send_accreditation_email(
<div style="font-family: Arial, Helvetica, sans-serif; color: #333333;">
<h2 style="color: #2c3e50; margin-top: 0;">Willkommen bei Invario!</h2>
<p style="font-size: 15px; line-height: 1.6;">
Vielen Dank für Ihre Akkreditierung. Im Anhang finden Sie Ihre Rechnung, den Hauptvertrag sowie die AGB und den AVV.
Vielen Dank für Ihre Akkreditierung. Im Anhang finden Sie Ihren Hauptvertrag sowie die AGB und den AVV.
</p>
<h3 style="color: #2c3e50;">Ihre Zugangsdaten:</h3>
@@ -401,25 +401,29 @@ def send_accreditation_email(
</div>
"""
# 4. Alle existierenden Anhänge sammeln
# 4. Vorhandene Anhänge einsammeln
attachments = []
# Generierter Hauptvertrag & Rechnung
if contract_pdf_path and os.path.exists(contract_pdf_path):
if os.path.exists(contract_pdf_path):
attachments.append(contract_pdf_path)
if invoice_pdf_path and os.path.exists(invoice_pdf_path):
attachments.append(invoice_pdf_path)
# Statische Dokumente aus static/download/
if os.path.exists(agb_pdf_path):
attachments.append(agb_pdf_path)
else:
print(f"Warnung: AGB unter {agb_pdf_path} nicht gefunden.")
print(f"[WARNING] AGB unter {agb_pdf_path} nicht gefunden.")
if os.path.exists(avv_pdf_path):
attachments.append(avv_pdf_path)
else:
print(f"Warnung: AVV unter {avv_pdf_path} nicht gefunden.")
print(f"[WARNING] AVV unter {avv_pdf_path} nicht gefunden.")
# 5. E-Mail mit allen 4 Anhängen versenden
return send(recipient, subject, text_body=text_note, html_body=html_note, attachments=attachments)
# 5. E-Mail versenden & temporäre Datei aufräumen
try:
success = send(recipient, subject, text_body=text_note, html_body=html_note, attachments=attachments)
return success
finally:
if os.path.exists(contract_pdf_path):
try:
os.remove(contract_pdf_path)
except OSError as e:
print(f"[WARNING] Konnte temporären Vertrag nicht löschen: {e}")