diff options
| author | Magnus Hagander | 2020-03-27 17:37:24 +0000 |
|---|---|---|
| committer | Magnus Hagander | 2020-03-27 17:37:24 +0000 |
| commit | 62c52511330b4edf6edf93c29282b660929e4f46 (patch) | |
| tree | 1c75e3ea451a80361d6ef91f519f4a5bebdddaea /postgresqleu | |
| parent | c7330736f883fe7bf3affa9c9ef5bfcc25916a6d (diff) | |
Add an administrative view of refunds
While refunds could be viewed on the individual invoice that was
refunded, it's useful to also have a global view of refunds on the admin
page (which links to the invoices as necessary).
Button on the frontpage will be highlighted if there are any refunds
that are in pendning state (either waiting for us to issue them or
waiting for completion).
Diffstat (limited to 'postgresqleu')
| -rw-r--r-- | postgresqleu/invoices/backendviews.py | 18 | ||||
| -rw-r--r-- | postgresqleu/urls.py | 1 | ||||
| -rw-r--r-- | postgresqleu/views.py | 3 |
3 files changed, 21 insertions, 1 deletions
diff --git a/postgresqleu/invoices/backendviews.py b/postgresqleu/invoices/backendviews.py index 740bd35c..1d53349d 100644 --- a/postgresqleu/invoices/backendviews.py +++ b/postgresqleu/invoices/backendviews.py @@ -3,7 +3,7 @@ from django.http import HttpResponseRedirect, Http404 from django.utils.html import escape from django.shortcuts import get_object_or_404, render from django.contrib import messages -from django.db.models import Max, Q +from django.db.models import Max, Q, F from django.db import transaction from django.conf import settings @@ -17,6 +17,7 @@ from postgresqleu.invoices.util import InvoiceManager from postgresqleu.accounting.models import Account from postgresqleu.invoices.models import InvoicePaymentMethod, Invoice, InvoiceLog +from postgresqleu.invoices.models import InvoiceRefund from postgresqleu.invoices.models import PendingBankTransaction from postgresqleu.invoices.models import PendingBankMatcher from postgresqleu.invoices.models import BankTransferFees @@ -603,3 +604,18 @@ def edit_paymentmethod(request, rest): topadmin='Invoices', return_url='/admin/', ) + + +def refunds(request): + authenticate_backend_group(request, 'Invoice managers') + + refund_objects = InvoiceRefund.objects.only('id', 'invoice_id', 'completed', 'issued', 'registered', 'reason').order_by(F('completed').desc(nulls_first=True), F('issued').desc(nulls_first=True), F('registered').desc()) + + (refunds, paginator, page_range) = simple_pagination(request, refund_objects, 20) + + return render(request, 'invoices/refunds.html', { + 'refunds': refunds, + 'page_range': page_range, + 'breadcrumbs': [('/admin/invoices/refunds/', 'Refunds'), ], + 'helplink': 'payment', + }) diff --git a/postgresqleu/urls.py b/postgresqleu/urls.py index f5120e63..60fc3d39 100644 --- a/postgresqleu/urls.py +++ b/postgresqleu/urls.py @@ -283,6 +283,7 @@ urlpatterns.extend([ url(r'^invoices/adyen_bank/(\d+)/(\d+)/(\w+)/$', postgresqleu.adyen.views.invoicepayment_secret), url(r'^admin/invoices/vatrates/(.*/)?$', postgresqleu.invoices.backendviews.edit_vatrate), url(r'^admin/invoices/vatcache/(.*/)?$', postgresqleu.invoices.backendviews.edit_vatvalidationcache), + url(r'^admin/invoices/refunds/$', postgresqleu.invoices.backendviews.refunds), url(r'^admin/invoices/banktransactions/$', postgresqleu.invoices.backendviews.banktransactions), url(r'^admin/invoices/banktransactions/(\d+)/$', postgresqleu.invoices.backendviews.banktransactions_match), url(r'^admin/invoices/banktransactions/(\d+)/(\d+)/$', postgresqleu.invoices.backendviews.banktransactions_match_invoice), diff --git a/postgresqleu/views.py b/postgresqleu/views.py index 966a2415..317cb1d7 100644 --- a/postgresqleu/views.py +++ b/postgresqleu/views.py @@ -8,6 +8,7 @@ from django.conf import settings from postgresqleu.newsevents.models import News from postgresqleu.confreg.models import Conference, ConferenceSeries from postgresqleu.invoices.models import PendingBankTransaction, BankFileUpload, InvoicePaymentMethod +from postgresqleu.invoices.models import InvoiceRefund from postgresqleu.util.db import exec_to_dict, conditional_exec_to_scalar @@ -141,6 +142,7 @@ def admin_dashboard(request): if permissions['invoices']: pending_bank = PendingBankTransaction.objects.all().exists() + pending_refunds = InvoiceRefund.objects.filter(completed__isnull=True).exists() ipm = list(InvoicePaymentMethod.objects.filter(active=True, config__has_key='file_upload_interval')) if ipm: # At least one payment method exists that *should* get uploads checked @@ -164,6 +166,7 @@ def admin_dashboard(request): return render(request, 'adm/index.html', { 'permissions': permissions, 'pending_bank': pending_bank, + 'pending_refunds': pending_refunds, 'bank_file_uploads': bank_file_uploads, 'schedalert': conditional_exec_to_scalar(request.user.is_superuser, "SELECT NOT EXISTS (SELECT 1 FROM pg_stat_activity WHERE application_name='pgeu scheduled job runner' AND datname=current_database())"), 'mailqueuealert': conditional_exec_to_scalar(request.user.is_superuser, "SELECT EXISTS (SELECT 1 FROM mailqueue_queuedmail LIMIT 1)"), |
