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:
@@ -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,
|
||||
|
||||
@@ -18,6 +18,7 @@ from .destinataere import ( # noqa: F401
|
||||
destinataer_create,
|
||||
destinataer_update,
|
||||
destinataer_delete,
|
||||
destinataer_toggle_archiv,
|
||||
destinataer_notiz_create,
|
||||
destinataer_export,
|
||||
)
|
||||
|
||||
@@ -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):
|
||||
|
||||
@@ -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 = {}
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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 %}
|
||||
|
||||
Reference in New Issue
Block a user