diff --git a/registrasion/controllers/invoice.py b/registrasion/controllers/invoice.py index 118b49cbc0d48214cd20b0368a4a375ad69c0132..3d4df7fcde5cb686c451c0bf4b80cd851e332838 100644 --- a/registrasion/controllers/invoice.py +++ b/registrasion/controllers/invoice.py @@ -72,6 +72,38 @@ class InvoiceController(ForId, object): value = condition.price return value + @classmethod + @transaction.atomic + def manual_invoice(cls, user, due_delta, description_price_pairs): + ''' Generates an invoice for arbitrary items, not held in a user's + cart. + + Arguments: + user (User): The user the invoice is being generated for. + due_delta (datetime.timedelta): The length until the invoice is + due. + description_price_pairs ([(str, long or Decimal), ...]): A list of + pairs. Each pair consists of the description for each line item + and the price for that line item. The price will be cast to + Decimal. + + Returns: + an Invoice. + ''' + + line_items = [] + for description, price in description_price_pairs: + line_item = commerce.LineItem( + description=description, + quantity=1, + price=Decimal(price), + product=None, + ) + line_items.append(line_item) + + min_due_time = timezone.now() + due_delta + return cls._generate(user, None, min_due_time, line_items) + @classmethod @transaction.atomic def _generate_from_cart(cls, cart): @@ -129,7 +161,6 @@ class InvoiceController(ForId, object): # Generate the invoice - user = cart.user min_due_time = cart.reservation_duration + cart.time_last_updated return cls._generate(cart.user, cart, min_due_time, line_items)