Re-arranges invoice generation code.
- Reduces number of db queries - Localises the code that interrogates the cart and the code that generates the invoice itself.
This commit is contained in:
parent
3f53d6f4ff
commit
613667aa30
1 changed files with 32 additions and 29 deletions
|
@ -79,26 +79,7 @@ class InvoiceController(ForId, object):
|
||||||
|
|
||||||
cart.refresh_from_db()
|
cart.refresh_from_db()
|
||||||
|
|
||||||
issued = timezone.now()
|
# Generate the line items from the cart.
|
||||||
reservation_limit = cart.reservation_duration + cart.time_last_updated
|
|
||||||
# Never generate a due time that is before the issue time
|
|
||||||
due = max(issued, reservation_limit)
|
|
||||||
|
|
||||||
# Get the invoice recipient
|
|
||||||
profile = people.AttendeeProfileBase.objects.get_subclass(
|
|
||||||
id=cart.user.attendee.attendeeprofilebase.id,
|
|
||||||
)
|
|
||||||
recipient = profile.invoice_recipient()
|
|
||||||
invoice = commerce.Invoice.objects.create(
|
|
||||||
user=cart.user,
|
|
||||||
cart=cart,
|
|
||||||
cart_revision=cart.revision,
|
|
||||||
status=commerce.Invoice.STATUS_UNPAID,
|
|
||||||
value=Decimal(),
|
|
||||||
issue_time=issued,
|
|
||||||
due_time=due,
|
|
||||||
recipient=recipient,
|
|
||||||
)
|
|
||||||
|
|
||||||
product_items = commerce.ProductItem.objects.filter(cart=cart)
|
product_items = commerce.ProductItem.objects.filter(cart=cart)
|
||||||
product_items = product_items.select_related(
|
product_items = product_items.select_related(
|
||||||
|
@ -129,35 +110,57 @@ class InvoiceController(ForId, object):
|
||||||
description = discount.description
|
description = discount.description
|
||||||
return "%s (%s)" % (description, format_product(product))
|
return "%s (%s)" % (description, format_product(product))
|
||||||
|
|
||||||
invoice_value = Decimal()
|
|
||||||
for item in product_items:
|
for item in product_items:
|
||||||
product = item.product
|
product = item.product
|
||||||
line_item = commerce.LineItem(
|
line_item = commerce.LineItem(
|
||||||
invoice=invoice,
|
|
||||||
description=format_product(product),
|
description=format_product(product),
|
||||||
quantity=item.quantity,
|
quantity=item.quantity,
|
||||||
price=product.price,
|
price=product.price,
|
||||||
product=product,
|
product=product,
|
||||||
)
|
)
|
||||||
line_items.append(line_item)
|
line_items.append(line_item)
|
||||||
invoice_value += line_item.quantity * line_item.price
|
|
||||||
for item in discount_items:
|
for item in discount_items:
|
||||||
line_item = commerce.LineItem(
|
line_item = commerce.LineItem(
|
||||||
invoice=invoice,
|
|
||||||
description=format_discount(item.discount, item.product),
|
description=format_discount(item.discount, item.product),
|
||||||
quantity=item.quantity,
|
quantity=item.quantity,
|
||||||
price=cls.resolve_discount_value(item) * -1,
|
price=cls.resolve_discount_value(item) * -1,
|
||||||
product=item.product,
|
product=item.product,
|
||||||
)
|
)
|
||||||
line_items.append(line_item)
|
line_items.append(line_item)
|
||||||
invoice_value += line_item.quantity * line_item.price
|
|
||||||
|
# Generate the invoice
|
||||||
|
|
||||||
|
user = cart.user
|
||||||
|
reservation_limit = cart.reservation_duration + cart.time_last_updated
|
||||||
|
# Never generate a due time that is before the issue time
|
||||||
|
issued = timezone.now()
|
||||||
|
due = max(issued, reservation_limit)
|
||||||
|
|
||||||
|
# Get the invoice recipient
|
||||||
|
profile = people.AttendeeProfileBase.objects.get_subclass(
|
||||||
|
id=user.attendee.attendeeprofilebase.id,
|
||||||
|
)
|
||||||
|
recipient = profile.invoice_recipient()
|
||||||
|
|
||||||
|
invoice_value = sum(item.quantity * item.price for item in line_items)
|
||||||
|
|
||||||
|
invoice = commerce.Invoice.objects.create(
|
||||||
|
user=user,
|
||||||
|
cart=cart,
|
||||||
|
cart_revision=cart.revision,
|
||||||
|
status=commerce.Invoice.STATUS_UNPAID,
|
||||||
|
value=invoice_value,
|
||||||
|
issue_time=issued,
|
||||||
|
due_time=due,
|
||||||
|
recipient=recipient,
|
||||||
|
)
|
||||||
|
|
||||||
|
# Associate the line items with the invoice
|
||||||
|
for line_item in line_items:
|
||||||
|
line_item.invoice = invoice
|
||||||
|
|
||||||
commerce.LineItem.objects.bulk_create(line_items)
|
commerce.LineItem.objects.bulk_create(line_items)
|
||||||
|
|
||||||
invoice.value = invoice_value
|
|
||||||
|
|
||||||
invoice.save()
|
|
||||||
|
|
||||||
cls.email_on_invoice_creation(invoice)
|
cls.email_on_invoice_creation(invoice)
|
||||||
|
|
||||||
return invoice
|
return invoice
|
||||||
|
|
Loading…
Reference in a new issue