summaryrefslogtreecommitdiff
path: root/postgresqleu
diff options
context:
space:
mode:
authorMagnus Hagander2020-03-27 17:37:24 +0000
committerMagnus Hagander2020-03-27 17:37:24 +0000
commit62c52511330b4edf6edf93c29282b660929e4f46 (patch)
tree1c75e3ea451a80361d6ef91f519f4a5bebdddaea /postgresqleu
parentc7330736f883fe7bf3affa9c9ef5bfcc25916a6d (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.py18
-rw-r--r--postgresqleu/urls.py1
-rw-r--r--postgresqleu/views.py3
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)"),