feat(calllog): kontaktadresse_id als Pflicht-FK + is_erledigt()-Methoden

- Migration V01_13: Spalte kontaktadresse_id auf call_logs mit Backfill
  über die erste Kontaktadresse des Projekts; Commit vor dem
  Systeminfo-Update (Muster wie V01_08) gegen 'database is locked'.
- CallLog gehört zu genau einer Kontaktadresse (FK, Pflichtfeld);
  create/update validieren Existenz und Projekt-Zugehörigkeit.
- is_erledigt() auf Kontaktadresse (mind. ein erledigend-Tag reicht)
  und Projekt (False ohne Kontakte, sonst alle erledigt); beide in
  to_dict() serialisiert.
- Client: kontaktadresse_id in Notizmaske/Submit (required), Interfaces
  um is_erledigt erweitert.

Generated by Mistral Vibe.
Co-Authored-By: Mistral Vibe <vibe@mistral.ai>
This commit is contained in:
gg committed 2026-09-22 20:12:02 +02:00
1 parent 24b492c5c1
commit 977b64292c
9 files changed
+174 -18

No files matched your search

+5 -1
View File
@@ -63,6 +63,8 @@ export const kontaktadresseliste: m.ClosureComponent = (vnode) => {
id: -1,
projekt_id: kontaktadresse.projekt_id,
projekt_name: kontaktadresse.projekt_name,
// Kontaktadresse als Pflichtfeld an die Notizmaske durchreichen
kontaktadresse_id: kontaktadresse.id,
datum: datum,
uhrzeit_beginn: uhrzeit,
dauer: "",
@@ -246,7 +248,9 @@ export const Kontaktadresse: m.ClosureComponent = (vnode) => {
plz: (formData.get("plz") as string) || "",
ort: (formData.get("ort") as string) || "",
land: (formData.get("land") as string) || "",
notiz: (formData.get("notiz") as string) || ""
notiz: (formData.get("notiz") as string) || "",
// Server-seitig dynamisch berechnet; Platzhalter beim Senden.
is_erledigt: false
}
if (currentKontaktadresse.id === -1) {
createKontaktadresseREST(gespeicherteKontaktadresse).then(() => guard.navigateAfterSave()).catch((e) => { showServerError(e); guard.markDirty() })