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>
106 lines
3.5 KiB
TypeScript
106 lines
3.5 KiB
TypeScript
import m from "mithril"
|
|
|
|
/**
|
|
* Datenmodell für eine Kontaktadresse (Akquise-Ziel innerhalb eines Projekts).
|
|
* Jede Kontaktadresse ist genau einem Projekt zugeordnet (FK projekt_id).
|
|
* Die Feldnamen entsprechen den serverseitigen ORM-Spalten (snake_case).
|
|
* projekt_name und kunden_name sind keine ORM-Spalten, sondern werden
|
|
* serverseitig aus den Projekt-/Kunde-Relationships abgeleitet und im
|
|
* JSON ergänzt. is_erledigt ist ebenfalls keine Spalte, sondern wird
|
|
* serverseitig dynamisch berechnet: True, sobald mindestens eine
|
|
* Gesprächsnotiz des Kontakts einen Tag mit is_erledigend=True hat.
|
|
*/
|
|
export interface iKontaktadresse {
|
|
id: number
|
|
projekt_id: number
|
|
projekt_name: string
|
|
kunden_name: string
|
|
anrede: string
|
|
name: string
|
|
firma: string
|
|
position: string
|
|
telefon: string
|
|
email: string
|
|
strasse: string
|
|
plz: string
|
|
ort: string
|
|
land: string
|
|
notiz: string
|
|
/** Dynamisch berechneter Erledigt-Status (keine ORM-Spalte). */
|
|
is_erledigt: boolean
|
|
}
|
|
|
|
/* ------------------------------------------------------------------ */
|
|
/* REST-API-Aufrufe (Client-Seite) */
|
|
/* ------------------------------------------------------------------ */
|
|
/* Die folgenden Funktionen kapseln die Kommunikation mit den */
|
|
/* serverseitigen REST-Endpunkten (/xhr/kontaktadresse/*). */
|
|
/* ------------------------------------------------------------------ */
|
|
|
|
/**
|
|
* Basis-Pfad der Kontaktadressen-REST-Endpunkte.
|
|
*/
|
|
const KONTAKTADRESSE_REST_BASE = "/xhr/kontaktadresse"
|
|
|
|
/**
|
|
* Lädt die Kontaktadressenliste vom Server.
|
|
* Ist projektId gesetzt (>= 0), werden nur die Kontaktadressen dieses
|
|
* Projekts geliefert (serverseitige Filterung). Ohne Parameter werden
|
|
* alle Kontaktadressen geliefert.
|
|
*/
|
|
export function fetchKontaktadressen(projektId?: number): Promise<iKontaktadresse[]> {
|
|
const params: Record<string, any> = {}
|
|
if (projektId !== undefined && projektId >= 0) {
|
|
params.projekt_id = projektId
|
|
}
|
|
return m.request({
|
|
method: "GET",
|
|
url: KONTAKTADRESSE_REST_BASE + "/list",
|
|
params: params
|
|
}).then((result) => result as iKontaktadresse[])
|
|
}
|
|
|
|
/**
|
|
* Lädt eine einzelne Kontaktadresse anhand ihrer ID vom Server.
|
|
*/
|
|
export function fetchKontaktadresseById(id: number): Promise<iKontaktadresse> {
|
|
return m.request({
|
|
method: "GET",
|
|
url: KONTAKTADRESSE_REST_BASE + "/get",
|
|
params: {id: id}
|
|
}).then((result) => result as iKontaktadresse)
|
|
}
|
|
|
|
/**
|
|
* Legt eine neue Kontaktadresse serverseitig an.
|
|
*/
|
|
export function createKontaktadresseREST(kontaktadresse: iKontaktadresse): Promise<iKontaktadresse> {
|
|
return m.request({
|
|
method: "POST",
|
|
url: KONTAKTADRESSE_REST_BASE + "/create",
|
|
body: kontaktadresse
|
|
}).then((result) => result as iKontaktadresse)
|
|
}
|
|
|
|
/**
|
|
* Aktualisiert eine bestehende Kontaktadresse serverseitig.
|
|
*/
|
|
export function updateKontaktadresseREST(kontaktadresse: iKontaktadresse): Promise<iKontaktadresse> {
|
|
return m.request({
|
|
method: "PUT",
|
|
url: KONTAKTADRESSE_REST_BASE + "/update",
|
|
body: kontaktadresse
|
|
}).then((result) => result as iKontaktadresse)
|
|
}
|
|
|
|
/**
|
|
* Löscht eine Kontaktadresse serverseitig anhand ihrer ID.
|
|
*/
|
|
export function deleteKontaktadresseREST(id: number): Promise<void> {
|
|
return m.request({
|
|
method: "DELETE",
|
|
url: KONTAKTADRESSE_REST_BASE + "/delete",
|
|
params: {id: id}
|
|
}).then(() => undefined)
|
|
}
|