mirror of
https://github.com/inventree/InvenTree
synced 2024-08-30 18:33:04 +00:00
Annotate with "unallocated_stock" quantity (calculated field)
This commit is contained in:
parent
94068f6bad
commit
bf6a9b69ce
@ -7,7 +7,7 @@ from decimal import Decimal
|
|||||||
|
|
||||||
from django.urls import reverse_lazy
|
from django.urls import reverse_lazy
|
||||||
from django.db import models, transaction
|
from django.db import models, transaction
|
||||||
from django.db.models import Q
|
from django.db.models import ExpressionWrapper, F, Q
|
||||||
from django.db.models.functions import Coalesce
|
from django.db.models.functions import Coalesce
|
||||||
from django.utils.translation import ugettext_lazy as _
|
from django.utils.translation import ugettext_lazy as _
|
||||||
|
|
||||||
@ -375,7 +375,7 @@ class PartSerializer(InvenTreeModelSerializer):
|
|||||||
"""
|
"""
|
||||||
so_allocation_filter = Q(
|
so_allocation_filter = Q(
|
||||||
line__order__status__in=SalesOrderStatus.OPEN, # LineItem points to an OPEN order
|
line__order__status__in=SalesOrderStatus.OPEN, # LineItem points to an OPEN order
|
||||||
shipment=None, # Allocated item has *not* been shipped out
|
shipment__shipment_date=None, # Allocated item has *not* been shipped out
|
||||||
)
|
)
|
||||||
|
|
||||||
queryset = queryset.annotate(
|
queryset = queryset.annotate(
|
||||||
@ -402,6 +402,15 @@ class PartSerializer(InvenTreeModelSerializer):
|
|||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
# Annotate with the total 'available stock' quantity
|
||||||
|
# This is the current stock, minus any allocations
|
||||||
|
queryset = queryset.annotate(
|
||||||
|
unallocated_stock=ExpressionWrapper(
|
||||||
|
F('in_stock') - F('allocated_to_sales_orders') - F('allocated_to_build_orders'),
|
||||||
|
output_field=models.DecimalField(),
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
return queryset
|
return queryset
|
||||||
|
|
||||||
def get_starred(self, part):
|
def get_starred(self, part):
|
||||||
@ -417,6 +426,7 @@ class PartSerializer(InvenTreeModelSerializer):
|
|||||||
# Calculated fields
|
# Calculated fields
|
||||||
allocated_to_build_orders = serializers.FloatField(read_only=True)
|
allocated_to_build_orders = serializers.FloatField(read_only=True)
|
||||||
allocated_to_sales_orders = serializers.FloatField(read_only=True)
|
allocated_to_sales_orders = serializers.FloatField(read_only=True)
|
||||||
|
unallocated_stock = serializers.FloatField(read_only=True)
|
||||||
building = serializers.FloatField(read_only=True)
|
building = serializers.FloatField(read_only=True)
|
||||||
in_stock = serializers.FloatField(read_only=True)
|
in_stock = serializers.FloatField(read_only=True)
|
||||||
ordering = serializers.FloatField(read_only=True)
|
ordering = serializers.FloatField(read_only=True)
|
||||||
@ -472,6 +482,7 @@ class PartSerializer(InvenTreeModelSerializer):
|
|||||||
'suppliers',
|
'suppliers',
|
||||||
'thumbnail',
|
'thumbnail',
|
||||||
'trackable',
|
'trackable',
|
||||||
|
'unallocated_stock',
|
||||||
'units',
|
'units',
|
||||||
'variant_of',
|
'variant_of',
|
||||||
'virtual',
|
'virtual',
|
||||||
|
Loading…
Reference in New Issue
Block a user