@@ -486,7 +492,7 @@
{% block modals %}
{{ block.super }}
- {% if can_change %}
+ {% if can_edit_claim %}
{% for claim in claims %}
{% if claim.status == 'pending' %}
- {% blocktrans %}Behörigheterna claims.view_claim
- och claims.change_claim
- styr åtkomst till adminvyn respektive beslutsflödet.{% endblocktrans %}
+ {% blocktrans %}Behörigheterna claims.view_claim,
+ claims.change_claim,
+ claims.edit_claim_details
+ och claims.mark_claim_paid
+ styr åtkomst till adminvyn, beslutsflödet, redigering samt betalningspanelen.{% endblocktrans %}
diff --git a/claims/tests.py b/claims/tests.py
index 65fb65b..63a463d 100644
--- a/claims/tests.py
+++ b/claims/tests.py
@@ -81,7 +81,9 @@ class DashboardViewTests(TestCase):
self.user = User.objects.create_user(username="admin", password="test123", email="admin@example.com")
view_perm = Permission.objects.get(codename="view_claim")
change_perm = Permission.objects.get(codename="change_claim")
- self.user.user_permissions.add(view_perm, change_perm)
+ edit_perm = Permission.objects.get(codename="edit_claim_details")
+ pay_perm = Permission.objects.get(codename="mark_claim_paid")
+ self.user.user_permissions.add(view_perm, change_perm, edit_perm, pay_perm)
self.client.force_login(self.user)
def _create_claim(self, **kwargs):
@@ -197,3 +199,43 @@ class DashboardViewTests(TestCase):
claim.refresh_from_db()
self.assertNotEqual(claim.full_name, "Blocked")
self.assertFalse(claim.logs.filter(action=ClaimLog.Action.DETAILS_EDITED).exists())
+
+ def test_edit_requires_permission(self):
+ self.user.user_permissions.remove(Permission.objects.get(codename="edit_claim_details"))
+ claim = self._create_claim()
+ response = self.client.post(
+ reverse("claims:admin-list"),
+ {
+ "action_type": "edit",
+ "edit_claim_id": claim.id,
+ "full_name": "Nope",
+ "email": "nope@example.com",
+ "account_number": "456",
+ "amount": "200",
+ "currency": Claim.Currency.SEK,
+ "project": "",
+ "description": "Should fail",
+ },
+ follow=True,
+ )
+ self.assertEqual(response.status_code, 200)
+ claim.refresh_from_db()
+ self.assertNotEqual(claim.full_name, "Nope")
+ self.assertFalse(claim.logs.filter(action=ClaimLog.Action.DETAILS_EDITED).exists())
+
+ @override_settings(CLAIMS_ENABLE_INTERNAL_PAYMENTS=True)
+ def test_mark_paid_requires_permission(self):
+ claim = self._create_claim(status=Claim.Status.APPROVED)
+ self.user.user_permissions.remove(Permission.objects.get(codename="mark_claim_paid"))
+ response = self.client.post(
+ reverse("claims:admin-list"),
+ {
+ "action_type": "payment",
+ "payment_claim_id": claim.id,
+ },
+ follow=True,
+ )
+ self.assertEqual(response.status_code, 200)
+ claim.refresh_from_db()
+ self.assertIsNone(claim.paid_at)
+ self.assertFalse(claim.logs.filter(action=ClaimLog.Action.MARKED_PAID).exists())
diff --git a/claims/views.py b/claims/views.py
index 7871408..3b1dbdb 100644
--- a/claims/views.py
+++ b/claims/views.py
@@ -160,6 +160,8 @@ class ClaimDashboardView(LoginRequiredMixin, PermissionRequiredMixin, ListView):
context["status_choices"] = Claim.Status.choices
context["decision_choices"] = ClaimDecisionForm().fields["action"].choices
context["can_change"] = self.request.user.has_perm("claims.change_claim")
+ context["can_edit_claim"] = self.request.user.has_perm("claims.edit_claim_details")
+ context["can_mark_paid"] = self.request.user.has_perm("claims.mark_claim_paid")
context["payments_enabled"] = getattr(settings, "CLAIMS_ENABLE_INTERNAL_PAYMENTS", False)
context["summary"] = self._build_summary()
context["project_options"] = Project.objects.filter(is_active=True).order_by("name")
@@ -234,8 +236,8 @@ class ClaimDashboardView(LoginRequiredMixin, PermissionRequiredMixin, ListView):
if not getattr(settings, "CLAIMS_ENABLE_INTERNAL_PAYMENTS", False):
messages.error(request, _("Betalningshantering är inte aktiverad."))
return redirect(request.get_full_path())
- if not request.user.has_perm("claims.change_claim"):
- messages.error(request, _("Du har inte behörighet att uppdatera utlägg."))
+ if not request.user.has_perm("claims.mark_claim_paid"):
+ messages.error(request, _("Du har inte behörighet att markera betalningar i systemet."))
return redirect(request.get_full_path())
claim = get_object_or_404(Claim, pk=request.POST.get("payment_claim_id"))
@@ -258,8 +260,8 @@ class ClaimDashboardView(LoginRequiredMixin, PermissionRequiredMixin, ListView):
return redirect(request.get_full_path())
def _handle_edit(self, request):
- if not request.user.has_perm("claims.change_claim"):
- messages.error(request, _("Du har inte behörighet att uppdatera utlägg."))
+ if not request.user.has_perm("claims.edit_claim_details"):
+ messages.error(request, _("Du har inte behörighet att redigera utlägg."))
return redirect(request.get_full_path())
claim = get_object_or_404(Claim, pk=request.POST.get("edit_claim_id"))
if claim.status != Claim.Status.PENDING:
@@ -384,6 +386,8 @@ class UserManagementView(LoginRequiredMixin, PermissionRequiredMixin, TemplateVi
"is_staff": user.is_staff,
"grant_view": user.has_perm("claims.view_claim"),
"grant_change": user.has_perm("claims.change_claim"),
+ "grant_edit": user.has_perm("claims.edit_claim_details"),
+ "grant_pay": user.has_perm("claims.mark_claim_paid"),
}
),
"delete_form": None
@@ -413,6 +417,8 @@ class UserManagementView(LoginRequiredMixin, PermissionRequiredMixin, TemplateVi
)
self._set_perm(user, "claims.view_claim", form.cleaned_data.get("grant_view", False))
self._set_perm(user, "claims.change_claim", form.cleaned_data.get("grant_change", False))
+ self._set_perm(user, "claims.edit_claim_details", form.cleaned_data.get("grant_edit", False))
+ self._set_perm(user, "claims.mark_claim_paid", form.cleaned_data.get("grant_pay", False))
messages.success(request, _("Användaren %(user)s skapades.") % {"user": user.username})
return redirect(request.path)
return self.render_to_response(self.get_context_data(create_form=form))
@@ -430,6 +436,8 @@ class UserManagementView(LoginRequiredMixin, PermissionRequiredMixin, TemplateVi
user.save(update_fields=["is_staff"])
self._set_perm(user, "claims.view_claim", form.cleaned_data["grant_view"])
self._set_perm(user, "claims.change_claim", form.cleaned_data["grant_change"])
+ self._set_perm(user, "claims.edit_claim_details", form.cleaned_data["grant_edit"])
+ self._set_perm(user, "claims.mark_claim_paid", form.cleaned_data["grant_pay"])
messages.success(request, _("Behörigheter uppdaterades för %(user)s.") % {"user": user.username})
else:
messages.error(request, _("Kunde inte uppdatera behörigheter."))
diff --git a/locale/en/LC_MESSAGES/django.mo b/locale/en/LC_MESSAGES/django.mo
index bfa05f5..6a65e97 100644
Binary files a/locale/en/LC_MESSAGES/django.mo and b/locale/en/LC_MESSAGES/django.mo differ
diff --git a/locale/en/LC_MESSAGES/django.po b/locale/en/LC_MESSAGES/django.po
index 9de2566..440bad8 100644
--- a/locale/en/LC_MESSAGES/django.po
+++ b/locale/en/LC_MESSAGES/django.po
@@ -2,7 +2,7 @@ msgid ""
msgstr ""
"Project-Id-Version: claims-system 0.1\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2025-11-11 19:06+0000\n"
+"POT-Creation-Date: 2025-11-11 19:34+0000\n"
"PO-Revision-Date: 2025-11-08 23:40+0100\n"
"Last-Translator: ChatGPT \n"
"Language-Team: English\n"
@@ -13,42 +13,42 @@ msgstr ""
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: claims/forms.py:19 claims/forms.py:100
-#: claims/templates/claims/dashboard.html:516
+#: claims/templates/claims/dashboard.html:522
msgid "Namn"
msgstr "Name"
#: claims/forms.py:23 claims/forms.py:101 claims/forms.py:112
#: claims/templates/claims/dashboard.html:176
-#: claims/templates/claims/dashboard.html:520
+#: claims/templates/claims/dashboard.html:526
msgid "E-post"
msgstr "Email"
#: claims/forms.py:28 claims/forms.py:102
#: claims/templates/claims/dashboard.html:164
-#: claims/templates/claims/dashboard.html:524
+#: claims/templates/claims/dashboard.html:530
msgid "Kontonummer"
msgstr "Account number"
#: claims/forms.py:49 claims/forms.py:106
-#: claims/templates/claims/dashboard.html:211
-#: claims/templates/claims/dashboard.html:550
+#: claims/templates/claims/dashboard.html:217
+#: claims/templates/claims/dashboard.html:556
msgid "Beskrivning"
msgstr "Description"
#: claims/forms.py:50 claims/forms.py:103
#: claims/templates/claims/dashboard.html:160
-#: claims/templates/claims/dashboard.html:528
+#: claims/templates/claims/dashboard.html:534
#: claims/templates/claims/my_claims.html:23
msgid "Belopp"
msgstr "Amount"
#: claims/forms.py:51 claims/forms.py:104
-#: claims/templates/claims/dashboard.html:532
+#: claims/templates/claims/dashboard.html:538
msgid "Valuta"
msgstr "Currency"
#: claims/forms.py:52 claims/forms.py:105
-#: claims/templates/claims/dashboard.html:540
+#: claims/templates/claims/dashboard.html:546
msgid "Evenemang/Projekt"
msgstr "Project"
@@ -65,12 +65,12 @@ msgid "Neka"
msgstr "Reject"
#: claims/forms.py:67 claims/models.py:29
-#: claims/templates/claims/dashboard.html:332
+#: claims/templates/claims/dashboard.html:338
msgid "Pending"
msgstr "Pending"
#: claims/forms.py:75 claims/templates/claims/dashboard.html:126
-#: claims/templates/claims/dashboard.html:268
+#: claims/templates/claims/dashboard.html:274
msgid "Kommentar"
msgstr "Comment"
@@ -110,31 +110,47 @@ msgstr "Allow viewing claims"
msgid "Ge behörighet att besluta utlägg"
msgstr "Allow deciding claims"
-#: claims/forms.py:124
+#: claims/forms.py:123
+msgid "Ge behörighet att redigera utläggsdetaljer"
+msgstr "Allow editing claim details"
+
+#: claims/forms.py:128
+msgid "Ge behörighet att markera betalningar"
+msgstr "Allow marking payments"
+
+#: claims/forms.py:134
msgid "Användarnamnet är upptaget."
msgstr "That username is already taken."
-#: claims/forms.py:130
+#: claims/forms.py:140
msgid "Lösenorden matchar inte."
msgstr "Passwords do not match."
-#: claims/forms.py:148 claims/templates/claims/user_management.html:116
+#: claims/forms.py:158 claims/templates/claims/user_management.html:118
msgid "Admin/staff"
msgstr "Admin/staff"
-#: claims/forms.py:149 claims/templates/claims/user_management.html:120
+#: claims/forms.py:159 claims/templates/claims/user_management.html:122
msgid "Får se utlägg"
msgstr "May view claims"
-#: claims/forms.py:150 claims/templates/claims/user_management.html:124
+#: claims/forms.py:160 claims/templates/claims/user_management.html:126
msgid "Får besluta utlägg"
msgstr "May decide claims"
-#: claims/models.py:30 claims/templates/claims/dashboard.html:336
+#: claims/forms.py:161
+msgid "Får redigera utlägg"
+msgstr "May edit claims"
+
+#: claims/forms.py:162
+msgid "Får markera betalningar"
+msgstr "May mark payments"
+
+#: claims/models.py:30 claims/templates/claims/dashboard.html:342
msgid "Approved"
msgstr "Approved"
-#: claims/models.py:31 claims/templates/claims/dashboard.html:340
+#: claims/models.py:31 claims/templates/claims/dashboard.html:346
msgid "Rejected"
msgstr "Rejected"
@@ -158,23 +174,31 @@ msgstr "British pound (GBP)"
msgid "Describe what the reimbursement is for"
msgstr "Describe what the reimbursement is for"
-#: claims/models.py:122
+#: claims/models.py:85
+msgid "Can mark claims as paid"
+msgstr ""
+
+#: claims/models.py:86
+msgid "Can edit claim details"
+msgstr ""
+
+#: claims/models.py:126
msgid "Submitted"
msgstr "Submitted"
-#: claims/models.py:123
+#: claims/models.py:127
msgid "Status changed"
msgstr "Status changed"
-#: claims/models.py:124
+#: claims/models.py:128
msgid "Marked as paid"
msgstr "Marked as paid"
-#: claims/models.py:125
+#: claims/models.py:129
msgid "Project changed"
msgstr "Project changed"
-#: claims/models.py:126
+#: claims/models.py:130
msgid "Details edited"
msgstr ""
@@ -395,7 +419,7 @@ msgstr ""
"Use the reference and amount when entering the payment – it helps avoid "
"duplicates."
-#: claims/templates/claims/dashboard.html:189
+#: claims/templates/claims/dashboard.html:190
msgid ""
"Är du säker på att du har lagt upp betalningen? Markera endast som betald om "
"beloppet skickas till banken."
@@ -403,15 +427,21 @@ msgstr ""
"Are you sure the payment has been scheduled? Only mark as paid if the amount "
"has been sent to the bank."
-#: claims/templates/claims/dashboard.html:194
+#: claims/templates/claims/dashboard.html:195
msgid "Markera som betald"
msgstr "Mark as paid"
-#: claims/templates/claims/dashboard.html:197
+#: claims/templates/claims/dashboard.html:198
msgid "Dubbelkolla belopp och kontonummer i panelen innan du bekräftar."
msgstr "Double-check the amount and account number before confirming."
-#: claims/templates/claims/dashboard.html:202
+#: claims/templates/claims/dashboard.html:201
+msgid ""
+"Du saknar behörighet att markera betalningar. Kontakta en administratör."
+msgstr ""
+"You do not have permission to mark payments. Contact an administrator."
+
+#: claims/templates/claims/dashboard.html:208
msgid ""
"Intern betalningshantering är av – markera betalning i ekonomisystemet och "
"resetta status vid behov."
@@ -419,103 +449,103 @@ msgstr ""
"Internal payment handling is off – register the payment in the finance "
"system and reset the status if needed."
-#: claims/templates/claims/dashboard.html:219
+#: claims/templates/claims/dashboard.html:225
msgid "Visa kvitto"
msgstr "View receipt"
-#: claims/templates/claims/dashboard.html:222
+#: claims/templates/claims/dashboard.html:228
msgid "Inget kvitto bifogat"
msgstr "No receipt attached"
-#: claims/templates/claims/dashboard.html:224
+#: claims/templates/claims/dashboard.html:230
msgid "Senast uppdaterad"
msgstr "Last updated"
-#: claims/templates/claims/dashboard.html:229
+#: claims/templates/claims/dashboard.html:235
msgid "Logg"
msgstr "Log"
-#: claims/templates/claims/dashboard.html:236
+#: claims/templates/claims/dashboard.html:242
#: claims/templates/claims/my_claims.html:62
msgid "Status"
msgstr "Status"
-#: claims/templates/claims/dashboard.html:242
+#: claims/templates/claims/dashboard.html:248
msgid "Av"
msgstr "By"
-#: claims/templates/claims/dashboard.html:246
+#: claims/templates/claims/dashboard.html:252
#: claims/templates/claims/my_claims.html:69
msgid "Ingen logg än."
msgstr "No log entries yet."
-#: claims/templates/claims/dashboard.html:254
+#: claims/templates/claims/dashboard.html:260
msgid ""
"Utlägget är markerat som betalt. Ändringar av beslut/kommentar är låsta."
msgstr "The claim is marked as paid. Decision/comments are locked."
-#: claims/templates/claims/dashboard.html:261
+#: claims/templates/claims/dashboard.html:267
msgid "Åtgärd"
msgstr "Action"
-#: claims/templates/claims/dashboard.html:273
+#: claims/templates/claims/dashboard.html:279
msgid "Uppdatera beslut"
msgstr "Update decision"
-#: claims/templates/claims/dashboard.html:284
+#: claims/templates/claims/dashboard.html:290
#: claims/templates/claims/my_claims.html:78
msgid "Inga utlägg ännu"
msgstr "No claims yet"
-#: claims/templates/claims/dashboard.html:285
+#: claims/templates/claims/dashboard.html:291
msgid "När formuläret tas emot visas posterna automatiskt här."
msgstr "As soon as submissions arrive they will appear here."
-#: claims/templates/claims/dashboard.html:291
+#: claims/templates/claims/dashboard.html:297
msgid "Inga utlägg matchar filtret"
msgstr "No claims match the filter"
-#: claims/templates/claims/dashboard.html:292
+#: claims/templates/claims/dashboard.html:298
msgid "Välj en annan status för att se fler poster."
msgstr "Choose another status to see more entries."
-#: claims/templates/claims/dashboard.html:300
+#: claims/templates/claims/dashboard.html:306
msgid "Senaste inskick"
msgstr "Latest submissions"
-#: claims/templates/claims/dashboard.html:301
+#: claims/templates/claims/dashboard.html:307
msgid "Aktivitet"
msgstr "Activity"
-#: claims/templates/claims/dashboard.html:319
+#: claims/templates/claims/dashboard.html:325
msgid "Inga aktiviteter än."
msgstr "No activity yet."
-#: claims/templates/claims/dashboard.html:327
+#: claims/templates/claims/dashboard.html:333
msgid "Statusfördelning"
msgstr "Status breakdown"
-#: claims/templates/claims/dashboard.html:328
+#: claims/templates/claims/dashboard.html:334
msgid "Snabbstatistik"
msgstr "Quick stats"
-#: claims/templates/claims/dashboard.html:501
+#: claims/templates/claims/dashboard.html:507
msgid "Redigera utlägg"
msgstr "Edit claim"
-#: claims/templates/claims/dashboard.html:507
+#: claims/templates/claims/dashboard.html:513
msgid "Stäng"
msgstr "Close"
-#: claims/templates/claims/dashboard.html:542
+#: claims/templates/claims/dashboard.html:548
msgid "Ingen"
msgstr "None"
-#: claims/templates/claims/dashboard.html:557
+#: claims/templates/claims/dashboard.html:563
msgid "Avbryt"
msgstr "Cancel"
-#: claims/templates/claims/dashboard.html:560
+#: claims/templates/claims/dashboard.html:566
msgid "Spara ändringar"
msgstr "Save changes"
@@ -760,17 +790,24 @@ msgstr "Use Django admin groups when multiple people share a role."
#: claims/templates/claims/user_management.html:68
msgid ""
"Behörigheterna claims.view_claim\n"
+"text-xs\">claims.view_claim,\n"
+" claims.change_claim,\n"
+" claims.edit_claim_details\n"
" och claims.change_claim\n"
-" styr åtkomst till adminvyn respektive beslutsflödet."
+"px-2 py-1 text-xs\">claims.mark_claim_paid\n"
+" styr åtkomst till adminvyn, beslutsflödet, "
+"redigering samt betalningspanelen."
msgstr ""
"The permissions claims.view_claim and claims.change_claim control access to "
-"the list and decision flows."
+"text-xs\">claims.view_claim, claims.change_claim, claims.edit_claim_details, "
+"and claims.mark_claim_paid "
+"control access to the dashboard, decision flow, edit dialog, and payment panel."
-#: claims/templates/claims/user_management.html:75
+#: claims/templates/claims/user_management.html:77
msgid ""
"En markerad Admin/staff-användare kan nå Django admin och skapa projekt, "
"exportflöden m.m."
@@ -778,7 +815,7 @@ msgstr ""
"Users flagged as Admin/staff may access Django admin to create projects, "
"exports, etc."
-#: claims/templates/claims/user_management.html:79
+#: claims/templates/claims/user_management.html:81
msgid ""
"Ta bara bort konton du är säker på – historik försvinner inte, men personen "
"tappar all åtkomst."
@@ -786,57 +823,57 @@ msgstr ""
"Only delete accounts you are sure about – history stays, but the person "
"loses access."
-#: claims/templates/claims/user_management.html:87
+#: claims/templates/claims/user_management.html:89
msgid "Befintliga användare"
msgstr "Existing users"
-#: claims/templates/claims/user_management.html:88
+#: claims/templates/claims/user_management.html:90
msgid "Justera behörigheter"
msgstr "Adjust permissions"
-#: claims/templates/claims/user_management.html:99
+#: claims/templates/claims/user_management.html:101
msgid "Superuser"
msgstr "Superuser"
-#: claims/templates/claims/user_management.html:103
+#: claims/templates/claims/user_management.html:105
msgid "Saknar namn"
msgstr "No name"
-#: claims/templates/claims/user_management.html:103
+#: claims/templates/claims/user_management.html:105
msgid "Ingen e-post"
msgstr "No email"
-#: claims/templates/claims/user_management.html:128
+#: claims/templates/claims/user_management.html:130
msgid "Spara behörigheter"
msgstr "Save permissions"
-#: claims/templates/claims/user_management.html:132
+#: claims/templates/claims/user_management.html:134
msgid "Ta bort konto"
msgstr "Remove account"
-#: claims/templates/claims/user_management.html:134
+#: claims/templates/claims/user_management.html:136
msgid "Åtgärden går inte att ångra. Användaren förlorar omedelbart åtkomst."
msgstr "This action cannot be undone. The user loses access immediately."
-#: claims/templates/claims/user_management.html:135
+#: claims/templates/claims/user_management.html:137
#, fuzzy, python-format
#| msgid "Ta bort {{ user.username }}?"
msgid "Ta bort %(user.username)s?"
msgstr "Remove {{ user.username }}?"
-#: claims/templates/claims/user_management.html:140
+#: claims/templates/claims/user_management.html:142
msgid "Ta bort användare"
msgstr "Delete user"
-#: claims/templates/claims/user_management.html:144
+#: claims/templates/claims/user_management.html:146
msgid "Kan inte tas bort (antingen du själv eller superuser)."
msgstr "Cannot be removed (either yourself or a superuser)."
-#: claims/templates/claims/user_management.html:152
+#: claims/templates/claims/user_management.html:154
msgid "Inga användare upplagda."
msgstr "No users yet."
-#: claims/templates/claims/user_management.html:153
+#: claims/templates/claims/user_management.html:155
msgid "Skapa det första kontot via formuläret ovan."
msgstr "Create the first account using the form above."
@@ -872,104 +909,112 @@ msgstr ""
msgid "Kunde inte spara utläggen. Kontrollera formuläret."
msgstr ""
-#: claims/views.py:186 claims/views.py:238 claims/views.py:262
+#: claims/views.py:188
#, fuzzy
#| msgid "Ge behörighet att besluta utlägg"
msgid "Du har inte behörighet att uppdatera utlägg."
msgstr "Allow deciding claims"
-#: claims/views.py:200
+#: claims/views.py:202
msgid "Utlägget är redan markerat som betalt och kan inte ändras."
msgstr "This claim is already marked as paid and cannot be changed."
-#: claims/views.py:207
+#: claims/views.py:209
#, python-format
msgid "%(claim)s markerades som godkänd."
msgstr "%(claim)s was marked as approved."
-#: claims/views.py:211
+#: claims/views.py:213
#, python-format
msgid "%(claim)s markerades som nekad."
msgstr "%(claim)s was marked as rejected."
-#: claims/views.py:215
+#: claims/views.py:217
#, python-format
msgid "%(claim)s återställdes till väntande status."
msgstr "%(claim)s was reset to pending status."
-#: claims/views.py:235
+#: claims/views.py:237
msgid "Betalningshantering är inte aktiverad."
msgstr "Payment handling is not enabled."
-#: claims/views.py:243
+#: claims/views.py:240
+msgid "Du har inte behörighet att markera betalningar i systemet."
+msgstr "You do not have permission to mark payments in the system."
+
+#: claims/views.py:245
msgid "Endast godkända utlägg kan markeras som betalda."
msgstr "Only approved claims can be marked as paid."
-#: claims/views.py:246
+#: claims/views.py:248
msgid "Detta utlägg är redan markerat som betalt."
msgstr "This claim is already marked as paid."
-#: claims/views.py:257
+#: claims/views.py:259
#, python-format
msgid "%(claim)s markerades som betald."
msgstr "%(claim)s was marked as paid."
-#: claims/views.py:266
+#: claims/views.py:264
+msgid "Du har inte behörighet att redigera utlägg."
+msgstr "You do not have permission to edit claims."
+
+#: claims/views.py:268
msgid "Endast väntande utlägg kan redigeras via panelen."
msgstr "Only pending claims can be edited via the panel."
-#: claims/views.py:295
+#: claims/views.py:297
#, python-format
msgid "Följande fält uppdaterades: %(fields)s"
msgstr "The following fields were updated: %(fields)s"
-#: claims/views.py:301
+#: claims/views.py:303
msgid "Informationen uppdaterades."
msgstr "Information updated."
-#: claims/views.py:303
+#: claims/views.py:305
msgid "Inga förändringar att spara."
msgstr "No changes to save."
-#: claims/views.py:369
+#: claims/views.py:371
msgid "Du saknar behörighet för åtgärden."
msgstr "You do not have permission to perform this action."
-#: claims/views.py:416
+#: claims/views.py:422
#, python-format
msgid "Användaren %(user)s skapades."
msgstr ""
-#: claims/views.py:427
+#: claims/views.py:433
msgid "Du kan inte ta bort din egen staff-status."
msgstr ""
-#: claims/views.py:433
+#: claims/views.py:441
#, python-format
msgid "Behörigheter uppdaterades för %(user)s."
msgstr ""
-#: claims/views.py:435
+#: claims/views.py:443
#, fuzzy
#| msgid "Justera behörigheter"
msgid "Kunde inte uppdatera behörigheter."
msgstr "Adjust permissions"
-#: claims/views.py:445
+#: claims/views.py:453
msgid "Du kan inte ta bort ditt eget konto."
msgstr ""
-#: claims/views.py:447
+#: claims/views.py:455
msgid "Du kan inte ta bort en superuser via detta gränssnitt."
msgstr ""
-#: claims/views.py:450
+#: claims/views.py:458
#, fuzzy
#| msgid "Användare"
msgid "Användaren togs bort."
msgstr "Users"
-#: claims/views.py:453
+#: claims/views.py:461
msgid "Okänd åtgärd."
msgstr ""
diff --git a/locale/sv/LC_MESSAGES/django.po b/locale/sv/LC_MESSAGES/django.po
index e13f1a2..080de96 100644
--- a/locale/sv/LC_MESSAGES/django.po
+++ b/locale/sv/LC_MESSAGES/django.po
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2025-11-11 19:06+0000\n"
+"POT-Creation-Date: 2025-11-11 19:34+0000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME \n"
"Language-Team: LANGUAGE \n"
@@ -17,43 +17,44 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
#: claims/forms.py:19 claims/forms.py:100
-#: claims/templates/claims/dashboard.html:516
+#: claims/templates/claims/dashboard.html:522
msgid "Namn"
msgstr ""
#: claims/forms.py:23 claims/forms.py:101 claims/forms.py:112
#: claims/templates/claims/dashboard.html:176
-#: claims/templates/claims/dashboard.html:520
+#: claims/templates/claims/dashboard.html:526
msgid "E-post"
msgstr ""
#: claims/forms.py:28 claims/forms.py:102
#: claims/templates/claims/dashboard.html:164
-#: claims/templates/claims/dashboard.html:524
+#: claims/templates/claims/dashboard.html:530
msgid "Kontonummer"
msgstr ""
#: claims/forms.py:49 claims/forms.py:106
-#: claims/templates/claims/dashboard.html:211
-#: claims/templates/claims/dashboard.html:550
+#: claims/templates/claims/dashboard.html:217
+#: claims/templates/claims/dashboard.html:556
msgid "Beskrivning"
msgstr ""
#: claims/forms.py:50 claims/forms.py:103
#: claims/templates/claims/dashboard.html:160
-#: claims/templates/claims/dashboard.html:528
+#: claims/templates/claims/dashboard.html:534
#: claims/templates/claims/my_claims.html:23
msgid "Belopp"
msgstr ""
#: claims/forms.py:51 claims/forms.py:104
-#: claims/templates/claims/dashboard.html:532
+#: claims/templates/claims/dashboard.html:538
msgid "Valuta"
msgstr ""
#: claims/forms.py:52 claims/forms.py:105
-#: claims/templates/claims/dashboard.html:540
+#: claims/templates/claims/dashboard.html:546
msgid "Evenemang/Projekt"
msgstr ""
@@ -70,12 +71,12 @@ msgid "Neka"
msgstr "Neka"
#: claims/forms.py:67 claims/models.py:29
-#: claims/templates/claims/dashboard.html:332
+#: claims/templates/claims/dashboard.html:338
msgid "Pending"
msgstr "Väntande"
#: claims/forms.py:75 claims/templates/claims/dashboard.html:126
-#: claims/templates/claims/dashboard.html:268
+#: claims/templates/claims/dashboard.html:274
msgid "Kommentar"
msgstr ""
@@ -115,31 +116,47 @@ msgstr ""
msgid "Ge behörighet att besluta utlägg"
msgstr ""
-#: claims/forms.py:124
+#: claims/forms.py:123
+msgid "Ge behörighet att redigera utläggsdetaljer"
+msgstr ""
+
+#: claims/forms.py:128
+msgid "Ge behörighet att markera betalningar"
+msgstr ""
+
+#: claims/forms.py:134
msgid "Användarnamnet är upptaget."
msgstr ""
-#: claims/forms.py:130
+#: claims/forms.py:140
msgid "Lösenorden matchar inte."
msgstr ""
-#: claims/forms.py:148 claims/templates/claims/user_management.html:116
+#: claims/forms.py:158 claims/templates/claims/user_management.html:118
msgid "Admin/staff"
msgstr ""
-#: claims/forms.py:149 claims/templates/claims/user_management.html:120
+#: claims/forms.py:159 claims/templates/claims/user_management.html:122
msgid "Får se utlägg"
msgstr ""
-#: claims/forms.py:150 claims/templates/claims/user_management.html:124
+#: claims/forms.py:160 claims/templates/claims/user_management.html:126
msgid "Får besluta utlägg"
msgstr ""
-#: claims/models.py:30 claims/templates/claims/dashboard.html:336
+#: claims/forms.py:161
+msgid "Får redigera utlägg"
+msgstr ""
+
+#: claims/forms.py:162
+msgid "Får markera betalningar"
+msgstr ""
+
+#: claims/models.py:30 claims/templates/claims/dashboard.html:342
msgid "Approved"
msgstr "Godkänd"
-#: claims/models.py:31 claims/templates/claims/dashboard.html:340
+#: claims/models.py:31 claims/templates/claims/dashboard.html:346
msgid "Rejected"
msgstr "Nekad"
@@ -163,23 +180,31 @@ msgstr ""
msgid "Describe what the reimbursement is for"
msgstr ""
-#: claims/models.py:122
-msgid "Submitted"
+#: claims/models.py:85
+msgid "Can mark claims as paid"
msgstr ""
-#: claims/models.py:123
-msgid "Status changed"
-msgstr ""
-
-#: claims/models.py:124
-msgid "Marked as paid"
-msgstr ""
-
-#: claims/models.py:125
-msgid "Project changed"
+#: claims/models.py:86
+msgid "Can edit claim details"
msgstr ""
#: claims/models.py:126
+msgid "Submitted"
+msgstr ""
+
+#: claims/models.py:127
+msgid "Status changed"
+msgstr ""
+
+#: claims/models.py:128
+msgid "Marked as paid"
+msgstr ""
+
+#: claims/models.py:129
+msgid "Project changed"
+msgstr ""
+
+#: claims/models.py:130
msgid "Details edited"
msgstr ""
@@ -396,123 +421,128 @@ msgid ""
"undvika dubbletter."
msgstr ""
-#: claims/templates/claims/dashboard.html:189
+#: claims/templates/claims/dashboard.html:190
msgid ""
"Är du säker på att du har lagt upp betalningen? Markera endast som betald om "
"beloppet skickas till banken."
msgstr ""
-#: claims/templates/claims/dashboard.html:194
+#: claims/templates/claims/dashboard.html:195
msgid "Markera som betald"
msgstr ""
-#: claims/templates/claims/dashboard.html:197
+#: claims/templates/claims/dashboard.html:198
msgid "Dubbelkolla belopp och kontonummer i panelen innan du bekräftar."
msgstr ""
-#: claims/templates/claims/dashboard.html:202
+#: claims/templates/claims/dashboard.html:201
+msgid ""
+"Du saknar behörighet att markera betalningar. Kontakta en administratör."
+msgstr ""
+
+#: claims/templates/claims/dashboard.html:208
msgid ""
"Intern betalningshantering är av – markera betalning i ekonomisystemet och "
"resetta status vid behov."
msgstr ""
-#: claims/templates/claims/dashboard.html:219
+#: claims/templates/claims/dashboard.html:225
msgid "Visa kvitto"
msgstr ""
-#: claims/templates/claims/dashboard.html:222
+#: claims/templates/claims/dashboard.html:228
msgid "Inget kvitto bifogat"
msgstr ""
-#: claims/templates/claims/dashboard.html:224
+#: claims/templates/claims/dashboard.html:230
msgid "Senast uppdaterad"
msgstr ""
-#: claims/templates/claims/dashboard.html:229
+#: claims/templates/claims/dashboard.html:235
msgid "Logg"
msgstr ""
-#: claims/templates/claims/dashboard.html:236
+#: claims/templates/claims/dashboard.html:242
#: claims/templates/claims/my_claims.html:62
msgid "Status"
msgstr ""
-#: claims/templates/claims/dashboard.html:242
+#: claims/templates/claims/dashboard.html:248
msgid "Av"
msgstr ""
-#: claims/templates/claims/dashboard.html:246
+#: claims/templates/claims/dashboard.html:252
#: claims/templates/claims/my_claims.html:69
msgid "Ingen logg än."
msgstr ""
-#: claims/templates/claims/dashboard.html:254
+#: claims/templates/claims/dashboard.html:260
msgid ""
"Utlägget är markerat som betalt. Ändringar av beslut/kommentar är låsta."
msgstr ""
-#: claims/templates/claims/dashboard.html:261
+#: claims/templates/claims/dashboard.html:267
msgid "Åtgärd"
msgstr ""
-#: claims/templates/claims/dashboard.html:273
+#: claims/templates/claims/dashboard.html:279
msgid "Uppdatera beslut"
msgstr ""
-#: claims/templates/claims/dashboard.html:284
+#: claims/templates/claims/dashboard.html:290
#: claims/templates/claims/my_claims.html:78
msgid "Inga utlägg ännu"
msgstr ""
-#: claims/templates/claims/dashboard.html:285
+#: claims/templates/claims/dashboard.html:291
msgid "När formuläret tas emot visas posterna automatiskt här."
msgstr ""
-#: claims/templates/claims/dashboard.html:291
+#: claims/templates/claims/dashboard.html:297
msgid "Inga utlägg matchar filtret"
msgstr ""
-#: claims/templates/claims/dashboard.html:292
+#: claims/templates/claims/dashboard.html:298
msgid "Välj en annan status för att se fler poster."
msgstr ""
-#: claims/templates/claims/dashboard.html:300
+#: claims/templates/claims/dashboard.html:306
msgid "Senaste inskick"
msgstr ""
-#: claims/templates/claims/dashboard.html:301
+#: claims/templates/claims/dashboard.html:307
msgid "Aktivitet"
msgstr ""
-#: claims/templates/claims/dashboard.html:319
+#: claims/templates/claims/dashboard.html:325
msgid "Inga aktiviteter än."
msgstr ""
-#: claims/templates/claims/dashboard.html:327
+#: claims/templates/claims/dashboard.html:333
msgid "Statusfördelning"
msgstr ""
-#: claims/templates/claims/dashboard.html:328
+#: claims/templates/claims/dashboard.html:334
msgid "Snabbstatistik"
msgstr ""
-#: claims/templates/claims/dashboard.html:501
+#: claims/templates/claims/dashboard.html:507
msgid "Redigera utlägg"
msgstr ""
-#: claims/templates/claims/dashboard.html:507
+#: claims/templates/claims/dashboard.html:513
msgid "Stäng"
msgstr ""
-#: claims/templates/claims/dashboard.html:542
+#: claims/templates/claims/dashboard.html:548
msgid "Ingen"
msgstr ""
-#: claims/templates/claims/dashboard.html:557
+#: claims/templates/claims/dashboard.html:563
msgid "Avbryt"
msgstr ""
-#: claims/templates/claims/dashboard.html:560
+#: claims/templates/claims/dashboard.html:566
msgid "Spara ändringar"
msgstr ""
@@ -743,74 +773,79 @@ msgstr ""
#: claims/templates/claims/user_management.html:68
msgid ""
"Behörigheterna claims.view_claim\n"
+"text-xs\">claims.view_claim,\n"
+" claims.change_claim,\n"
+" claims.edit_claim_details\n"
" och claims.change_claim\n"
-" styr åtkomst till adminvyn respektive beslutsflödet."
+"px-2 py-1 text-xs\">claims.mark_claim_paid\n"
+" styr åtkomst till adminvyn, beslutsflödet, "
+"redigering samt betalningspanelen."
msgstr ""
-#: claims/templates/claims/user_management.html:75
+#: claims/templates/claims/user_management.html:77
msgid ""
"En markerad Admin/staff-användare kan nå Django admin och skapa projekt, "
"exportflöden m.m."
msgstr ""
-#: claims/templates/claims/user_management.html:79
+#: claims/templates/claims/user_management.html:81
msgid ""
"Ta bara bort konton du är säker på – historik försvinner inte, men personen "
"tappar all åtkomst."
msgstr ""
-#: claims/templates/claims/user_management.html:87
+#: claims/templates/claims/user_management.html:89
msgid "Befintliga användare"
msgstr ""
-#: claims/templates/claims/user_management.html:88
+#: claims/templates/claims/user_management.html:90
msgid "Justera behörigheter"
msgstr ""
-#: claims/templates/claims/user_management.html:99
+#: claims/templates/claims/user_management.html:101
msgid "Superuser"
msgstr ""
-#: claims/templates/claims/user_management.html:103
+#: claims/templates/claims/user_management.html:105
msgid "Saknar namn"
msgstr ""
-#: claims/templates/claims/user_management.html:103
+#: claims/templates/claims/user_management.html:105
msgid "Ingen e-post"
msgstr ""
-#: claims/templates/claims/user_management.html:128
+#: claims/templates/claims/user_management.html:130
msgid "Spara behörigheter"
msgstr ""
-#: claims/templates/claims/user_management.html:132
+#: claims/templates/claims/user_management.html:134
msgid "Ta bort konto"
msgstr ""
-#: claims/templates/claims/user_management.html:134
+#: claims/templates/claims/user_management.html:136
msgid "Åtgärden går inte att ångra. Användaren förlorar omedelbart åtkomst."
msgstr ""
-#: claims/templates/claims/user_management.html:135
+#: claims/templates/claims/user_management.html:137
#, python-format
msgid "Ta bort %(user.username)s?"
msgstr ""
-#: claims/templates/claims/user_management.html:140
+#: claims/templates/claims/user_management.html:142
msgid "Ta bort användare"
msgstr ""
-#: claims/templates/claims/user_management.html:144
+#: claims/templates/claims/user_management.html:146
msgid "Kan inte tas bort (antingen du själv eller superuser)."
msgstr ""
-#: claims/templates/claims/user_management.html:152
+#: claims/templates/claims/user_management.html:154
msgid "Inga användare upplagda."
msgstr ""
-#: claims/templates/claims/user_management.html:153
+#: claims/templates/claims/user_management.html:155
msgid "Skapa det första kontot via formuläret ovan."
msgstr ""
@@ -846,98 +881,106 @@ msgstr ""
msgid "Kunde inte spara utläggen. Kontrollera formuläret."
msgstr ""
-#: claims/views.py:186 claims/views.py:238 claims/views.py:262
+#: claims/views.py:188
msgid "Du har inte behörighet att uppdatera utlägg."
msgstr ""
-#: claims/views.py:200
+#: claims/views.py:202
msgid "Utlägget är redan markerat som betalt och kan inte ändras."
msgstr ""
-#: claims/views.py:207
+#: claims/views.py:209
#, python-format
msgid "%(claim)s markerades som godkänd."
msgstr ""
-#: claims/views.py:211
+#: claims/views.py:213
#, python-format
msgid "%(claim)s markerades som nekad."
msgstr ""
-#: claims/views.py:215
+#: claims/views.py:217
#, python-format
msgid "%(claim)s återställdes till väntande status."
msgstr ""
-#: claims/views.py:235
+#: claims/views.py:237
msgid "Betalningshantering är inte aktiverad."
msgstr ""
-#: claims/views.py:243
+#: claims/views.py:240
+msgid "Du har inte behörighet att markera betalningar i systemet."
+msgstr ""
+
+#: claims/views.py:245
msgid "Endast godkända utlägg kan markeras som betalda."
msgstr ""
-#: claims/views.py:246
+#: claims/views.py:248
msgid "Detta utlägg är redan markerat som betalt."
msgstr "Detta utlägg är redan markerat som betalt."
-#: claims/views.py:257
+#: claims/views.py:259
#, python-format
msgid "%(claim)s markerades som betald."
msgstr "%(claim)s markerades som betald."
-#: claims/views.py:266
+#: claims/views.py:264
+msgid "Du har inte behörighet att redigera utlägg."
+msgstr ""
+
+#: claims/views.py:268
msgid "Endast väntande utlägg kan redigeras via panelen."
msgstr "Endast väntande utlägg kan redigeras via panelen."
-#: claims/views.py:295
+#: claims/views.py:297
#, python-format
msgid "Följande fält uppdaterades: %(fields)s"
msgstr "Följande fält uppdaterades: %(fields)s"
-#: claims/views.py:301
+#: claims/views.py:303
msgid "Informationen uppdaterades."
msgstr "Informationen uppdaterades."
-#: claims/views.py:303
+#: claims/views.py:305
msgid "Inga förändringar att spara."
msgstr "Inga förändringar att spara."
-#: claims/views.py:369
+#: claims/views.py:371
msgid "Du saknar behörighet för åtgärden."
msgstr "Du saknar behörighet för åtgärden."
-#: claims/views.py:416
+#: claims/views.py:422
#, python-format
msgid "Användaren %(user)s skapades."
msgstr ""
-#: claims/views.py:427
+#: claims/views.py:433
msgid "Du kan inte ta bort din egen staff-status."
msgstr ""
-#: claims/views.py:433
+#: claims/views.py:441
#, python-format
msgid "Behörigheter uppdaterades för %(user)s."
msgstr ""
-#: claims/views.py:435
+#: claims/views.py:443
msgid "Kunde inte uppdatera behörigheter."
msgstr ""
-#: claims/views.py:445
+#: claims/views.py:453
msgid "Du kan inte ta bort ditt eget konto."
msgstr ""
-#: claims/views.py:447
+#: claims/views.py:455
msgid "Du kan inte ta bort en superuser via detta gränssnitt."
msgstr ""
-#: claims/views.py:450
+#: claims/views.py:458
msgid "Användaren togs bort."
msgstr ""
-#: claims/views.py:453
+#: claims/views.py:461
msgid "Okänd åtgärd."
msgstr ""