change of the dat4e managment

This commit is contained in:
2026-08-27 10:58:01 +02:00
parent 651dec259c
commit 2e7a763dba
+48 -44
View File
@@ -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