feat: add itemized claims and payments

This commit is contained in:
Marcel Peterkau
2026-06-21 18:20:55 +02:00
parent c717d6806b
commit 80d4d5ef90
12 changed files with 1049 additions and 6 deletions
+17 -4
View File
@@ -7,6 +7,7 @@ from collections.abc import Callable
from datetime import datetime
from tkinter import messagebox, ttk
from ccma.domain.contributions import CLAIM_STATUS_LABELS, claim_status, claim_total, money_text
from ccma.domain.dates import age_label, date_input_hint, format_date_for_display
from ccma.domain.models import MEMBERSHIP_STATUS_LABELS as STATUS_LABELS
from ccma.domain.models import Event
@@ -21,12 +22,14 @@ class MemberTab(ttk.Frame):
member_id: str,
on_close: Callable[[], None],
on_changed: Callable[[], None],
on_open_claim: Callable[[str, str], None],
):
super().__init__(master, padding=12)
self.repository = repository
self.member_id = member_id
self.on_close = on_close
self.on_changed = on_changed
self.on_open_claim = on_open_claim
self.member = repository.get_member(member_id)
self.variables: dict[str, tk.Variable] = {}
self._build_ui()
@@ -152,6 +155,8 @@ class MemberTab(ttk.Frame):
self.claims.heading(key, text=title)
self.claims.column(key, width=width, anchor="w")
self.claims.grid(row=1, column=0, sticky="nsew")
self.claims.bind("<Double-1>", lambda _event: self._open_selected_claim())
self.claims.bind("<Return>", lambda _event: self._open_selected_claim())
documents_tab.columnconfigure(0, weight=1)
documents_tab.rowconfigure(1, weight=1)
@@ -213,19 +218,27 @@ class MemberTab(ttk.Frame):
except RepositoryError as exc:
self.contribution_summary.set(f"FEHLER: {exc}")
return
for claim in data.claims:
for index, claim in enumerate(data.claims):
claim_id = str(claim.get("claim_id") or f"missing-id-{index}")
status = claim_status(data, claim)
self.claims.insert(
"",
"end",
iid=claim_id,
values=(
claim.get("title", "Beitrag"),
claim.get("due_date", ""),
claim.get("amount", ""),
claim.get("status", "open"),
format_date_for_display(str(claim.get("due_date", ""))),
money_text(claim_total(claim)),
CLAIM_STATUS_LABELS.get(status, status.upper()),
),
)
self.contribution_summary.set(f"{len(data.claims)} Forderungen · {len(data.payments)} Zahlungen")
def _open_selected_claim(self) -> None:
selected = self.claims.selection()
if selected and not selected[0].startswith("missing-id-"):
self.on_open_claim(self.member_id, selected[0])
def _refresh_documents(self) -> None:
self.documents.delete(0, "end")
root = self.repository.members_root / self.member_id / "files"