@@ -48,64 +48,68 @@ class InvoiceController(object):
except ObjectDoesNotExist:
condition = rego.DiscountForCategory.objects.get(
discount=item.discount,
category=item.product.category
)
if condition.percentage is not None:
value = item.product.price * (condition.percentage / 100)
else:
value = condition.price
return value
@classmethod
@transaction.atomic
def _generate(cls, cart):
''' Generates an invoice for the given cart. '''
invoice = rego.Invoice.objects.create(
user=cart.user,
cart=cart,
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"
discount_items = rego.DiscountItem.objects.filter(cart=cart)
invoice_value = Decimal()
for item in product_items:
product = item.product
line_item = rego.LineItem.objects.create(
invoice=invoice,
description="%s - %s" % (product.category.name, product.name),
quantity=item.quantity,
price=product.price,
line_item.save()
invoice_value += line_item.quantity * line_item.price
for item in discount_items:
description=item.discount.description,
price=cls.resolve_discount_value(item) * -1,
# TODO: calculate line items from discounts
invoice.value = invoice_value
if invoice.value == 0:
invoice.paid = True
return invoice
def update_validity(self):
''' Updates the validity of this invoice if the cart it is attached to
has updated. '''
if self.invoice.cart is not None:
if self.invoice.cart.revision != self.invoice.cart_revision:
self.void()
def void(self):