diff --git a/registrasion/controllers/invoice.py b/registrasion/controllers/invoice.py index fdea324bfd3ac14ac000ff8c5265e5212512a917..264049c86486febb699d343c16e667b7797cf774 100644 --- a/registrasion/controllers/invoice.py +++ b/registrasion/controllers/invoice.py @@ -57,6 +57,7 @@ class InvoiceController(object): return value @classmethod + @transaction.atomic def _generate(cls, cart): ''' Generates an invoice for the given cart. ''' invoice = rego.Invoice.objects.create( @@ -65,10 +66,12 @@ class InvoiceController(object): cart_revision=cart.revision, value=Decimal() ) - invoice.save() - # TODO: calculate line items. product_items = rego.ProductItem.objects.filter(cart=cart) + + if len(product_items) == 0: + raise ValidationError("Your cart is empty.") + product_items = product_items.order_by( "product__category__order", "product__order" ) @@ -82,7 +85,6 @@ class InvoiceController(object): quantity=item.quantity, price=product.price, ) - line_item.save() invoice_value += line_item.quantity * line_item.price for item in discount_items: @@ -92,11 +94,13 @@ class InvoiceController(object): quantity=item.quantity, price=cls.resolve_discount_value(item) * -1, ) - line_item.save() invoice_value += line_item.quantity * line_item.price - # TODO: calculate line items from discounts invoice.value = invoice_value + + if invoice.value == 0: + invoice.paid = True + invoice.save() return invoice