diff --git a/src/pretix/base/models/orders.py b/src/pretix/base/models/orders.py index a62ed30c0e..d1348c67de 100644 --- a/src/pretix/base/models/orders.py +++ b/src/pretix/base/models/orders.py @@ -240,15 +240,17 @@ class Order(LoggedModel): has_pending_refund=Exists(pending_refund), ).annotate( pending_sum_t=F('total') - Coalesce(F('payment_sum'), 0) + Coalesce(F('refund_sum'), 0), - pending_sum_rc=-1 * F('payment_sum') + Coalesce(F('refund_sum'), 0), + pending_sum_rc=-1 * Coalesce(F('payment_sum'), 0) + Coalesce(F('refund_sum'), 0), ).annotate( is_overpaid=Case( When(~Q(status__in=(Order.STATUS_REFUNDED, Order.STATUS_CANCELED)) & Q(pending_sum_t__lt=0), then=Value('1')), When(Q(status__in=(Order.STATUS_REFUNDED, Order.STATUS_CANCELED)) & Q(pending_sum_rc__lt=0), then=Value('1')), - When(Q(status__in=(Order.STATUS_EXPIRED, Order.STATUS_PENDING)) & Q(pending_sum_t__lt=0), - then=Value('1')), + default=Value('0'), + output_field=models.IntegerField() + ), + is_pending_with_full_payment=Case( When(Q(status__in=(Order.STATUS_EXPIRED, Order.STATUS_PENDING)) & Q(pending_sum_t__lte=0) & Q(require_approval=False), then=Value('1')), diff --git a/src/pretix/control/forms/filter.py b/src/pretix/control/forms/filter.py index 0db1497437..3c59ddc4ad 100644 --- a/src/pretix/control/forms/filter.py +++ b/src/pretix/control/forms/filter.py @@ -209,6 +209,7 @@ class EventOrderFilterForm(OrderFilterForm): ('pa', _('Approval pending')), ('overpaid', _('Overpaid')), ('underpaid', _('Underpaid')), + ('pendingpaid', _('Pending (but fully paid)')) ), required=False, ) @@ -276,9 +277,11 @@ class EventOrderFilterForm(OrderFilterForm): qs = qs.filter( Q(~Q(status__in=(Order.STATUS_REFUNDED, Order.STATUS_CANCELED)) & Q(pending_sum_t__lt=0)) | Q(Q(status__in=(Order.STATUS_REFUNDED, Order.STATUS_CANCELED)) & Q(pending_sum_rc__lt=0)) - | Q(Q(status__in=(Order.STATUS_EXPIRED, Order.STATUS_PENDING)) & Q(pending_sum_t__lt=0)) - | Q(Q(status__in=(Order.STATUS_EXPIRED, Order.STATUS_PENDING)) & Q(pending_sum_t__lte=0) - & Q(require_approval=False)) + ) + elif fdata.get('status') == 'pendingpaid': + qs = qs.filter( + Q(status__in=(Order.STATUS_EXPIRED, Order.STATUS_PENDING)) & Q(pending_sum_t__lte=0) + & Q(require_approval=False) ) elif fdata.get('status') == 'underpaid': qs = qs.filter( diff --git a/src/pretix/control/templates/pretixcontrol/event/index.html b/src/pretix/control/templates/pretixcontrol/event/index.html index 0059716859..2f71270283 100644 --- a/src/pretix/control/templates/pretixcontrol/event/index.html +++ b/src/pretix/control/templates/pretixcontrol/event/index.html @@ -43,6 +43,17 @@ class="btn btn-primary">{% trans "Show orders pending approval" %} {% endif %} + {% if has_pending_orders_with_full_payment %} +