diff --git a/README.md b/README.md index b6df897..46ef489 100644 --- a/README.md +++ b/README.md @@ -26,7 +26,7 @@ Nyckel-URLer (språkprefixed): - **Auto-prefill:** Inloggade användare får namn, e-post och senaste kontonummer förifyllt. - **Valuta & projekt:** Varje rad har dold valutaväljare (SEK default) och projektreferens. Projekt listas från Django admin > Projekt. - **Kvitton:** Filuppladdningar sparas med slumpat UUID-baserat namn under `receipts/` för säkerhet och unika namn. -- **Dashboard:** KPI-kort med totalsiffror, senaste aktivitet, statusfördelning och samma inline-flöde för beslut/utbetalningar (inkl. möjlighet att korrigera projekt vid beslut). +- **Dashboard:** KPI-kort med totalsiffror, senaste aktivitet, statusfördelning och samma inline-flöde för beslut/utbetalningar. Attestanter kan öppna en redigeringspanel för att justera namn, belopp, valuta, kontonummer och projekt innan beslut. - **Betalspårning:** När intern betalning är på får godkända claims en "Betala"-knapp. När ett claim markeras som betalt låses status/kommentar tills reset görs. - **Mina utlägg:** Inloggade ser sina egna claims i samma Tailwind-layout med kvitto-länk och logg. - **Användarhantering:** Tailwind-sida där personal kan skapa konton, tilldela `claims.view_claim`/`claims.change_claim`, markera staff och ta bort användare. diff --git a/claims/forms.py b/claims/forms.py index b71b1bf..434a774 100644 --- a/claims/forms.py +++ b/claims/forms.py @@ -73,14 +73,15 @@ class ClaimDecisionForm(forms.Form): label=_("Evenemang/Projekt"), ) - def __init__(self, *args, **kwargs): - super().__init__(*args, **kwargs) - self.fields["project"].queryset = Project.objects.filter(is_active=True).order_by("name") decision_note = forms.CharField( required=False, widget=forms.Textarea(attrs={"rows": 2, "placeholder": _("Kommentar")}), ) + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self.fields["project"].queryset = Project.objects.filter(is_active=True).order_by("name") + def clean(self): cleaned = super().clean() action = cleaned.get("action") @@ -90,6 +91,29 @@ class ClaimDecisionForm(forms.Form): return cleaned +class ClaimEditForm(forms.ModelForm): + class Meta: + model = Claim + fields = [ + "full_name", + "email", + "account_number", + "amount", + "currency", + "project", + "description", + ] + labels = { + "full_name": _("Namn"), + "email": _("E-post"), + "account_number": _("Kontonummer"), + "amount": _("Belopp"), + "currency": _("Valuta"), + "project": _("Evenemang/Projekt"), + "description": _("Beskrivning"), + } + + class UserManagementForm(forms.Form): username = forms.CharField(max_length=150, label=_("Användarnamn")) email = forms.EmailField(required=False, label=_("E-post")) diff --git a/claims/models.py b/claims/models.py index 9f97cbd..373a113 100644 --- a/claims/models.py +++ b/claims/models.py @@ -123,6 +123,7 @@ class ClaimLog(models.Model): STATUS_CHANGED = "status_changed", _("Status changed") MARKED_PAID = "marked_paid", _("Marked as paid") PROJECT_CHANGED = "project_changed", _("Project changed") + DETAILS_EDITED = "details_edited", _("Details edited") claim = models.ForeignKey(Claim, related_name="logs", on_delete=models.CASCADE) action = models.CharField(max_length=32, choices=Action.choices) diff --git a/claims/templates/claims/dashboard.html b/claims/templates/claims/dashboard.html index dd738b2..938da65 100644 --- a/claims/templates/claims/dashboard.html +++ b/claims/templates/claims/dashboard.html @@ -118,25 +118,32 @@

-
- - {{ claim.get_status_display }} - - {% if claim.decision_note %} -

{% trans "Kommentar" %}: {{ claim.decision_note }}

+
+ + {{ claim.get_status_display }} + + {% if claim.decision_note %} +

{% trans "Kommentar" %}: {{ claim.decision_note }}

{% endif %} {% if payments_enabled and claim.status == 'approved' %} - {% if claim.is_paid %} - - {% trans "Betald" %} {{ claim.paid_at|date:"Y-m-d H:i" }} - {% if claim.paid_by %}{% trans "av" %} {{ claim.paid_by.get_username }}{% endif %} - - {% else %} - {% trans "Ej markerad som betald" %} - {% endif %} - {% endif %} -
-
+ {% if claim.is_paid %} + + {% trans "Betald" %} {{ claim.paid_at|date:"Y-m-d H:i" }} + {% if claim.paid_by %}{% trans "av" %} {{ claim.paid_by.get_username }}{% endif %} + + {% else %} + {% trans "Ej markerad som betald" %} + {% endif %} + {% endif %} + {% if can_change %} + + {% endif %} + + {% if claim.status == 'approved' %}
@@ -294,6 +301,78 @@

{% trans "Välj en annan status för att se fler poster." %}

{% endif %} + {% if can_change %} + + {% endif %}