Order search: Extend zfill() for invoice numbers beyond 5 digits

This commit is contained in:
Raphael Michel
2023-04-18 21:45:18 +02:00
parent 044d6720d2
commit 30a2d853fd
4 changed files with 31 additions and 11 deletions

View File

@@ -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)

View File

@@ -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,
)
},

View File

@@ -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)

View File

@@ -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