Changeset - 66226663d53f
[Not reviewed]
0 1 0
Christopher Neugebauer - 8 years ago 2016-08-26 05:53:33
chrisjrn@gmail.com
Makes the inventory report even clearer.
1 file changed with 49 insertions and 23 deletions:
0 comments (0 inline, 0 general)
registrasion/staff_views.py
Show inline comments
 
import forms
 

	
 
from django.db import models
 
from django.db.models import Q
 
from django.db.models import F, Q
 
from django.db.models import Sum
 
from django.db.models import Case, When, Value
 
from django.shortcuts import render
 
from functools import wraps
 

	
 
from models import commerce
 
from models import inventory
 

	
 

	
 
'''
 

	
 
All reports must be viewable by staff only (permissions?)
...
 
@@ -132,55 +132,81 @@ def items_sold(request, form):
 
@report("Inventory", forms.ProductAndCategoryForm)
 
def inventory(request, form):
 
    ''' Summarises the inventory status of the given items, grouping by
 
    invoice status. '''
 

	
 
    products = form.cleaned_data["product"]
 
    categories = form.cleaned_data["category"]
 

	
 
    items = commerce.ProductItem.objects.filter(
 
        Q(product__in=products) | Q(product__category__in=categories),
 
    ).select_related("cart", "product")
 

	
 
    # TODO annotate with whether the item is reserved or not.
 

	
 
    items = items.annotate(is_reserved=Case(
 
        When(cart__in=commerce.Cart.reserved_carts(), then=Value(1)),
 
        default=Value(0),
 
        output_field=models.BooleanField(),
 
    ))
 
    items = items.annotate(
 
        is_reserved=Case(
 
            When(cart__in=commerce.Cart.reserved_carts(), then=Value(1)),
 
            default=Value(0),
 
            output_field=models.BooleanField(),
 
        ),
 
    )
 

	
 
    items = items.order_by(
 
        "cart__status",
 
        "product__category__order",
 
        "product__order",
 
    ).values(
 
        "product",
 
        "product__category__name",
 
        "product__name",
 
        "cart__status",
 
        "is_reserved",
 
    ).annotate(
 
        total_quantity=Sum("quantity"),
 
        total_paid=Sum(Case(
 
            When(
 
                cart__status=commerce.Cart.STATUS_PAID,
 
                then=F("quantity"),
 
            ),
 
            default=Value(0),
 
        )),
 
        total_refunded=Sum(Case(
 
            When(
 
                cart__status=commerce.Cart.STATUS_RELEASED,
 
                then=F("quantity"),
 
            ),
 
            default=Value(0),
 
        )),
 
        total_unreserved=Sum(Case(
 
            When(
 
                (
 
                    Q(cart__status=commerce.Cart.STATUS_ACTIVE) &
 
                    Q(is_reserved=False)
 
                ),
 
                then=F("quantity"),
 
            ),
 
            default=Value(0),
 
        )),
 
        total_reserved=Sum(Case(
 
            When(
 
                (
 
                    Q(cart__status=commerce.Cart.STATUS_ACTIVE) &
 
                    Q(is_reserved=True)
 
                ),
 
                then=F("quantity"),
 
            ),
 
            default=Value(0),
 
        )),
 
    )
 

	
 
    headings = ["Product", "Status", "Quantity"]
 
    headings = [
 
        "Product", "Paid", "Reserved", "Unreserved", "Refunded",
 
    ]
 
    data = []
 

	
 
    def status(reserved, status):
 
        r = "Reserved" if reserved else "Unreserved"
 
        # This is a bit weird -- can we simplify?
 
        s = "".join(
 
            "%s" % i[1] for i in commerce.Cart.STATUS_TYPES if i[0]==status
 
        )
 
        return "%s - %s" % (r, s)
 

	
 
    for item in items:
 
        data.append([
 
            "%s - %s" % (
 
                item["product__category__name"], item["product__name"]
 
            ),
 
            status(item["is_reserved"], item["cart__status"]),
 
            item["total_quantity"],
 
            item["total_paid"],
 
            item["total_reserved"],
 
            item["total_unreserved"],
 
            item["total_refunded"],
 
        ])
 

	
 
    return Report("Inventory", headings, data)
0 comments (0 inline, 0 general)