Changeset - 2e5a8e366890
[Not reviewed]
0 1 0
Christopher Neugebauer - 8 years ago 2016-09-14 23:08:57
chrisjrn@gmail.com
First pass at allowing manual invoices.
1 file changed with 32 insertions and 1 deletions:
0 comments (0 inline, 0 general)
registrasion/controllers/invoice.py
Show inline comments
...
 
@@ -63,24 +63,56 @@ class InvoiceController(ForId, object):
 
            )
 
        except ObjectDoesNotExist:
 
            condition = conditions.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 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):
 
        ''' Generates an invoice for the given cart. '''
 

	
 
        cart.refresh_from_db()
 

	
 
        # Generate the line items from the cart.
 

	
 
        product_items = commerce.ProductItem.objects.filter(cart=cart)
 
        product_items = product_items.select_related(
 
            "product",
...
 
@@ -120,25 +152,24 @@ class InvoiceController(ForId, object):
 
            line_items.append(line_item)
 
        for item in discount_items:
 
            line_item = commerce.LineItem(
 
                description=format_discount(item.discount, item.product),
 
                quantity=item.quantity,
 
                price=cls.resolve_discount_value(item) * -1,
 
                product=item.product,
 
            )
 
            line_items.append(line_item)
 

	
 
        # 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)
 

	
 
    @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, min_due_time)
 

	
0 comments (0 inline, 0 general)