""" Geschäftslogik für die Entität Kunde. 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-02 :version: 1.0 """ from db import dbapp from crm.model import Kunde from auth.model.errors import ApplicationError, HtmlStatusCode session = dbapp.session def get_kunden(): """ Liefert alle Kunden, sortiert nach Name. """ return Kunde.query.order_by(Kunde.name).all() def get_kunde(kunde_id: int) -> Kunde: """ Liefert einen einzelnen Kunden anhand seiner ID. Wirft ApplicationError (404), falls der Kunde nicht existiert. """ kunde = Kunde.query.get(kunde_id) if kunde is None: raise ApplicationError( "Kunde mit der ID {} wurde nicht gefunden.".format(kunde_id), htmlstatus=HtmlStatusCode.Not_Found, ) return kunde def create_kunde(data: dict) -> Kunde: """ Legt einen neuen Kunden an. Die vom Client übergebene ID wird ignoriert; die ID wird serverseitig per Auto-Increment vergeben. - data: dict mit den Feldern name, strasse, plz, ort, land """ if not data.get("name") or not str(data["name"]).strip(): raise ApplicationError( "Der Kundenname darf nicht leer sein.", htmlstatus=HtmlStatusCode.Bad_Request, ) kunde = Kunde() kunde.name = data["name"].strip() kunde.strasse = data.get("strasse") or None kunde.plz = data.get("plz") or None kunde.ort = data.get("ort") or None kunde.land = data.get("land") or None session.add(kunde) session.commit() return kunde def update_kunde(data: dict) -> Kunde: """ Aktualisiert einen bestehenden Kunden. Die ID im data-Dict bestimmt den zu ändernden Datensatz. """ kunde = get_kunde(data["id"]) if not data.get("name") or not str(data["name"]).strip(): raise ApplicationError( "Der Kundenname darf nicht leer sein.", htmlstatus=HtmlStatusCode.Bad_Request, ) kunde.name = data["name"].strip() kunde.strasse = data.get("strasse") or None kunde.plz = data.get("plz") or None kunde.ort = data.get("ort") or None kunde.land = data.get("land") or None session.commit() return kunde def delete_kunde(kunde_id: int): """ Löscht einen Kunden anhand seiner ID. Wirft ApplicationError (404), falls der Kunde nicht existiert. """ kunde = get_kunde(kunde_id) session.delete(kunde) session.commit()