changes to he pdf sending
This commit is contained in:
@@ -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}")
|
||||
Reference in New Issue
Block a user