diff --git a/registrasion/controllers/invoice.py b/registrasion/controllers/invoice.py index b88abb09..118b49cb 100644 --- a/registrasion/controllers/invoice.py +++ b/registrasion/controllers/invoice.py @@ -44,7 +44,7 @@ class InvoiceController(ForId, object): cart_controller.validate_cart() # Raises ValidationError on fail. cls.update_old_invoices(cart) - invoice = cls._generate(cart) + invoice = cls._generate_from_cart(cart) return cls(invoice) @@ -74,7 +74,7 @@ class InvoiceController(ForId, object): @classmethod @transaction.atomic - def _generate(cls, cart): + def _generate_from_cart(cls, cart): ''' Generates an invoice for the given cart. ''' cart.refresh_from_db() @@ -86,14 +86,13 @@ class InvoiceController(ForId, object): "product", "product__category", ) - - if len(product_items) == 0: - raise ValidationError("Your cart is empty.") - product_items = product_items.order_by( "product__category__order", "product__order" ) + if len(product_items) == 0: + raise ValidationError("Your cart is empty.") + discount_items = commerce.DiscountItem.objects.filter(cart=cart) discount_items = discount_items.select_related( "discount", @@ -101,8 +100,6 @@ class InvoiceController(ForId, object): "product__category", ) - line_items = [] - def format_product(product): return "%s - %s" % (product.category.name, product.name) @@ -110,6 +107,8 @@ class InvoiceController(ForId, object): description = discount.description return "%s (%s)" % (description, format_product(product)) + line_items = [] + for item in product_items: product = item.product line_item = commerce.LineItem( @@ -131,10 +130,17 @@ class InvoiceController(ForId, object): # Generate the invoice user = cart.user - reservation_limit = cart.reservation_duration + cart.time_last_updated + min_due_time = cart.reservation_duration + cart.time_last_updated + + return cls._generate(cart.user, cart, min_due_time, line_items) + + @classmethod + @transaction.atomic + def _generate(cls, user, cart, min_due_time, line_items): + # Never generate a due time that is before the issue time issued = timezone.now() - due = max(issued, reservation_limit) + due = max(issued, min_due_time) # Get the invoice recipient profile = people.AttendeeProfileBase.objects.get_subclass(