diff --git a/src/pretix/base/services/stats.py b/src/pretix/base/services/stats.py index 1602af3969..2321124611 100644 --- a/src/pretix/base/services/stats.py +++ b/src/pretix/base/services/stats.py @@ -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), diff --git a/src/pretix/plugins/reports/exporters.py b/src/pretix/plugins/reports/exporters.py index 18ae778cc8..d6f38c9fef 100644 --- a/src/pretix/plugins/reports/exporters.py +++ b/src/pretix/plugins/reports/exporters.py @@ -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]),