diff --git a/InvenTree/InvenTree/status_codes.py b/InvenTree/InvenTree/status_codes.py index 2082eac70b..f8089cb5de 100644 --- a/InvenTree/InvenTree/status_codes.py +++ b/InvenTree/InvenTree/status_codes.py @@ -147,6 +147,11 @@ class SalesOrderStatus(StatusCode): RETURNED: 'yellow', } + # Open orders + OPEN = [ + PENDING, + ] + class StockStatus(StatusCode): diff --git a/InvenTree/company/templates/company/assigned_stock.html b/InvenTree/company/templates/company/assigned_stock.html new file mode 100644 index 0000000000..53bc79b054 --- /dev/null +++ b/InvenTree/company/templates/company/assigned_stock.html @@ -0,0 +1,29 @@ +{% extends "company/company_base.html" %} +{% load static %} +{% load i18n %} + +{% block details %} + +{% include "company/tabs.html" with tab="assigned" %} + +

{% trans "Assigned Stock" %}

+
+ +
+ +{% endblock %} + +{% block js_ready %} +{{ block.super }} + +loadStockTable($("#stock-table"), { + params: { + test: 7, + customer: {{ company.id }}, + part_detail: true, + location_detail: true, + }, + url: "{% url 'api-stock-list' %}", +}); + +{% endblock %} \ No newline at end of file diff --git a/InvenTree/company/templates/company/tabs.html b/InvenTree/company/templates/company/tabs.html index 9fd00ceb11..ebd646b741 100644 --- a/InvenTree/company/templates/company/tabs.html +++ b/InvenTree/company/templates/company/tabs.html @@ -21,6 +21,13 @@ {% trans "Sales Orders" %} {{ company.sales_orders.count }} + + {% trans "Assigned Stock" %} + + {{ company.assigned_stock.count }} + + + {% endif %} {% trans "Notes" %}{% if company.notes %} {% endif %} diff --git a/InvenTree/company/urls.py b/InvenTree/company/urls.py index af8e1846e1..f5fbeede47 100644 --- a/InvenTree/company/urls.py +++ b/InvenTree/company/urls.py @@ -13,13 +13,14 @@ company_detail_urls = [ # url(r'orders/?', views.CompanyDetail.as_view(template_name='company/orders.html'), name='company-detail-orders'), - url(r'parts/', views.CompanyDetail.as_view(template_name='company/detail_part.html'), name='company-detail-parts'), - url(r'stock/?', views.CompanyDetail.as_view(template_name='company/detail_stock.html'), name='company-detail-stock'), - url(r'purchase-orders/?', views.CompanyDetail.as_view(template_name='company/purchase_orders.html'), name='company-detail-purchase-orders'), - url(r'sales-orders/?', views.CompanyDetail.as_view(template_name='company/sales_orders.html'), name='company-detail-sales-orders'), - url(r'notes/?', views.CompanyNotes.as_view(), name='company-notes'), + url(r'^parts/', views.CompanyDetail.as_view(template_name='company/detail_part.html'), name='company-detail-parts'), + url(r'^stock/', views.CompanyDetail.as_view(template_name='company/detail_stock.html'), name='company-detail-stock'), + url(r'^purchase-orders/', views.CompanyDetail.as_view(template_name='company/purchase_orders.html'), name='company-detail-purchase-orders'), + url(r'^assigned-stock/', views.CompanyDetail.as_view(template_name='company/assigned_stock.html'), name='company-detail-assigned-stock'), + url(r'^sales-orders/', views.CompanyDetail.as_view(template_name='company/sales_orders.html'), name='company-detail-sales-orders'), + url(r'^notes/', views.CompanyNotes.as_view(), name='company-notes'), - url(r'thumbnail/?', views.CompanyImage.as_view(), name='company-image'), + url(r'^thumbnail/', views.CompanyImage.as_view(), name='company-image'), # Any other URL url(r'^.*$', views.CompanyDetail.as_view(), name='company-detail'), diff --git a/InvenTree/order/api.py b/InvenTree/order/api.py index dba493baab..a7915878c5 100644 --- a/InvenTree/order/api.py +++ b/InvenTree/order/api.py @@ -13,6 +13,7 @@ from django.conf.urls import url, include from InvenTree.helpers import str2bool from InvenTree.api import AttachmentMixin +from InvenTree.status_codes import PurchaseOrderStatus, SalesOrderStatus from part.models import Part from company.models import SupplierPart @@ -68,6 +69,17 @@ class POList(generics.ListCreateAPIView): params = self.request.query_params + # Filter by 'outstanding' status + outstanding = params.get('outstanding', None) + + if outstanding is not None: + outstanding = str2bool(outstanding) + + if outstanding: + queryset = queryset.filter(status__in=PurchaseOrderStatus.OPEN) + else: + queryset = queryset.exclude(status__in=PurchaseOrderStatus.OPEN) + # Special filtering for 'status' field status = params.get('status', None) @@ -259,6 +271,17 @@ class SOList(generics.ListCreateAPIView): params = self.request.query_params + # Filter by 'outstanding' status + outstanding = params.get('outstanding', None) + + if outstanding is not None: + outstanding = str2bool(outstanding) + + if outstanding: + queryset = queryset.filter(status__in=SalesOrderStatus.OPEN) + else: + queryset = queryset.exclude(status__in=SalesOrderStatus.OPEN) + status = params.get('status', None) if status is not None: diff --git a/InvenTree/stock/api.py b/InvenTree/stock/api.py index 23d836b1e1..018b588c1f 100644 --- a/InvenTree/stock/api.py +++ b/InvenTree/stock/api.py @@ -471,6 +471,12 @@ class StockList(generics.ListCreateAPIView): if sales_order: queryset = queryset.filter(sales_order=sales_order) + # Filter by customer + customer = params.get('customer', None) + + if customer: + queryset = queryset.filter(customer=customer) + # Filter by "serialized" status? serialized = params.get('serialized', None) diff --git a/InvenTree/stock/models.py b/InvenTree/stock/models.py index e59af0e2e9..736e2218bf 100644 --- a/InvenTree/stock/models.py +++ b/InvenTree/stock/models.py @@ -140,6 +140,7 @@ class StockItem(MPTTModel): sales_order=None, build_order=None, belongs_to=None, + status__in=StockStatus.AVAILABLE_CODES ) def save(self, *args, **kwargs): diff --git a/InvenTree/templates/js/stock.html b/InvenTree/templates/js/stock.html index c0737dc250..14be8d9afe 100644 --- a/InvenTree/templates/js/stock.html +++ b/InvenTree/templates/js/stock.html @@ -351,8 +351,6 @@ function loadStockTable(table, options) { loc = "{% trans "Undefined location" %}"; } - console.log("Location: " + loc); - if (!locations.includes(loc)) { locations.push(loc); } diff --git a/InvenTree/templates/js/table_filters.html b/InvenTree/templates/js/table_filters.html index 298a034517..bec29b0487 100644 --- a/InvenTree/templates/js/table_filters.html +++ b/InvenTree/templates/js/table_filters.html @@ -78,11 +78,16 @@ function getAvailableTableFilters(tableKey) { // Filters for the "Order" table if (tableKey == "purchaseorder") { + return { status: { title: '{% trans "Order status" %}', options: purchaseOrderCodes, }, + outstanding: { + type: 'bool', + title: '{% trans "Outstanding" %}', + }, }; } @@ -92,6 +97,10 @@ function getAvailableTableFilters(tableKey) { title: '{% trans "Order status" %}', options: salesOrderCodes, }, + outstanding: { + type: 'bool', + title: '{% trans "Outstanding" %}', + }, }; }