feat: submission confirmation and payment locking
This commit is contained in:
115
claims/admin.py
115
claims/admin.py
@@ -1,6 +1,11 @@
|
||||
from django.conf import settings
|
||||
from django.contrib import admin
|
||||
from django.shortcuts import redirect
|
||||
from django.urls import path, reverse
|
||||
from django.utils import timezone
|
||||
from django.utils.html import format_html
|
||||
|
||||
from .models import Claim, ClaimLog, Project
|
||||
from .models import Claim, ClaimLog, Project, SystemSetting
|
||||
|
||||
|
||||
class ClaimLogInline(admin.TabularInline):
|
||||
@@ -12,11 +17,113 @@ class ClaimLogInline(admin.TabularInline):
|
||||
|
||||
@admin.register(Claim)
|
||||
class ClaimAdmin(admin.ModelAdmin):
|
||||
list_display = ("full_name", "amount", "currency", "project", "status", "created_at", "submitted_by")
|
||||
list_filter = ("status", "created_at", "project")
|
||||
list_display = ("full_name", "amount", "currency", "project", "status", "paid", "created_at", "submitted_by")
|
||||
list_filter = ("status", "created_at", "project", "paid_at")
|
||||
search_fields = ("full_name", "email", "description")
|
||||
readonly_fields = ("created_at", "updated_at")
|
||||
base_readonly = ("created_at", "updated_at", "paid_at", "paid_by", "internal_payments_enabled", "reset_paid_button")
|
||||
readonly_fields = base_readonly
|
||||
inlines = [ClaimLogInline]
|
||||
actions = ("mark_as_paid", "mark_as_unpaid")
|
||||
|
||||
@admin.display(boolean=True, description="Betald")
|
||||
def paid(self, obj):
|
||||
return obj.is_paid
|
||||
|
||||
@admin.display(description="Intern betalningshantering på?")
|
||||
def internal_payments_enabled(self, obj):
|
||||
return SystemSetting.internal_payments_active()
|
||||
|
||||
@admin.display(description="Återställ betalning")
|
||||
def reset_paid_button(self, obj):
|
||||
if not obj.is_paid:
|
||||
return "Ej betald"
|
||||
url = reverse("admin:claims_claim_reset_payment", args=[obj.pk])
|
||||
return format_html(
|
||||
'<a class="button" href="{}" onclick="return confirm(\'Ta bort betalningsmarkeringen?\');">Resetta</a>',
|
||||
url,
|
||||
)
|
||||
|
||||
@admin.action(description="Markera valda som betalda")
|
||||
def mark_as_paid(self, request, queryset):
|
||||
count = 0
|
||||
for claim in queryset.filter(status=Claim.Status.APPROVED, paid_at__isnull=True):
|
||||
claim.paid_at = timezone.now()
|
||||
claim.paid_by = request.user
|
||||
claim.save(update_fields=["paid_at", "paid_by"])
|
||||
claim.add_log(
|
||||
action=ClaimLog.Action.MARKED_PAID,
|
||||
performed_by=request.user,
|
||||
note="Markerad som betald via Django admin.",
|
||||
)
|
||||
count += 1
|
||||
if count:
|
||||
self.message_user(request, f"{count} utlägg markerades som betalda.")
|
||||
else:
|
||||
self.message_user(request, "Inga utlägg markerades – kontrollera status/betalning.", level="warning")
|
||||
|
||||
@admin.action(description="Återställ betalningsstatus (markera som obetalda)")
|
||||
def mark_as_unpaid(self, request, queryset):
|
||||
count = 0
|
||||
for claim in queryset.filter(paid_at__isnull=False):
|
||||
claim.paid_at = None
|
||||
claim.paid_by = None
|
||||
claim.save(update_fields=["paid_at", "paid_by"])
|
||||
claim.add_log(
|
||||
action=ClaimLog.Action.MARKED_PAID,
|
||||
performed_by=request.user,
|
||||
note="Betalningsstatus återställd via Django admin.",
|
||||
)
|
||||
count += 1
|
||||
if count:
|
||||
self.message_user(request, f"{count} utlägg markerades som obetalda.")
|
||||
else:
|
||||
self.message_user(request, "Inga utlägg behövde återställas.", level="warning")
|
||||
|
||||
def save_model(self, request, obj, form, change):
|
||||
super().save_model(request, obj, form, change)
|
||||
|
||||
def get_urls(self):
|
||||
urls = super().get_urls()
|
||||
custom_urls = [
|
||||
path(
|
||||
"<int:claim_id>/reset-payment/",
|
||||
self.admin_site.admin_view(self.reset_payment_view),
|
||||
name="claims_claim_reset_payment",
|
||||
),
|
||||
]
|
||||
return custom_urls + urls
|
||||
|
||||
def reset_payment_view(self, request, claim_id):
|
||||
claim = Claim.objects.filter(pk=claim_id).first()
|
||||
if not claim:
|
||||
self.message_user(request, "Utlägget hittades inte.", level="error")
|
||||
return redirect("admin:claims_claim_changelist")
|
||||
claim.paid_at = None
|
||||
claim.paid_by = None
|
||||
claim.save(update_fields=["paid_at", "paid_by"])
|
||||
claim.add_log(
|
||||
action=ClaimLog.Action.MARKED_PAID,
|
||||
performed_by=request.user,
|
||||
note="Betalningsstatus återställd via reset-knapp i admin.",
|
||||
)
|
||||
self.message_user(request, f"{claim} markerades som obetald.")
|
||||
return redirect("admin:claims_claim_change", claim_id)
|
||||
|
||||
def get_readonly_fields(self, request, obj=None):
|
||||
if obj and obj.is_paid:
|
||||
return self.base_readonly + ("status", "decision_note")
|
||||
return self.base_readonly
|
||||
|
||||
|
||||
@admin.register(SystemSetting)
|
||||
class SystemSettingAdmin(admin.ModelAdmin):
|
||||
list_display = ("internal_payments_enabled", "updated_at")
|
||||
list_display_links = ("updated_at",)
|
||||
list_editable = ("internal_payments_enabled",)
|
||||
actions = None
|
||||
|
||||
def has_add_permission(self, request):
|
||||
return not SystemSetting.objects.exists()
|
||||
|
||||
|
||||
@admin.register(ClaimLog)
|
||||
|
||||
Reference in New Issue
Block a user