changes to the Rechnungs Processing

This commit is contained in:
2026-08-29 08:55:03 +02:00
parent d08117e1a3
commit dd35b37fb5
2 changed files with 63 additions and 48 deletions
+45 -34
View File
@@ -9,6 +9,7 @@ from fpdf import FPDF
from flask import current_app
from pymongo import MongoClient
import threading
from bson import Binary, ObjectId
from datetime import datetime, timezone, timedelta
@@ -516,11 +517,6 @@ def send_accreditation_email(
invoice_to_attach = invoice_path
db_pdf_path = relative_invoice_path
if current_app:
static_dir = current_app.static_folder
else:
static_dir = os.path.join(os.getcwd(), "static")
def get_valid_pdf_path(filename):
possible_paths = [
os.path.join(static_dir, "downloads", filename),
@@ -536,7 +532,7 @@ def send_accreditation_email(
agb_pdf_path = get_valid_pdf_path("AGB Invario.pdf")
avv_pdf_path = get_valid_pdf_path("AVV Invario.pdf")
# 3. E-Mail Inhalte
# 4. E-Mail Inhalte
subject = "Ihre Zugangsdaten und Unterlagen für Invario"
text_note = (
@@ -571,18 +567,14 @@ def send_accreditation_email(
</div>
"""
# 4. Vorhandene Anhänge sammeln
# 5. Vorhandene Anhänge sammeln
attachments = []
if os.path.exists(contract_pdf_path):
attachments.append(contract_pdf_path)
if invoice_to_attach and os.path.exists(invoice_to_attach):
attachments.append(invoice_to_attach)
if agb_pdf_path:
attachments.append(agb_pdf_path)
if avv_pdf_path:
attachments.append(avv_pdf_path)
@@ -615,7 +607,7 @@ def send_accreditation_email(
def close(self):
return None
def _get_mongo_client() -> MongoClient:
def _get_mongo_client():
global _MONGO_CLIENT
if _MONGO_CLIENT is not None:
return _MONGO_CLIENT
@@ -645,33 +637,50 @@ def send_accreditation_email(
def _utc_now_iso():
return datetime.now(timezone.utc).isoformat()
# Berechne das Fälligkeitsdatum (30 Tage ab heute)
# Berechne das Fälligkeitsdatum (14 Tage ab heute)
computed_due_date = (datetime.now(timezone.utc) + timedelta(days=14)).strftime("%d %B %Y")
# Collections abrufen
req_client, req_col = _get_collection("instance_requests")
inv_client, col = _get_collection("invoices") # Collection für Rechnungen initialisieren
inv_client, col = _get_collection("invoices")
# 1. Die neue Rechnung in die Datenbank (invoices-Collection) schreiben
# Wir nutzen hier die übergebenen Funktionsparameter anstatt des undefinierten "prov"
col.insert_one(
{
"username": user_id,
"school_name": school_name,
"address": address,
"invoice_number": current_invoice_number,
"period": date,
"amount_eur": price,
"status": "Zu prüfen",
"due_date": computed_due_date,
"pdf_path": db_pdf_path,
"created_at": _utc_now_iso(),
"source": "booking_payment",
"software_name": software_name,
"domain": domain
}
)
# 6. Die generierte PDF-Datei als Binär-Daten für MongoDB einlesen
rechnung_bytes = None
if invoice_to_attach and os.path.exists(invoice_to_attach):
try:
with open(invoice_to_attach, "rb") as f:
rechnung_bytes = f.read()
except Exception as e:
# Im Falle eines Dateilesefehlers überspringen wir das Speichern des Binaries
pass
# 7. Die neue Rechnung in die Datenbank (invoices-Collection) schreiben
invoice_document = {
"username": user_id,
"school_name": school_name,
"address": address,
"invoice_number": current_invoice_number,
"period": date,
"amount_eur": price,
"status": "Zu prüfen",
"due_date": computed_due_date,
"pdf_path": db_pdf_path,
"created_at": _utc_now_iso(),
"source": "booking_payment",
"software_name": software_name,
"domain": domain
}
# Binärdaten der Rechnung hinzufügen, falls erfolgreich eingelesen
if rechnung_bytes:
invoice_document["rechnung_data"] = Binary(rechnung_bytes)
invoice_document["rechnung_filename"] = invoice_filename
invoice_document["rechnung_mimetype"] = "application/pdf"
# In MongoDB einfügen
col.insert_one(invoice_document)
# Anfrage-Status aktualisieren
req_col.update_one(
{"username": user_id},
{"$set": {
@@ -680,11 +689,13 @@ def send_accreditation_email(
}}
)
# 5. E-Mail versenden & NUR temporäre Dateien löschen
# 8. E-Mail versenden & NUR temporäre Dateien löschen
try:
success = send(recipient, subject, text_body=text_note, html_body=html_note, attachments=attachments)
return success
finally:
# Nur der generierte Hauptvertrag liegt in 'tempfile.gettempdir()' und wird gelöscht.
# Die Rechnung im '/static/invoices/' Ordner bleibt unangetastet (sowie als Backup auf der Festplatte).
if os.path.exists(contract_pdf_path):
try:
os.remove(contract_pdf_path)