Bug fixes + archive feature for Destinatäre

- Make Destinatär names clickable in list view (link to detail page)
- Nachweis-Board: auto-create missing VierteljahresNachweis records
  for active Destinatäre when viewing a year (fixes missing Q1 2026)
- Add archive/deactivate toggle for Destinatäre (button on detail page)
  with AuditLog entry and confirmation dialog
- Default Destinatär list to show active only (filter preset to "Aktiv")

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
SysAdmin Agent
2026-03-11 20:07:30 +00:00
parent 113bd53a3a
commit cf127b043d
6 changed files with 47 additions and 3 deletions

View File

@@ -26,6 +26,11 @@ urlpatterns = [
views.destinataer_delete,
name="destinataer_delete",
),
path(
"destinataere/<uuid:pk>/archivieren/",
views.destinataer_toggle_archiv,
name="destinataer_toggle_archiv",
),
path(
"destinataere/<uuid:pk>/notiz/",
views.destinataer_notiz_create,

View File

@@ -18,6 +18,7 @@ from .destinataere import ( # noqa: F401
destinataer_create,
destinataer_update,
destinataer_delete,
destinataer_toggle_archiv,
destinataer_notiz_create,
destinataer_export,
)

View File

@@ -176,7 +176,7 @@ def destinataer_list(request):
search_query = request.GET.get("search", "")
familienzweig_filter = request.GET.get("familienzweig", "")
berufsgruppe_filter = request.GET.get("berufsgruppe", "")
aktiv_filter = request.GET.get("aktiv", "")
aktiv_filter = request.GET.get("aktiv", "true")
sort = request.GET.get("sort", "")
direction = request.GET.get("dir", "asc")
@@ -421,6 +421,24 @@ def destinataer_delete(request, pk):
return render(request, "stiftung/destinataer_confirm_delete.html", context)
@login_required
def destinataer_toggle_archiv(request, pk):
"""Destinatär aktivieren/deaktivieren (archivieren)."""
destinataer = get_object_or_404(Destinataer, pk=pk)
if request.method == "POST":
destinataer.aktiv = not destinataer.aktiv
destinataer.save(update_fields=["aktiv"])
status_text = "aktiviert" if destinataer.aktiv else "archiviert (inaktiv gesetzt)"
AuditLog.objects.create(
user=request.user,
action=f"Destinatär {destinataer.get_full_name()} wurde {status_text}.",
model_name="Destinataer",
object_id=str(destinataer.pk),
)
messages.success(request, f'Destinatär "{destinataer.get_full_name()}" wurde {status_text}.')
return redirect("stiftung:destinataer_detail", pk=destinataer.pk)
# Paechter Views (Landpächter)
@login_required
def destinataer_notiz_create(request, pk):

View File

@@ -1578,6 +1578,14 @@ def nachweis_board(request):
destinataere = Destinataer.objects.filter(aktiv=True).order_by("nachname", "vorname")
# Auto-create missing VierteljahresNachweis records for the filtered year
for d in destinataere:
for q in range(1, 5):
VierteljahresNachweis.objects.get_or_create(
destinataer=d, jahr=jahr_filter, quartal=q,
defaults={"status": "offen"},
)
board = []
for d in destinataere:
quartale = {}

View File

@@ -29,6 +29,18 @@
<i class="fas fa-times me-2"></i>Abbrechen
</button>
<form method="post" action="{% url 'stiftung:destinataer_toggle_archiv' pk=destinataer.pk %}" class="d-inline">
{% csrf_token %}
{% if destinataer.aktiv %}
<button type="submit" class="btn btn-outline-secondary me-2" onclick="return confirm('Destinatär archivieren? Er wird nicht mehr im Nachweis-Board und der aktiven Liste erscheinen.')">
<i class="fas fa-archive me-2"></i>Archivieren
</button>
{% else %}
<button type="submit" class="btn btn-outline-success me-2" onclick="return confirm('Destinatär wieder aktivieren?')">
<i class="fas fa-undo me-2"></i>Reaktivieren
</button>
{% endif %}
</form>
<a href="{% url 'stiftung:destinataer_list' %}" class="btn btn-outline-secondary">
<i class="fas fa-arrow-left me-2"></i>Zurück zur Liste
</a>

View File

@@ -130,10 +130,10 @@
{% for destinataer in page_obj %}
<tr>
<td>
<strong>{{ destinataer.vorname|default:"-" }}</strong>
<a href="{% url 'stiftung:destinataer_detail' pk=destinataer.pk %}" class="text-decoration-none fw-bold">{{ destinataer.vorname|default:"-" }}</a>
</td>
<td>
<strong>{{ destinataer.nachname }}</strong>
<a href="{% url 'stiftung:destinataer_detail' pk=destinataer.pk %}" class="text-decoration-none fw-bold">{{ destinataer.nachname }}</a>
{% if destinataer.geburtsdatum %}
<br><small class="text-muted">{{ destinataer.geburtsdatum|date:"d.m.Y" }}</small>
{% endif %}