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,
|
views.destinataer_delete,
|
||||||
name="destinataer_delete",
|
name="destinataer_delete",
|
||||||
),
|
),
|
||||||
|
path(
|
||||||
|
"destinataere/<uuid:pk>/archivieren/",
|
||||||
|
views.destinataer_toggle_archiv,
|
||||||
|
name="destinataer_toggle_archiv",
|
||||||
|
),
|
||||||
path(
|
path(
|
||||||
"destinataere/<uuid:pk>/notiz/",
|
"destinataere/<uuid:pk>/notiz/",
|
||||||
views.destinataer_notiz_create,
|
views.destinataer_notiz_create,
|
||||||
|
|||||||
@@ -18,6 +18,7 @@ from .destinataere import ( # noqa: F401
|
|||||||
destinataer_create,
|
destinataer_create,
|
||||||
destinataer_update,
|
destinataer_update,
|
||||||
destinataer_delete,
|
destinataer_delete,
|
||||||
|
destinataer_toggle_archiv,
|
||||||
destinataer_notiz_create,
|
destinataer_notiz_create,
|
||||||
destinataer_export,
|
destinataer_export,
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -176,7 +176,7 @@ def destinataer_list(request):
|
|||||||
search_query = request.GET.get("search", "")
|
search_query = request.GET.get("search", "")
|
||||||
familienzweig_filter = request.GET.get("familienzweig", "")
|
familienzweig_filter = request.GET.get("familienzweig", "")
|
||||||
berufsgruppe_filter = request.GET.get("berufsgruppe", "")
|
berufsgruppe_filter = request.GET.get("berufsgruppe", "")
|
||||||
aktiv_filter = request.GET.get("aktiv", "")
|
aktiv_filter = request.GET.get("aktiv", "true")
|
||||||
sort = request.GET.get("sort", "")
|
sort = request.GET.get("sort", "")
|
||||||
direction = request.GET.get("dir", "asc")
|
direction = request.GET.get("dir", "asc")
|
||||||
|
|
||||||
@@ -421,6 +421,24 @@ def destinataer_delete(request, pk):
|
|||||||
return render(request, "stiftung/destinataer_confirm_delete.html", context)
|
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)
|
# Paechter Views (Landpächter)
|
||||||
@login_required
|
@login_required
|
||||||
def destinataer_notiz_create(request, pk):
|
def destinataer_notiz_create(request, pk):
|
||||||
|
|||||||
@@ -1578,6 +1578,14 @@ def nachweis_board(request):
|
|||||||
|
|
||||||
destinataere = Destinataer.objects.filter(aktiv=True).order_by("nachname", "vorname")
|
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 = []
|
board = []
|
||||||
for d in destinataere:
|
for d in destinataere:
|
||||||
quartale = {}
|
quartale = {}
|
||||||
|
|||||||
@@ -29,6 +29,18 @@
|
|||||||
<i class="fas fa-times me-2"></i>Abbrechen
|
<i class="fas fa-times me-2"></i>Abbrechen
|
||||||
</button>
|
</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">
|
<a href="{% url 'stiftung:destinataer_list' %}" class="btn btn-outline-secondary">
|
||||||
<i class="fas fa-arrow-left me-2"></i>Zurück zur Liste
|
<i class="fas fa-arrow-left me-2"></i>Zurück zur Liste
|
||||||
</a>
|
</a>
|
||||||
|
|||||||
@@ -130,10 +130,10 @@
|
|||||||
{% for destinataer in page_obj %}
|
{% for destinataer in page_obj %}
|
||||||
<tr>
|
<tr>
|
||||||
<td>
|
<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>
|
||||||
<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 %}
|
{% if destinataer.geburtsdatum %}
|
||||||
<br><small class="text-muted">{{ destinataer.geburtsdatum|date:"d.m.Y" }}</small>
|
<br><small class="text-muted">{{ destinataer.geburtsdatum|date:"d.m.Y" }}</small>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|||||||
Reference in New Issue
Block a user