""" Geschäftslogik für die Entität Kontakt. Diese Funktionen kapseln den DB-Zugriff und die fachlichen Validierungen. Aufgerufen werden sie aus crm/routes.py; die Autorisierungsprüfung erfolgt dort über den Decorator authorisation_required. :author: Mistral Vibe :date: 2026-09-03 :version: 1.0 """ from db import dbapp from crm.model import Kontakt, Kunde from auth.model.errors import ApplicationError, HtmlStatusCode session = dbapp.session def get_kontakte(): """ Liefert alle Kontakte, sortiert nach Name. """ return Kontakt.query.order_by(Kontakt.name).all() def get_kontakt(kontakt_id: int) -> Kontakt: """ Liefert einen einzelnen Kontakt anhand seiner ID. Wirft ApplicationError (404), falls der Kontakt nicht existiert. """ kontakt = Kontakt.query.get(kontakt_id) if kontakt is None: raise ApplicationError( "Kontakt mit der ID {} wurde nicht gefunden.".format(kontakt_id), htmlstatus=HtmlStatusCode.Not_Found, ) return kontakt def create_kontakt(data: dict) -> Kontakt: """ Legt einen neuen Kontakt an. Die vom Client übergebene ID wird ignoriert; die ID wird serverseitig per Auto-Increment vergeben. - data: dict mit den Feldern kunden_id, anrede, name, position, telefon, email, notiz """ kunden_id = data.get("kunden_id") if kunden_id is None: raise ApplicationError( "Es muss ein Kunde ausgewählt werden.", htmlstatus=HtmlStatusCode.Bad_Request, ) kunde = Kunde.query.get(int(kunden_id)) if kunde is None: raise ApplicationError( "Der ausgewählte Kunde existiert nicht.", htmlstatus=HtmlStatusCode.Bad_Request, ) if not data.get("name") or not str(data["name"]).strip(): raise ApplicationError( "Der Kontaktname darf nicht leer sein.", htmlstatus=HtmlStatusCode.Bad_Request, ) kontakt = Kontakt() kontakt.kunden_id = int(kunden_id) kontakt.anrede = (data.get("anrede") or "").strip() or None kontakt.name = data["name"].strip() kontakt.position = (data.get("position") or "").strip() or None kontakt.telefon = (data.get("telefon") or "").strip() or None kontakt.email = (data.get("email") or "").strip() or None kontakt.notiz = (data.get("notiz") or "").strip() or None session.add(kontakt) session.commit() return kontakt def update_kontakt(data: dict) -> Kontakt: """ Aktualisiert einen bestehenden Kontakt. Die ID im data-Dict bestimmt den zu ändernden Datensatz. """ kontakt = get_kontakt(data["id"]) kunden_id = data.get("kunden_id") if kunden_id is None: raise ApplicationError( "Es muss ein Kunde ausgewählt werden.", htmlstatus=HtmlStatusCode.Bad_Request, ) kunde = Kunde.query.get(int(kunden_id)) if kunde is None: raise ApplicationError( "Der ausgewählte Kunde existiert nicht.", htmlstatus=HtmlStatusCode.Bad_Request, ) if not data.get("name") or not str(data["name"]).strip(): raise ApplicationError( "Der Kontaktname darf nicht leer sein.", htmlstatus=HtmlStatusCode.Bad_Request, ) kontakt.kunden_id = int(kunden_id) kontakt.anrede = (data.get("anrede") or "").strip() or None kontakt.name = data["name"].strip() kontakt.position = (data.get("position") or "").strip() or None kontakt.telefon = (data.get("telefon") or "").strip() or None kontakt.email = (data.get("email") or "").strip() or None kontakt.notiz = (data.get("notiz") or "").strip() or None session.commit() return kontakt def delete_kontakt(kontakt_id: int): """ Löscht einen Kontakt anhand seiner ID. Wirft ApplicationError (404), falls der Kontakt nicht existiert. """ kontakt = get_kontakt(kontakt_id) session.delete(kontakt) session.commit()