""" Geschäftslogik für die Entität CallLog (Gesprächsnotiz). 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-04 :version: 1.0 """ from db import dbapp from crm.model import CallLog, Projekt from auth.model.errors import ApplicationError, HtmlStatusCode session = dbapp.session def get_call_logs(): """ Liefert alle Gesprächsnotizen, sortiert nach Datum absteigend. """ return CallLog.query.order_by(CallLog.datum.desc()).all() def get_call_log(call_log_id: int) -> CallLog: """ Liefert eine einzelne Gesprächsnotiz anhand ihrer ID. Wirft ApplicationError (404), falls die Notiz nicht existiert. """ call_log = CallLog.query.get(call_log_id) if call_log is None: raise ApplicationError( "Gesprächsnotiz mit der ID {} wurde nicht gefunden.".format(call_log_id), htmlstatus=HtmlStatusCode.Not_Found, ) return call_log def create_call_log(data: dict) -> CallLog: """ Legt eine neue Gesprächsnotiz an. Die vom Client übergebene ID wird ignoriert; die ID wird serverseitig per Auto-Increment vergeben. - data: dict mit den Feldern projekt_id, datum, uhrzeit_beginn, dauer, betreff, name_ansprechpartner, telefon, notiz, wiedervorlage_datum, erledigt """ projekt_id = data.get("projekt_id") if projekt_id is None: raise ApplicationError( "Es muss ein Projekt ausgewählt werden.", htmlstatus=HtmlStatusCode.Bad_Request, ) projekt = Projekt.query.get(int(projekt_id)) if projekt is None: raise ApplicationError( "Das ausgewählte Projekt existiert nicht.", htmlstatus=HtmlStatusCode.Bad_Request, ) call_log = CallLog() call_log.projekt_id = int(projekt_id) call_log.datum = (data.get("datum") or "").strip() or None call_log.uhrzeit_beginn = (data.get("uhrzeit_beginn") or "").strip() or None call_log.dauer = (data.get("dauer") or "").strip() or None call_log.betreff = (data.get("betreff") or "").strip() or None call_log.name_ansprechpartner = (data.get("name_ansprechpartner") or "").strip() or None call_log.telefon = (data.get("telefon") or "").strip() or None call_log.notiz = (data.get("notiz") or "").strip() or None call_log.wiedervorlage_datum = (data.get("wiedervorlage_datum") or "").strip() or None call_log.erledigt = bool(data.get("erledigt", False)) session.add(call_log) session.commit() return call_log def update_call_log(data: dict) -> CallLog: """ Aktualisiert eine bestehende Gesprächsnotiz. Die ID im data-Dict bestimmt den zu ändernden Datensatz. """ call_log = get_call_log(data["id"]) projekt_id = data.get("projekt_id") if projekt_id is None: raise ApplicationError( "Es muss ein Projekt ausgewählt werden.", htmlstatus=HtmlStatusCode.Bad_Request, ) projekt = Projekt.query.get(int(projekt_id)) if projekt is None: raise ApplicationError( "Das ausgewählte Projekt existiert nicht.", htmlstatus=HtmlStatusCode.Bad_Request, ) call_log.projekt_id = int(projekt_id) call_log.datum = (data.get("datum") or "").strip() or None call_log.uhrzeit_beginn = (data.get("uhrzeit_beginn") or "").strip() or None call_log.dauer = (data.get("dauer") or "").strip() or None call_log.betreff = (data.get("betreff") or "").strip() or None call_log.name_ansprechpartner = (data.get("name_ansprechpartner") or "").strip() or None call_log.telefon = (data.get("telefon") or "").strip() or None call_log.notiz = (data.get("notiz") or "").strip() or None call_log.wiedervorlage_datum = (data.get("wiedervorlage_datum") or "").strip() or None call_log.erledigt = bool(data.get("erledigt", False)) session.commit() return call_log def delete_call_log(call_log_id: int): """ Löscht eine Gesprächsnotiz anhand ihrer ID. Wirft ApplicationError (404), falls die Notiz nicht existiert. """ call_log = get_call_log(call_log_id) session.delete(call_log) session.commit()