feat: configure member number allocation strategy

This commit is contained in:
Marcel Peterkau
2026-07-30 19:07:18 +02:00
parent 460dcac77c
commit cfd5de42f2
3 changed files with 190 additions and 24 deletions
+33 -7
View File
@@ -47,6 +47,7 @@ class OptionsDialog(tk.Toplevel):
number_policy = repository.get_member_number_policy()
self.manual_numbers_var = tk.BooleanVar(value=number_policy["mode"] == "manual")
self.number_pattern_var = tk.StringVar(value=number_policy["pattern"])
self.number_strategy_var = tk.StringVar(value=number_policy["allocation_strategy"])
self.number_preview_var = tk.StringVar()
organization = repository.get_configuration().get("organization") or {}
if not isinstance(organization, dict):
@@ -280,19 +281,38 @@ class OptionsDialog(tk.Toplevel):
text="Platzhalter: {number}, {number:04d} und optional {year}",
style="Muted.TLabel",
).grid(row=2, column=1, sticky="w", pady=(0, 12))
ttk.Label(parent, text="Nächste Nummer").grid(row=3, column=0, sticky="w", padx=(0, 12), pady=6)
ttk.Label(parent, text="Vergabestrategie").grid(
row=3, column=0, sticky="nw", padx=(0, 12), pady=6
)
strategy_frame = ttk.Frame(parent)
strategy_frame.grid(row=3, column=1, sticky="w", pady=6)
ttk.Radiobutton(
strategy_frame,
text="Lücken füllen (nächste freie Nummer)",
variable=self.number_strategy_var,
value="next_free",
command=self._update_number_preview,
).pack(anchor="w")
ttk.Radiobutton(
strategy_frame,
text="Immer Max++ (höchste Nummer + 1)",
variable=self.number_strategy_var,
value="max_plus_one",
command=self._update_number_preview,
).pack(anchor="w", pady=(4, 0))
ttk.Label(parent, text="Nächste Nummer").grid(row=4, column=0, sticky="w", padx=(0, 12), pady=6)
ttk.Label(parent, textvariable=self.number_preview_var, style="TimelineHeader.TLabel").grid(
row=3, column=1, sticky="w", pady=6
row=4, column=1, sticky="w", pady=6
)
ttk.Label(
parent,
text=(
"Der Zähler wird pro Pattern im Mitglieder-Store geführt. Bereits vergebene Nummern "
"werden niemals doppelt erzeugt."
"Die Strategie wird im Mitglieder-Store gespeichert. Die Vergabe ist gesperrt, "
"solange ein neues Mitglied angelegt wird, damit keine Nummer doppelt entsteht."
),
style="Muted.TLabel",
wraplength=620,
).grid(row=4, column=0, columnspan=2, sticky="w", pady=(14, 0))
).grid(row=5, column=0, columnspan=2, sticky="w", pady=(14, 0))
self.number_pattern_var.trace_add("write", lambda *_args: self._update_number_preview())
self._update_member_number_controls()
@@ -309,7 +329,9 @@ class OptionsDialog(tk.Toplevel):
return
pattern = self.number_pattern_var.get()
try:
preview = self.repository.preview_member_number(pattern)
preview = self.repository.preview_member_number(
pattern, self.number_strategy_var.get()
)
except RepositoryError as exc:
preview = f"UNGÜLTIG: {exc}"
self.number_preview_var.set(preview)
@@ -409,7 +431,11 @@ class OptionsDialog(tk.Toplevel):
)
try:
self.config_obj.save()
self.repository.save_member_number_policy(mode=number_mode, pattern=number_pattern)
self.repository.save_member_number_policy(
mode=number_mode,
pattern=number_pattern,
allocation_strategy=self.number_strategy_var.get(),
)
self.repository.save_organization(
{key: variable.get() for key, variable in self.organization_vars.items()}
)