mirror of
https://github.com/pretix/pretix.git
synced 2026-05-06 15:24:02 +00:00
Added payment method fees to order overview
This commit is contained in:
@@ -2,10 +2,26 @@ from django.db.models import Count, Sum
|
||||
from django.utils.translation import ugettext_lazy as _
|
||||
|
||||
from pretix.base.models import ItemCategory, Order, OrderPosition
|
||||
from pretix.base.signals import register_payment_providers
|
||||
|
||||
|
||||
class DummyObject:
|
||||
pass
|
||||
|
||||
|
||||
class Dontsum:
|
||||
def __init__(self, value):
|
||||
self.value = value
|
||||
|
||||
def __str__(self):
|
||||
return str(self.value)
|
||||
|
||||
|
||||
def tuplesum(tuples):
|
||||
return tuple(map(sum, zip(*list(tuples))))
|
||||
def mysum(it):
|
||||
sit = [i for i in it if not isinstance(i, Dontsum)]
|
||||
return sum(sit)
|
||||
return tuple(map(mysum, zip(*list(tuples))))
|
||||
|
||||
|
||||
def order_overview(event):
|
||||
@@ -78,9 +94,10 @@ def order_overview(event):
|
||||
for cat in set([i.category for i in items])
|
||||
# insert categories into a set for uniqueness
|
||||
# a set is unsorted, so sort again by category
|
||||
],
|
||||
],
|
||||
key=lambda group: (group[0].position, group[0].identity) if group[0] is not None else (0, "")
|
||||
)
|
||||
|
||||
for c in items_by_category:
|
||||
c[0].num_total = tuplesum(item.num_total for item in c[1])
|
||||
c[0].num_pending = tuplesum(item.num_pending for item in c[1])
|
||||
@@ -88,6 +105,71 @@ def order_overview(event):
|
||||
c[0].num_refunded = tuplesum(item.num_refunded for item in c[1])
|
||||
c[0].num_paid = tuplesum(item.num_paid for item in c[1])
|
||||
|
||||
# Payment fees
|
||||
payment_cat_obj = DummyObject()
|
||||
payment_cat_obj.name = _('Payment method fees')
|
||||
payment_items = []
|
||||
num_total = {
|
||||
o['payment_provider']: (o['cnt'], o['payment_fee'])
|
||||
for o in
|
||||
Order.objects.current.filter(event=event).values('payment_provider').annotate(
|
||||
cnt=Count('id'), payment_fee=Sum('payment_fee'))
|
||||
}
|
||||
num_cancelled = {
|
||||
o['payment_provider']: (o['cnt'], o['payment_fee'])
|
||||
for o in (Order.objects.current
|
||||
.filter(event=event, status=Order.STATUS_CANCELLED)
|
||||
.values('payment_provider')
|
||||
.annotate(cnt=Count('id'), payment_fee=Sum('payment_fee')))
|
||||
}
|
||||
num_refunded = {
|
||||
o['payment_provider']: (o['cnt'], o['payment_fee'])
|
||||
for o in (Order.objects.current
|
||||
.filter(event=event, status=Order.STATUS_REFUNDED)
|
||||
.values('payment_provider')
|
||||
.annotate(cnt=Count('id'), payment_fee=Sum('payment_fee')))
|
||||
}
|
||||
num_pending = {
|
||||
o['payment_provider']: (o['cnt'], o['payment_fee'])
|
||||
for o in (Order.objects.current
|
||||
.filter(event=event, status__in=(Order.STATUS_PENDING, Order.STATUS_EXPIRED))
|
||||
.values('payment_provider')
|
||||
.annotate(cnt=Count('id'), payment_fee=Sum('payment_fee')))
|
||||
}
|
||||
num_paid = {
|
||||
o['payment_provider']: (o['cnt'], o['payment_fee'])
|
||||
for o in (Order.objects.current
|
||||
.filter(event=event, status=Order.STATUS_PAID)
|
||||
.values('payment_provider')
|
||||
.annotate(cnt=Count('id'), payment_fee=Sum('payment_fee')))
|
||||
}
|
||||
|
||||
provider_names = {}
|
||||
responses = register_payment_providers.send(event)
|
||||
for receiver, response in responses:
|
||||
provider = response(event)
|
||||
provider_names[provider.identifier] = provider.verbose_name
|
||||
|
||||
for pprov, total in num_total.items():
|
||||
ppobj = DummyObject()
|
||||
ppobj.name = provider_names.get(pprov, pprov)
|
||||
ppobj.has_variations = False
|
||||
ppobj.num_total = total
|
||||
ppobj.num_cancelled = num_cancelled.get(pprov, (0, 0))
|
||||
ppobj.num_refunded = num_refunded.get(pprov, (0, 0))
|
||||
ppobj.num_pending = num_pending.get(pprov, (0, 0))
|
||||
ppobj.num_paid = num_paid.get(pprov, (0, 0))
|
||||
payment_items.append(ppobj)
|
||||
|
||||
payment_cat_obj.num_total = (Dontsum(''), sum(i.num_total[1] for i in payment_items))
|
||||
payment_cat_obj.num_cancelled = (Dontsum(''), sum(i.num_cancelled[1] for i in payment_items))
|
||||
payment_cat_obj.num_refunded = (Dontsum(''), sum(i.num_refunded[1] for i in payment_items))
|
||||
payment_cat_obj.num_pending = (Dontsum(''), sum(i.num_pending[1] for i in payment_items))
|
||||
payment_cat_obj.num_paid = (Dontsum(''), sum(i.num_paid[1] for i in payment_items))
|
||||
payment_cat = (payment_cat_obj, payment_items)
|
||||
|
||||
items_by_category.append(payment_cat)
|
||||
|
||||
total = {
|
||||
'num_total': tuplesum(c.num_total for c, i in items_by_category),
|
||||
'num_pending': tuplesum(c.num_pending for c, i in items_by_category),
|
||||
|
||||
@@ -167,7 +167,7 @@ class OverviewReport(Report):
|
||||
])
|
||||
for item in tup[1]:
|
||||
tdata.append([
|
||||
item.name,
|
||||
" " + str(item.name),
|
||||
str(item.num_total[0]), str(item.num_total[1]),
|
||||
str(item.num_pending[0]), str(item.num_pending[1]),
|
||||
str(item.num_cancelled[0]), str(item.num_cancelled[1]),
|
||||
@@ -177,7 +177,7 @@ class OverviewReport(Report):
|
||||
if item.has_variations:
|
||||
for var in item.all_variations:
|
||||
tdata.append([
|
||||
" " + str(var),
|
||||
" " + str(var),
|
||||
str(var.num_total[0]), str(var.num_total[1]),
|
||||
str(var.num_pending[0]), str(var.num_pending[1]),
|
||||
str(var.num_cancelled[0]), str(var.num_cancelled[1]),
|
||||
|
||||
Reference in New Issue
Block a user