2
0
mirror of https://github.com/inventree/InvenTree.git synced 2025-04-29 20:16:44 +00:00

Merge pull request #2827 from SchrodingersGat/variant-stock

Allocation quantity functions include variants
This commit is contained in:
Oliver 2022-04-14 12:26:17 +10:00 committed by GitHub
commit df2f7d195a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -1313,19 +1313,31 @@ class Part(MPTTModel):
return quantity return quantity
def build_order_allocations(self): def build_order_allocations(self, **kwargs):
""" """
Return all 'BuildItem' objects which allocate this part to Build objects Return all 'BuildItem' objects which allocate this part to Build objects
""" """
return BuildModels.BuildItem.objects.filter(stock_item__part__id=self.id) include_variants = kwargs.get('include_variants', True)
def build_order_allocation_count(self): queryset = BuildModels.BuildItem.objects.all()
if include_variants:
variants = self.get_descendants(include_self=True)
queryset = queryset.filter(
stock_item__part__in=variants,
)
else:
queryset = queryset.filter(stock_item__part=self)
return queryset
def build_order_allocation_count(self, **kwargs):
""" """
Return the total amount of this part allocated to build orders Return the total amount of this part allocated to build orders
""" """
query = self.build_order_allocations().aggregate( query = self.build_order_allocations(**kwargs).aggregate(
total=Coalesce( total=Coalesce(
Sum( Sum(
'quantity', 'quantity',
@ -1343,7 +1355,19 @@ class Part(MPTTModel):
Return all sales-order-allocation objects which allocate this part to a SalesOrder Return all sales-order-allocation objects which allocate this part to a SalesOrder
""" """
queryset = OrderModels.SalesOrderAllocation.objects.filter(item__part__id=self.id) include_variants = kwargs.get('include_variants', True)
queryset = OrderModels.SalesOrderAllocation.objects.all()
if include_variants:
# Include allocations for all variants
variants = self.get_descendants(include_self=True)
queryset = queryset.filter(
item__part__in=variants,
)
else:
# Only look at this part
queryset = queryset.filter(item__part=self)
# Default behaviour is to only return *pending* allocations # Default behaviour is to only return *pending* allocations
pending = kwargs.get('pending', True) pending = kwargs.get('pending', True)
@ -1381,7 +1405,7 @@ class Part(MPTTModel):
return query['total'] return query['total']
def allocation_count(self): def allocation_count(self, **kwargs):
""" """
Return the total quantity of stock allocated for this part, Return the total quantity of stock allocated for this part,
against both build orders and sales orders. against both build orders and sales orders.
@ -1389,8 +1413,8 @@ class Part(MPTTModel):
return sum( return sum(
[ [
self.build_order_allocation_count(), self.build_order_allocation_count(**kwargs),
self.sales_order_allocation_count(), self.sales_order_allocation_count(**kwargs),
], ],
) )