Adds inventory report
This commit is contained in:
parent
2a850c49bc
commit
3607fb19b8
2 changed files with 71 additions and 1 deletions
|
@ -1,11 +1,14 @@
|
||||||
import forms
|
import forms
|
||||||
|
|
||||||
|
from django.db import models
|
||||||
from django.db.models import Q
|
from django.db.models import Q
|
||||||
from django.db.models import Sum
|
from django.db.models import Sum
|
||||||
|
from django.db.models import Case, When, Value
|
||||||
from django.shortcuts import render
|
from django.shortcuts import render
|
||||||
from functools import wraps
|
from functools import wraps
|
||||||
|
|
||||||
from models import commerce
|
from models import commerce
|
||||||
|
from models import inventory
|
||||||
|
|
||||||
|
|
||||||
'''
|
'''
|
||||||
|
@ -108,7 +111,7 @@ def items_sold(request):
|
||||||
|
|
||||||
print line_items
|
print line_items
|
||||||
|
|
||||||
headings = ["description", "quantity", "price", "total"]
|
headings = ["Description", "Quantity", "Price", "Total"]
|
||||||
|
|
||||||
data = []
|
data = []
|
||||||
total_income = 0
|
total_income = 0
|
||||||
|
@ -125,3 +128,69 @@ def items_sold(request):
|
||||||
])
|
])
|
||||||
|
|
||||||
return Report(title, form, headings, data)
|
return Report(title, form, headings, data)
|
||||||
|
|
||||||
|
|
||||||
|
@report
|
||||||
|
def inventory(request):
|
||||||
|
''' Summarises the inventory status of the given items, grouping by
|
||||||
|
invoice status. '''
|
||||||
|
|
||||||
|
title = "Inventory"
|
||||||
|
|
||||||
|
form = forms.ProductAndCategoryForm(request.GET)
|
||||||
|
|
||||||
|
data = None
|
||||||
|
headings = None
|
||||||
|
|
||||||
|
if form.is_valid() and form.has_changed():
|
||||||
|
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.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"),
|
||||||
|
)
|
||||||
|
|
||||||
|
headings = ["Product", "Status", "Quantity"]
|
||||||
|
data = []
|
||||||
|
|
||||||
|
def status(reserved, status):
|
||||||
|
r = "Reserved" if reserved else "Unreserved"
|
||||||
|
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:
|
||||||
|
print commerce.Cart.STATUS_TYPES
|
||||||
|
data.append([
|
||||||
|
"%s - %s" % (
|
||||||
|
item["product__category__name"], item["product__name"]
|
||||||
|
),
|
||||||
|
status(item["is_reserved"], item["cart__status"]),
|
||||||
|
item["total_quantity"],
|
||||||
|
])
|
||||||
|
|
||||||
|
return Report(title, form, headings, data)
|
||||||
|
|
|
@ -37,6 +37,7 @@ public = [
|
||||||
|
|
||||||
|
|
||||||
reports = [
|
reports = [
|
||||||
|
url(r"^inventory/?$", staff_views.inventory, name="inventory"),
|
||||||
url(r"^items_sold/?$", staff_views.items_sold, name="items_sold"),
|
url(r"^items_sold/?$", staff_views.items_sold, name="items_sold"),
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue