mirror of
				https://github.com/inventree/InvenTree.git
				synced 2025-11-03 22:55:43 +00:00 
			
		
		
		
	Part table stock filtering (#4462)
* Update PartSerializer queryset annotation - Add 'total_stock' (in_stock + variant_stock) - Update 'unallocated_stock' to use total_stock * Allow API filtering by total_in_stock value * Refactor partStockLabel method - We'll use this in the partTable also - Allow us to prevent further API calls * Cleanup loadPartTable * Refactor part variant table * More updates to part badge function * Bump API version * js linting
This commit is contained in:
		@@ -1337,6 +1337,7 @@ class PartList(APIDownloadMixin, ListCreateAPI):
 | 
			
		||||
        'creation_date',
 | 
			
		||||
        'IPN',
 | 
			
		||||
        'in_stock',
 | 
			
		||||
        'total_in_stock',
 | 
			
		||||
        'unallocated_stock',
 | 
			
		||||
        'category',
 | 
			
		||||
        'last_stocktake',
 | 
			
		||||
 
 | 
			
		||||
@@ -423,7 +423,6 @@ class PartSerializer(RemoteImageMixin, InvenTreeModelSerializer):
 | 
			
		||||
            'full_name',
 | 
			
		||||
            'image',
 | 
			
		||||
            'in_stock',
 | 
			
		||||
            'variant_stock',
 | 
			
		||||
            'ordering',
 | 
			
		||||
            'building',
 | 
			
		||||
            'IPN',
 | 
			
		||||
@@ -444,10 +443,12 @@ class PartSerializer(RemoteImageMixin, InvenTreeModelSerializer):
 | 
			
		||||
            'stock_item_count',
 | 
			
		||||
            'suppliers',
 | 
			
		||||
            'thumbnail',
 | 
			
		||||
            'total_in_stock',
 | 
			
		||||
            'trackable',
 | 
			
		||||
            'unallocated_stock',
 | 
			
		||||
            'units',
 | 
			
		||||
            'variant_of',
 | 
			
		||||
            'variant_stock',
 | 
			
		||||
            'virtual',
 | 
			
		||||
            'pricing_min',
 | 
			
		||||
            'pricing_max',
 | 
			
		||||
@@ -554,11 +555,20 @@ class PartSerializer(RemoteImageMixin, InvenTreeModelSerializer):
 | 
			
		||||
            allocated_to_build_orders=part.filters.annotate_build_order_allocations(),
 | 
			
		||||
        )
 | 
			
		||||
 | 
			
		||||
        # Annotate the queryset with the 'total_in_stock' quantity
 | 
			
		||||
        # This is the 'in_stock' quantity summed with the 'variant_stock' quantity
 | 
			
		||||
        queryset = queryset.annotate(
 | 
			
		||||
            total_in_stock=ExpressionWrapper(
 | 
			
		||||
                F('in_stock') + F('variant_stock'),
 | 
			
		||||
                output_field=models.DecimalField(),
 | 
			
		||||
            )
 | 
			
		||||
        )
 | 
			
		||||
 | 
			
		||||
        # 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'),
 | 
			
		||||
                F('total_in_stock') - F('allocated_to_sales_orders') - F('allocated_to_build_orders'),
 | 
			
		||||
                output_field=models.DecimalField(),
 | 
			
		||||
            )
 | 
			
		||||
        )
 | 
			
		||||
@@ -579,6 +589,7 @@ class PartSerializer(RemoteImageMixin, InvenTreeModelSerializer):
 | 
			
		||||
    building = serializers.FloatField(read_only=True)
 | 
			
		||||
    in_stock = serializers.FloatField(read_only=True)
 | 
			
		||||
    variant_stock = serializers.FloatField(read_only=True)
 | 
			
		||||
    total_in_stock = serializers.FloatField(read_only=True)
 | 
			
		||||
    ordering = serializers.FloatField(read_only=True)
 | 
			
		||||
    stock_item_count = serializers.IntegerField(read_only=True)
 | 
			
		||||
    suppliers = serializers.IntegerField(read_only=True)
 | 
			
		||||
 
 | 
			
		||||
@@ -215,7 +215,7 @@
 | 
			
		||||
        </tr>
 | 
			
		||||
        {% endif %}
 | 
			
		||||
        {% if part.component %}
 | 
			
		||||
        {% if required_build_order_quantity > 0 %}
 | 
			
		||||
        {% if required_build_order_quantity > 0 or allocated_build_order_quantity > 0 %}
 | 
			
		||||
        <tr>
 | 
			
		||||
            <td><span class='fas fa-tools'></span></td>
 | 
			
		||||
            <td>{% trans "Allocated to Build Orders" %}</td>
 | 
			
		||||
@@ -224,7 +224,7 @@
 | 
			
		||||
        {% endif %}
 | 
			
		||||
        {% endif %}
 | 
			
		||||
        {% if part.salable %}
 | 
			
		||||
        {% if required_sales_order_quantity > 0 %}
 | 
			
		||||
        {% if required_sales_order_quantity > 0 or allocated_sales_order_quantity > 0 %}
 | 
			
		||||
        <tr>
 | 
			
		||||
            <td><span class='fas fa-truck'></span></td>
 | 
			
		||||
            <td>{% trans "Allocated to Sales Orders" %}</td>
 | 
			
		||||
 
 | 
			
		||||
@@ -404,7 +404,10 @@ def progress_bar(val, max_val, *args, **kwargs):
 | 
			
		||||
    else:
 | 
			
		||||
        style = ''
 | 
			
		||||
 | 
			
		||||
    percent = float(val / max_val) * 100
 | 
			
		||||
    if max_val != 0:
 | 
			
		||||
        percent = float(val / max_val) * 100
 | 
			
		||||
    else:
 | 
			
		||||
        percent = 0
 | 
			
		||||
 | 
			
		||||
    if percent > 100:
 | 
			
		||||
        percent = 100
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user