From 023f9eb6e77e5b61e158eca6fab6c7f0b4af79eb Mon Sep 17 00:00:00 2001 From: Raphael Michel Date: Tue, 17 Nov 2020 22:11:06 +0100 Subject: [PATCH] Order list export: Optional columns for payment amounts --- src/pretix/base/exporters/orderlist.py | 43 ++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/src/pretix/base/exporters/orderlist.py b/src/pretix/base/exporters/orderlist.py index aaae853da2..c77d57b4e4 100644 --- a/src/pretix/base/exporters/orderlist.py +++ b/src/pretix/base/exporters/orderlist.py @@ -53,9 +53,23 @@ class OrderListExporter(MultiSheetListExporter): initial=True, required=False )), + ('include_payment_amounts', + forms.BooleanField( + label=_('Include payment amounts'), + initial=False, + required=False + )), ] ) + def _get_all_payment_methods(self, qs): + pps = dict(get_all_payment_providers()) + return sorted([(pp, pps[pp]) for pp in set( + OrderPayment.objects.exclude(provider='free').filter(order__event__in=self.events).values_list( + 'provider', flat=True + ).distinct() + )], key=lambda pp: pp[0]) + def _get_all_tax_rates(self, qs): tax_rates = set( a for a @@ -150,6 +164,10 @@ class OrderListExporter(MultiSheetListExporter): headers.append(_('Comment')) headers.append(_('Positions')) headers.append(_('Payment providers')) + if form_data.get('include_payment_amounts'): + payment_methods = self._get_all_payment_methods(qs) + for id, vn in payment_methods: + headers.append(_('Paid by {method}').format(method=vn)) yield headers @@ -163,6 +181,23 @@ class OrderListExporter(MultiSheetListExporter): taxsum=Sum('tax_value'), grosssum=Sum('value') ) } + if form_data.get('include_payment_amounts'): + payment_sum_cache = { + (o['order__id'], o['provider']): o['grosssum'] for o in + OrderPayment.objects.values('provider', 'order__id').order_by().filter( + state__in=[OrderPayment.PAYMENT_STATE_CONFIRMED, OrderPayment.PAYMENT_STATE_REFUNDED] + ).annotate( + grosssum=Sum('amount') + ) + } + refund_sum_cache = { + (o['order__id'], o['provider']): o['grosssum'] for o in + OrderRefund.objects.values('provider', 'order__id').order_by().filter( + state__in=[OrderRefund.REFUND_STATE_DONE, OrderRefund.REFUND_STATE_TRANSIT] + ).annotate( + grosssum=Sum('amount') + ) + } sum_cache = { (o['order__id'], o['tax_rate']): o for o in OrderPosition.objects.values('tax_rate', 'order__id').order_by().annotate( @@ -234,6 +269,14 @@ class OrderListExporter(MultiSheetListExporter): str(self.providers.get(p, p)) for p in sorted(set((order.payment_providers or '').split(','))) if p and p != 'free' ])) + + if form_data.get('include_payment_amounts'): + payment_methods = self._get_all_payment_methods(qs) + for id, vn in payment_methods: + row.append( + payment_sum_cache.get((order.id, id), Decimal('0.00')) - + refund_sum_cache.get((order.id, id), Decimal('0.00')) + ) yield row def iterate_fees(self, form_data: dict):