feat(workflow): Tages-Workflow-UI für Telefon-Akquise (Liste + Maske)
Server: neuer Endpunkt /xhr/workflow/list aggregiert pro Kontaktadresse die letzte Gesprächsnotiz, das effektiv gültige Wiedervorlage-Datum (jüngste Notiz mit Wert), den Erledigt-Status und eine priorisierte Sortierung (überfällig → ohne Notizen → Rest). Filter: kunden_id, status (offen/erledigt), wiedervorlage (heute/3tage/ueberfaellig/woche). Sichtbarkeit wie kontaktadressen über projekt_users. CallLog erfasst den Ersteller serverseitig (user_id, Migration _db_V01_14, kein FK wegen separater Auth-DB); to_dict ergänzt mitarbeiter_name. calllog_list unterstützt kontaktadresse_id als Filter. Client: TagesWorkflowListe (Route /tagesworkflow, Filterleiste) und TagesWorkflowMaske (Route /tagesworkflowkontakt, lesende Historie, Notiz-Formular mit "Speichern und weiter"), Routes + Menüpunkt erster Eintrag. berechneWiedervorlageDatum aus der Call_Log-Maske nach models/tag.ts ausgelagert (gemeinsame Nutzung). Generated by Mistral Vibe. Co-Authored-By: Mistral Vibe <vibe@mistral.ai>
This commit is contained in:
1 parent
981b28df03
commit
c96ed6e97d
13 files changed
+1247
-44
No files matched your search
@@ -94,13 +94,17 @@ def _get_validierte_kontaktadresse_id(data: dict, projekt_id) -> int:
|
||||
return kontaktadresse.id
|
||||
|
||||
|
||||
def get_call_logs(projekt_id: int | None = None, user_id: int | None = None):
|
||||
def get_call_logs(projekt_id: int | None = None,
|
||||
user_id: int | None = None,
|
||||
kontaktadresse_id: int | None = None):
|
||||
"""
|
||||
Liefert Gesprächsnotizen, sortiert nach Datum absteigend.
|
||||
|
||||
Ist projekt_id gesetzt, werden nur die Notizen dieses Projekts
|
||||
zurückgegeben (serverseitige Filterung). Ohne projekt_id werden
|
||||
alle Notizen geliefert.
|
||||
zurückgegeben (serverseitige Filterung). Ist kontaktadresse_id
|
||||
gesetzt, werden nur die Notizen dieses Kontakts zurückgegeben —
|
||||
beide Filter können kombiniert werden. Ohne Filter werden alle
|
||||
Notizen geliefert.
|
||||
|
||||
Ist user_id gesetzt, werden nur Notizen von Projekten geliefert, denen
|
||||
der Nutzer über projekt_users zugeordnet ist (Sichtbarkeits-Filterung).
|
||||
@@ -109,6 +113,8 @@ def get_call_logs(projekt_id: int | None = None, user_id: int | None = None):
|
||||
query = CallLog.query
|
||||
if projekt_id is not None:
|
||||
query = query.filter(CallLog.projekt_id == projekt_id)
|
||||
if kontaktadresse_id is not None:
|
||||
query = query.filter(CallLog.kontaktadresse_id == kontaktadresse_id)
|
||||
if user_id is not None:
|
||||
# Nur Notizen von Projekten, denen der Nutzer zugeordnet ist.
|
||||
query = query.filter(
|
||||
@@ -148,7 +154,7 @@ def get_call_log(call_log_id: int, user_id: int | None = None) -> CallLog:
|
||||
return call_log
|
||||
|
||||
|
||||
def create_call_log(data: dict) -> CallLog:
|
||||
def create_call_log(data: dict, user_id: int | None = None) -> CallLog:
|
||||
"""
|
||||
Legt eine neue Gesprächsnotiz an. Die vom Client übergebene ID wird
|
||||
ignoriert; die ID wird serverseitig per Auto-Increment vergeben.
|
||||
@@ -156,6 +162,11 @@ def create_call_log(data: dict) -> CallLog:
|
||||
- data: dict mit den Feldern projekt_id, kontaktadresse_id, datum,
|
||||
uhrzeit_beginn, dauer, betreff, name_ansprechpartner, telefon,
|
||||
notiz, wiedervorlage_datum, erledigt, tag_ids
|
||||
- user_id: ID des angemeldeten Mitarbeiters, der die Notiz erfasst
|
||||
(Ersteller). Wird von der Route übergeben (current_user.id),
|
||||
damit diese Funktion frei vom Flask-Request-Kontext bleibt.
|
||||
Der Ersteller wird beim Anlegen gesetzt und beim späteren
|
||||
Update nicht mehr verändert.
|
||||
"""
|
||||
projekt_id = data.get("projekt_id")
|
||||
if projekt_id is None:
|
||||
@@ -173,6 +184,12 @@ def create_call_log(data: dict) -> CallLog:
|
||||
call_log = CallLog()
|
||||
call_log.projekt_id = int(projekt_id)
|
||||
call_log.kontaktadresse_id = kontaktadresse_id
|
||||
# Ersteller erfassen: welcher Mitarbeiter den Anruf getätigt hat.
|
||||
# Alt-Notizen (vor der user_id-Spalte angelegt) haben NULL; neue
|
||||
# Notizen ohne Angabe erhalten ebenfalls NULL, bleiben aber die
|
||||
# Ausnahme, da die Route immer current_user.id übergibt.
|
||||
if user_id is not None:
|
||||
call_log.user_id = int(user_id)
|
||||
call_log.datum = _parse_date(data.get("datum"))
|
||||
call_log.uhrzeit_beginn = (data.get("uhrzeit_beginn") or "").strip() or None
|
||||
call_log.dauer = (data.get("dauer") or "").strip() or None
|
||||
|
||||
Reference in new issue
Block a user