refactor: Remove unused email sending functionality and update invoice status descriptions
This commit is contained in:
+3
-55
@@ -12,11 +12,9 @@ import tempfile
|
||||
import threading
|
||||
import unicodedata
|
||||
import zipfile
|
||||
import smtplib
|
||||
from datetime import timedelta, datetime, date
|
||||
from functools import wraps
|
||||
from io import BytesIO
|
||||
from email.message import EmailMessage
|
||||
from urllib.parse import parse_qs, quote, urlparse
|
||||
from werkzeug.security import generate_password_hash, check_password_hash
|
||||
from werkzeug.utils import secure_filename
|
||||
@@ -73,12 +71,6 @@ BOOKING_PRICE_MAP = {
|
||||
"schultraeger": 0.0,
|
||||
"telefonsupport": 20.0,
|
||||
}
|
||||
|
||||
SMTP_HOST = os.environ.get("SMTP_HOST", "").strip()
|
||||
SMTP_USERNAME = os.environ.get("SMTP_USERNAME", "").strip()
|
||||
SMTP_PASSWORD = os.environ.get("SMTP_PASSWORD", "")
|
||||
SMTP_USE_TLS = os.environ.get("SMTP_USE_TLS", "1").strip().lower() not in {"0", "false", "no"}
|
||||
SMTP_FROM_ADDRESS = os.environ.get("SMTP_FROM_ADDRESS", SMTP_USERNAME or "noreply@localhost").strip()
|
||||
BOOKING_ADMIN_EMAIL_FALLBACK = os.environ.get("BOOKING_ADMIN_EMAIL", "").strip()
|
||||
|
||||
|
||||
@@ -151,12 +143,6 @@ def _env_int(name: str, default: int) -> int:
|
||||
return default
|
||||
|
||||
|
||||
try:
|
||||
SMTP_PORT = max(int(os.environ.get("SMTP_PORT", "587")), 1)
|
||||
except ValueError:
|
||||
SMTP_PORT = 587
|
||||
|
||||
|
||||
MONGO_MAX_POOL_SIZE = max(_env_int("MONGO_MAX_POOL_SIZE", 12), 1)
|
||||
MONGO_MIN_POOL_SIZE = max(_env_int("MONGO_MIN_POOL_SIZE", 0), 0)
|
||||
MONGO_MAX_IDLE_MS = max(_env_int("MONGO_MAX_IDLE_MS", 60000), 1000)
|
||||
@@ -369,28 +355,6 @@ def _select_booking_admin() -> dict | None:
|
||||
return None
|
||||
|
||||
|
||||
def _send_booking_email(recipient_email: str, subject: str, body: str) -> tuple[bool, str]:
|
||||
if not SMTP_HOST or not recipient_email:
|
||||
return False, "SMTP nicht konfiguriert"
|
||||
|
||||
message = EmailMessage()
|
||||
message["Subject"] = subject
|
||||
message["From"] = SMTP_FROM_ADDRESS
|
||||
message["To"] = recipient_email
|
||||
message.set_content(body)
|
||||
|
||||
try:
|
||||
with smtplib.SMTP(SMTP_HOST, SMTP_PORT, timeout=12) as smtp:
|
||||
if SMTP_USE_TLS:
|
||||
smtp.starttls()
|
||||
if SMTP_USERNAME:
|
||||
smtp.login(SMTP_USERNAME, SMTP_PASSWORD)
|
||||
smtp.send_message(message)
|
||||
return True, "E-Mail wurde versendet"
|
||||
except Exception as exc:
|
||||
return False, _sanitize_text(str(exc), 240)
|
||||
|
||||
|
||||
def _sanitize_text(text: str, max_length: int = 255) -> str:
|
||||
"""Sanitize user text input: strip, limit length, and escape HTML."""
|
||||
text = (text or "").strip()
|
||||
@@ -2138,22 +2102,6 @@ def booking_payment():
|
||||
if invoice_client:
|
||||
invoice_client.close()
|
||||
|
||||
if assigned_admin_email:
|
||||
email_subject = f"Neue Zahlungsbuchung: {selected_package}"
|
||||
email_body = (
|
||||
f"Es wurde eine neue direkte Buchung eingereicht.\n\n"
|
||||
f"Paket: {selected_package}\n"
|
||||
f"Ansprechpartner: {form_data['contact_person']}\n"
|
||||
f"Schule: {form_data['school_name']}\n"
|
||||
f"E-Mail: {form_data['contact_email']}\n"
|
||||
f"Telefon: {form_data['contact_phone'] or '-'}\n"
|
||||
f"Rechnungsadresse: {form_data['billing_street']}, {form_data['billing_zip']} {form_data['billing_city']}\n"
|
||||
f"Status: Bitte die Unterlagen in der Rechnungsverwaltung prüfen.\n"
|
||||
f"Buchungsnummer: {booking_number}\n"
|
||||
)
|
||||
mail_ok, mail_message = _send_booking_email(assigned_admin_email, email_subject, email_body)
|
||||
if not mail_ok:
|
||||
flash(f"Rechnung wurde angelegt, E-Mail an den Admin konnte nicht gesendet werden: {mail_message}", "info")
|
||||
except PyMongoError:
|
||||
flash("Buchungsanfrage konnte nicht gesendet werden.", "error")
|
||||
return redirect(url_for("booking_payment", package=package_raw, flow=booking_flow))
|
||||
@@ -2164,7 +2112,7 @@ def booking_payment():
|
||||
success_text = (
|
||||
f"Gesprächstermin für {selected_package} wurde an das Team gesendet."
|
||||
if booking_flow == "consultation"
|
||||
else f"Buchung für {selected_package} wurde an den Admin gesendet."
|
||||
else f"Buchung für {selected_package} wurde erfolgreich erfasst."
|
||||
)
|
||||
flash(success_text, "success")
|
||||
return redirect(url_for("user_chat"))
|
||||
@@ -3066,7 +3014,7 @@ def admin_invoices():
|
||||
invoice_number = _sanitize_text(request.form.get("invoice_number") or "", 120)
|
||||
period = _sanitize_text(request.form.get("period") or "", 20)
|
||||
due_date = _sanitize_text(request.form.get("due_date") or "", 20)
|
||||
status = _sanitize_text(request.form.get("status") or "Offen", 40)
|
||||
status = _sanitize_text(request.form.get("status") or "Zu prüfen", 40)
|
||||
amount_text = _sanitize_text(request.form.get("amount_eur") or "0", 20)
|
||||
normalized_invoice_number = invoice_number or f"INV-{datetime.utcnow().strftime('%Y%m%d%H%M%S')}"
|
||||
pdf_path = _save_invoice_pdf(request.files.get("invoice_pdf"), normalized_invoice_number)
|
||||
@@ -3106,7 +3054,7 @@ def admin_invoices():
|
||||
update_payload = {
|
||||
"invoice_number": invoice_number,
|
||||
"period": _sanitize_text(request.form.get("period") or "", 20),
|
||||
"status": _sanitize_text(request.form.get("status") or "Offen", 40),
|
||||
"status": _sanitize_text(request.form.get("status") or "Zu prüfen", 40),
|
||||
"due_date": _sanitize_text(request.form.get("due_date") or "", 20),
|
||||
"amount_eur": amount,
|
||||
}
|
||||
|
||||
@@ -230,6 +230,29 @@ class instace:
|
||||
def __init__():
|
||||
return list()
|
||||
|
||||
def new_trial(name: str) -> bool:
|
||||
"""
|
||||
Generates a new trial instance with the subdomain [name].invario.eu
|
||||
|
||||
Input:
|
||||
- name -> String
|
||||
|
||||
Output:
|
||||
- bool if the creation of the instance works (True: creation worked; False: didnt work)
|
||||
|
||||
manage-tenant.sh trial <tenant_id> [port] [days]
|
||||
"""
|
||||
port_starter = 10002
|
||||
port = port_starter
|
||||
for i in instace.list():
|
||||
port =+ 1
|
||||
|
||||
if execute_script(_var, _cmd, "trial", clear_special(name), port):
|
||||
add_dns(name, port)
|
||||
return int(port)
|
||||
else:
|
||||
return False
|
||||
|
||||
def new(name: str) -> int:
|
||||
"""
|
||||
Generates a new instance with the subdomain [name].invario.eu
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
{% block content %}
|
||||
<section class="panel">
|
||||
<h1>Rechnungsverwaltung</h1>
|
||||
<p>Rechnungen für Nutzer erstellen, aktualisieren und löschen. Direktbuchungen werden hier automatisch mit zugewiesenem Admin und Buchungsunterlagen angezeigt.</p>
|
||||
<p>Rechnungen für Nutzer erstellen, aktualisieren und löschen. Neue Rechnungen starten mit dem Status „Zu prüfen“, damit der Admin sie zuerst kontrolliert. Direktbuchungen werden hier automatisch mit zugewiesenem Admin und Buchungsunterlagen angezeigt.</p>
|
||||
</section>
|
||||
|
||||
<section class="layout">
|
||||
@@ -22,7 +22,7 @@
|
||||
<input type="text" name="period" placeholder="Zeitraum (MM/YYYY)" required>
|
||||
<input type="text" name="amount_eur" placeholder="Betrag in EUR" required>
|
||||
<input type="text" name="due_date" placeholder="Fälligkeit (YYYY-MM-DD)">
|
||||
<input type="text" name="status" placeholder="Status (Offen, Bezahlt)">
|
||||
<input type="text" name="status" placeholder="Status (Zu prüfen, Geprüft, Bezahlt)">
|
||||
<input type="file" name="invoice_pdf" accept="application/pdf">
|
||||
<button type="submit">Rechnung anlegen</button>
|
||||
</form>
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
{% block content %}
|
||||
<section class="panel">
|
||||
<h1>Rechnungseinsicht</h1>
|
||||
<p>Alle Rechnungen im Überblick.</p>
|
||||
<p>Alle Rechnungen im Überblick. Der Admin prüft neue Rechnungen zuerst; der Status zeigt dir, ob die Rechnung noch geprüft wird oder bereits bearbeitet wurde.</p>
|
||||
</section>
|
||||
|
||||
<section class="table-wrap">
|
||||
|
||||
Reference in New Issue
Block a user