From 2e7a763dba1970a5069d4e93481b8bc4247d7994 Mon Sep 17 00:00:00 2001 From: AIIrondev Date: Thu, 27 Aug 2026 10:58:01 +0200 Subject: [PATCH] change of the dat4e managment --- Website/modules/emailservice/email.py | 92 ++++++++++++++------------- 1 file changed, 48 insertions(+), 44 deletions(-) diff --git a/Website/modules/emailservice/email.py b/Website/modules/emailservice/email.py index ba38114..96ec88b 100644 --- a/Website/modules/emailservice/email.py +++ b/Website/modules/emailservice/email.py @@ -163,7 +163,6 @@ def send_register_token(email: str, token: str) -> bool: def send_password_reset_token(email: str, token: str) -> bool: """Sends a professionally styled password reset token to the user.""" - subject = "Aktion erforderlich: Ihr Passwort-Zurücksetzungs-Code für Invario" text_note = ( @@ -199,49 +198,51 @@ def generate_main_contract_pdf( address: str, price: str, date: str, - software_name: str, - output_path: str + output_path: str, + software_name: str = "Invario Inventarsystem" ): - """Generiert das komplette PDF des Hauptvertrages (HV) mit allen Paragraphen und dynamischen Feldern.""" + """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) - # Schriftart festlegen - pdf.set_font("Helvetica", size=10) - - # --- TITEL --- + # --- KOPFBEREICH (ZENTRIERT & BÜNDIG UNTEREINANDER) --- 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") + pdf.cell(0, 6, f'"{software_name}"', ln=True, align="C") pdf.ln(6) - # --- PARTEIEN --- + pdf.set_font("Helvetica", style="B", size=10) + pdf.cell(0, 5, "Zwischen", ln=True, align="C") pdf.set_font("Helvetica", size=10) - parties_text = ( - "Zwischen\n\n" - "Invario UG\nAm Sportplatz 10, 83052 Bruckmühl\n" - "-- Anbieter / Lizenzgeber --\n\n" - "und\n\n" - f"{school_name}\n{address}\n" - "-- Auftraggeber / Schule --" - ) - pdf.multi_cell(0, 5, parties_text) - pdf.ln(6) + pdf.cell(0, 5, "Invario UG", ln=True, align="C") + pdf.cell(0, 5, "Am Sportplatz 10, 83052 Bruckmühl", ln=True, align="C") + pdf.set_font("Helvetica", style="I", size=9) + pdf.cell(0, 5, "- Anbieter / Lizenzgeber -", ln=True, align="C") + pdf.ln(4) - # --- 1. VERTRAGSGEGENSTAND --- + pdf.set_font("Helvetica", style="B", size=10) + pdf.cell(0, 5, "und", ln=True, align="C") + pdf.set_font("Helvetica", size=10) + pdf.cell(0, 5, f"{school_name}", ln=True, align="C") + pdf.cell(0, 5, f"{address}", ln=True, align="C") + pdf.set_font("Helvetica", style="I", size=9) + pdf.cell(0, 5, "- Auftraggeber / Schule -", ln=True, align="C") + pdf.ln(8) + + # --- PARAGRAPHEN (1 BIS 8) --- pdf.set_font("Helvetica", style="B", size=10) pdf.cell(0, 6, "1. Vertragsgegenstand", ln=True) pdf.set_font("Helvetica", size=10) pdf.multi_cell(0, 5, - f"(1) Der Anbieter stellt dem Auftraggeber die Software \"{software_name}\" (nachfolgend \"Software\") als webbasierte Anwendung im Wege des Software-as-a-Service (SaaS) zur Verfügung. Die Software wird auf der vom Anbieter genutzten Infrastruktur betrieben.\n" + f'(1) Der Anbieter stellt dem Auftraggeber die Software "{software_name}" (nachfolgend "Software") als webbasierte Anwendung im Wege des Software-as-a-Service (SaaS) zur Verfügung. Die Software wird auf der vom Anbieter genutzten Infrastruktur betrieben.\n' "(2) Dieser Hauptvertrag wird durch folgende Dokumente ergänzt, die als integrale Bestandteile dieses Vertrages gelten:\n" "a) Anlage 1: Allgemeine Geschäftsbedingungen (AGB) und Lizenzbedingungen (EULA) des Anbieters\n" "b) Anlage 2: Auftragsverarbeitungsvertrag (AVV) gemäß Art. 28 DS-GVO nebst technischen und organisatorischen Maßnahmen (TOM)" ) pdf.ln(4) - # --- 2. VERTRAGSBEGINN --- pdf.set_font("Helvetica", style="B", size=10) pdf.cell(0, 6, "2. Vertragsbeginn", ln=True) pdf.set_font("Helvetica", size=10) @@ -251,18 +252,16 @@ def generate_main_contract_pdf( ) pdf.ln(4) - # --- 3. LAUFZEIT UND KÜNDIGUNG --- pdf.set_font("Helvetica", style="B", size=10) pdf.cell(0, 6, "3. Laufzeit und Kündigung", ln=True) pdf.set_font("Helvetica", size=10) pdf.multi_cell(0, 5, "(1) Der Vertrag wird zunächst für die Dauer von zwölf (12) Monaten geschlossen (Mindestlaufzeit).\n" "(2) Er verlängert sich automatisch um jeweils ein weiteres Jahr, sofern er nicht von einer Partei mit einer Frist von drei (3) Monaten zum Ende der jeweiligen Laufzeit gekündigt wird.\n" - "(3) Die Kündigung kann in Textform (z. B. per E-Mail) oder über die dafür vorgesehenen Funktionen im Invario-Portal erfolgen. Das Recht zur außerordentlichen Kündigung aus wichtigem Grund bleibt unberührt." + "(3) Die Kündigung kann in Textform (z. B. per E-Mail) oder über die dafür vorgesehene Funktion im Invario-Portal erfolgen. Das Recht zur außerordentlichen Kündigung aus wichtigem Grund bleibt unberührt." ) pdf.ln(4) - # --- 4. VERGÜTUNG UND BEZAHLUNG --- pdf.set_font("Helvetica", style="B", size=10) pdf.cell(0, 6, "4. Vergütung und Bezahlung", ln=True) pdf.set_font("Helvetica", size=10) @@ -273,7 +272,6 @@ def generate_main_contract_pdf( ) pdf.ln(4) - # --- 5. NUTZUNG UND SUPPORT --- pdf.set_font("Helvetica", style="B", size=10) pdf.cell(0, 6, "5. Nutzung und Support", ln=True) pdf.set_font("Helvetica", size=10) @@ -283,7 +281,6 @@ def generate_main_contract_pdf( ) pdf.ln(4) - # --- 6. DATENSCHUTZ UND DATENSICHERHEIT --- pdf.set_font("Helvetica", style="B", size=10) pdf.cell(0, 6, "6. Datenschutz und Datensicherheit", ln=True) pdf.set_font("Helvetica", size=10) @@ -293,17 +290,15 @@ def generate_main_contract_pdf( ) pdf.ln(4) - # --- 7. HAFTUNG --- pdf.set_font("Helvetica", style="B", size=10) pdf.cell(0, 6, "7. Haftung", ln=True) pdf.set_font("Helvetica", size=10) pdf.multi_cell(0, 5, "(1) Die Haftung des Anbieters richtet sich nach den Regelungen in Ziffer 7 der Allgemeinen Geschäftsbedingungen (Anlage 1).\n" - "(2) Für Unterbrechungen der Verfügbarkeit durch höhere Gewalt, Störungen im Bereich außerhalb des Übergabepunktes (z. B. Internet-Backbone) sowie für unvorhersehbare Sicherheitslücken, die nach dem aktuellen Stand der Technik zum Zeitpunkt des Auftretens noch nicht abwehrbar waren (Zero-Day-Exploits), haftet the Anbieter nur nach Maßgabe der Haftungsregelungen in den AGB, es sei denn, ihn trifft ein Verschulden an der verzögerten Behebung. Gesetzliche Datenschutzpflichten und Meldepflichten bleiben unberührt." + "(2) Für Unterbrechungen der Verfügbarkeit durch höhere Gewalt, Störungen im Bereich außerhalb des Übergabepunktes (z. B. Internet-Backbone) sowie für unvorhersehbare Sicherheitslücken, die nach dem aktuellen Stand der Technik zum Zeitpunkt des Auftretens noch nicht abwehrbar waren (Zero-Day-Exploits), haftet der Anbieter nur nach Maßgabe der Haftungsregelungen in den AGB, es sei denn, ihn trifft ein Verschulden an der verzögerten Behebung. Gesetzliche Datenschutzpflichten und Meldepflichten bleiben unberührt." ) pdf.ln(4) - # --- 8. SCHLUSSBESTIMMUNGEN --- pdf.set_font("Helvetica", style="B", size=10) pdf.cell(0, 6, "8. Schlussbestimmungen", ln=True) pdf.set_font("Helvetica", size=10) @@ -314,24 +309,33 @@ def generate_main_contract_pdf( ) pdf.ln(6) - # --- UNTERSCHRIFTEN --- + # --- FUSSBEREICH / UNTERSCHRIFTEN (ZENTRIERT & SYMMETRISCH) --- pdf.set_font("Helvetica", style="B", size=10) - pdf.cell(0, 6, "Unterschriften und Einverständnis", ln=True) + 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).") + 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) - # Unterschriften-Blöcke nebeneinander - pdf.set_font("Helvetica", size=9) - pdf.cell(95, 5, "Für den Auftraggeber", ln=False) - pdf.cell(95, 5, "Für den Anbieter", ln=True) - pdf.ln(8) - pdf.cell(95, 5, f"{date} ____________________________________", ln=False) - pdf.cell(95, 5, f"{date} ________________ ____________________", ln=True) - pdf.cell(95, 5, "(Verantwortlicher)", ln=False) - pdf.cell(95, 5, "(Simon Brieger)", ln=True) + # 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) + + 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('%Y-%m-%d')} ________________________", align="C", ln=False) + pdf.cell(col_width, 5, f"{datetime.today().strftime('%Y-%m-%d')} ________________________", align="C", ln=True) + + pdf.set_x(start_x) + pdf.cell(col_width, 5, "(Verantwortlicher)", align="C", ln=False) + pdf.cell(col_width, 5, "(Simon Brieger)", align="C", ln=True) - # PDF speichern pdf.output(output_path) return output_path