diff --git a/src/pretix/api/views/order.py b/src/pretix/api/views/order.py index 9076e4b36b..0ae20342c8 100644 --- a/src/pretix/api/views/order.py +++ b/src/pretix/api/views/order.py @@ -148,9 +148,13 @@ with scopes_disabled(): else: code = Q(code__icontains=Order.normalize_code(u)) + invoice_nos = {u, u.upper()} + if u.isdigit(): + for i in range(2, 12): + invoice_nos.add(u.zfill(i)) + matching_invoices = Invoice.objects.filter( - Q(invoice_no__iexact=u) - | Q(invoice_no__iexact=u.zfill(5)) + Q(invoice_no__in=invoice_nos) | Q(full_invoice_no__iexact=u) ).values_list('order_id', flat=True) diff --git a/src/pretix/base/settings.py b/src/pretix/base/settings.py index f11c78b956..4137ed3d74 100644 --- a/src/pretix/base/settings.py +++ b/src/pretix/base/settings.py @@ -594,6 +594,7 @@ DEFAULTS = { 'form_kwargs': dict( label=_("Minimum length of invoice number after prefix"), help_text=_("The part of your invoice number after your prefix will be filled up with leading zeros up to this length, e.g. INV-001 or INV-00001."), + max_value=12, required=True, ) }, diff --git a/src/pretix/control/forms/filter.py b/src/pretix/control/forms/filter.py index 06c2ea755d..6a34e6fbfb 100644 --- a/src/pretix/control/forms/filter.py +++ b/src/pretix/control/forms/filter.py @@ -256,9 +256,13 @@ class OrderFilterForm(FilterForm): else: code = Q(code__icontains=Order.normalize_code(u)) + invoice_nos = {u, u.upper()} + if u.isdigit(): + for i in range(2, 12): + invoice_nos.add(u.zfill(i)) + matching_invoices = Invoice.objects.filter( - Q(invoice_no__iexact=u) - | Q(invoice_no__iexact=u.zfill(5)) + Q(invoice_no__in=invoice_nos) | Q(full_invoice_no__iexact=u) ).values_list('order_id', flat=True) matching_positions = OrderPosition.objects.filter( @@ -1004,9 +1008,13 @@ class OrderPaymentSearchFilterForm(forms.Form): if fdata.get('query'): u = fdata.get('query') + invoice_nos = {u, u.upper()} + if u.isdigit(): + for i in range(2, 12): + invoice_nos.add(u.zfill(i)) + matching_invoices = Invoice.objects.filter( - Q(invoice_no__iexact=u) - | Q(invoice_no__iexact=u.zfill(5)) + Q(invoice_no__in=invoice_nos) | Q(full_invoice_no__iexact=u) ).values_list('order_id', flat=True) diff --git a/src/pretix/plugins/banktransfer/views.py b/src/pretix/plugins/banktransfer/views.py index 49ee14852f..7e78c9ab24 100644 --- a/src/pretix/plugins/banktransfer/views.py +++ b/src/pretix/plugins/banktransfer/views.py @@ -46,7 +46,6 @@ from django import forms from django.contrib import messages from django.db import transaction from django.db.models import Count, Q, QuerySet -from django.db.models.functions import Concat from django.http import FileResponse, JsonResponse from django.shortcuts import get_object_or_404, redirect, render from django.urls import reverse @@ -247,16 +246,24 @@ class ActionView(View): & Q(code__icontains=Order.normalize_code(u.split("-")[1]))) else: code = Q(code__icontains=Order.normalize_code(u)) - qs = self.order_qs().order_by('pk').annotate(inr=Concat('invoices__prefix', 'invoices__invoice_no')).filter( + + invoice_nos = {u, u.upper()} + if u.isdigit(): + if hasattr(request, 'event'): + invoice_nos.add(u.zfill(request.event.invoice_numbers_counter_length)) + else: + for i in range(2, 12): + invoice_nos.add(u.zfill(i)) + + qs = self.order_qs().order_by('pk').filter( code | Q(email__icontains=u) | Q(all_positions__attendee_name_cached__icontains=u) | Q(all_positions__attendee_email__icontains=u) | Q(invoice_address__name_cached__icontains=u) | Q(invoice_address__company__icontains=u) - | Q(invoices__invoice_no=u) - | Q(invoices__invoice_no=u.zfill(5)) - | Q(inr=u) + | Q(invoices__invoice_no__in=invoice_nos) + | Q(invoices__full_invoice_no=u) ).select_related('event').annotate(pcnt=Count('invoices')).distinct() # Yep, we wouldn't need to count the invoices here. However, having this Count() statement in there # tricks Django into generating a GROUP BY clause that it otherwise wouldn't and that is required to