From 3d2e907d5e67da82ebfabac751deb062398c00ce Mon Sep 17 00:00:00 2001 From: Oliver Walters Date: Tue, 21 Apr 2020 09:15:01 +1000 Subject: [PATCH] Add a 'sales order' view for each part --- .../migrations/0023_auto_20200420_2309.py | 20 +++++++++++ InvenTree/order/models.py | 2 +- InvenTree/part/models.py | 11 ++++++ InvenTree/part/templates/part/orders.html | 10 ++++-- .../part/templates/part/sales_orders.html | 36 +++++++++++++++++++ InvenTree/part/templates/part/tabs.html | 5 +++ InvenTree/part/urls.py | 1 + 7 files changed, 81 insertions(+), 4 deletions(-) create mode 100644 InvenTree/order/migrations/0023_auto_20200420_2309.py create mode 100644 InvenTree/part/templates/part/sales_orders.html diff --git a/InvenTree/order/migrations/0023_auto_20200420_2309.py b/InvenTree/order/migrations/0023_auto_20200420_2309.py new file mode 100644 index 0000000000..32d47f593a --- /dev/null +++ b/InvenTree/order/migrations/0023_auto_20200420_2309.py @@ -0,0 +1,20 @@ +# Generated by Django 3.0.5 on 2020-04-20 23:09 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('part', '0035_auto_20200406_0045'), + ('order', '0022_salesorderlineitem_part'), + ] + + operations = [ + migrations.AlterField( + model_name='salesorderlineitem', + name='part', + field=models.ForeignKey(help_text='Part', limit_choices_to={'salable': True}, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='sales_order_line_items', to='part.Part'), + ), + ] diff --git a/InvenTree/order/models.py b/InvenTree/order/models.py index a01ab0caed..2e5cdc3372 100644 --- a/InvenTree/order/models.py +++ b/InvenTree/order/models.py @@ -370,5 +370,5 @@ class SalesOrderLineItem(OrderLineItem): order = models.ForeignKey(SalesOrder, on_delete=models.CASCADE, related_name='lines', help_text=_('Sales Order')) - part = models.ForeignKey(Part, on_delete=models.SET_NULL, related_name='sales_orders', null=True, help_text=_('Part'), limit_choices_to={'salable': True}) + part = models.ForeignKey(Part, on_delete=models.SET_NULL, related_name='sales_order_line_items', null=True, help_text=_('Part'), limit_choices_to={'salable': True}) diff --git a/InvenTree/part/models.py b/InvenTree/part/models.py index ca5b8f11c2..8405afd972 100644 --- a/InvenTree/part/models.py +++ b/InvenTree/part/models.py @@ -924,6 +924,17 @@ class Part(models.Model): return n + def sales_orders(self): + """ Return a list of sales orders which reference this part """ + + orders = [] + + for line in self.sales_order_line_items.all().prefetch_related('order'): + if line.order not in orders: + orders.append(line.order) + + return orders + def purchase_orders(self): """ Return a list of purchase orders which reference this part """ diff --git a/InvenTree/part/templates/part/orders.html b/InvenTree/part/templates/part/orders.html index d53c6ca04f..82f759b82c 100644 --- a/InvenTree/part/templates/part/orders.html +++ b/InvenTree/part/templates/part/orders.html @@ -1,16 +1,17 @@ {% extends "part/part_base.html" %} {% load static %} +{% load i18n %} {% block details %} {% include 'part/tabs.html' with tab='orders' %} -

Part Orders

+

{% trans "Purchase Orders" %}


- +
@@ -27,7 +28,10 @@ {{ block.super }} loadPurchaseOrderTable($("#purchase-order-table"), { - url: "{% url 'api-po-list' %}?part={{ part.id }}", + url: "{% url 'api-po-list' %}", + params: { + part: {{ part.id }}, + }, }); $("#part-order2").click(function() { diff --git a/InvenTree/part/templates/part/sales_orders.html b/InvenTree/part/templates/part/sales_orders.html new file mode 100644 index 0000000000..3878dbee34 --- /dev/null +++ b/InvenTree/part/templates/part/sales_orders.html @@ -0,0 +1,36 @@ +{% extends "part/part_base.html" %} +{% load static %} +{% load i18n %} + +{% block details %} + +{% include 'part/tabs.html' with tab='sales-orders' %} + +

{% trans "Sales Orders" %}

+
+ +
+
+ +
+ +
+
+
+ + +
+ +{% endblock %} + +{% block js_ready %} +{{ block.super }} + +loadSalesOrderTable($("#sales-order-table"), { + url: "{% url 'api-so-list' %}", + params: { + part: {{ part.id }}, + }, +}); + +{% endblock %} diff --git a/InvenTree/part/templates/part/tabs.html b/InvenTree/part/templates/part/tabs.html index b0cf14be5d..0f894a5942 100644 --- a/InvenTree/part/templates/part/tabs.html +++ b/InvenTree/part/templates/part/tabs.html @@ -43,6 +43,11 @@ {% trans "Purchase Orders" %} {{ part.purchase_orders|length }} {% endif %} + {% if part.salable %} + + {% trans "Sales Orders" %} {{ part.sales_orders|length }} + + {% endif %} {% if part.trackable and 0 %} {% trans "Tracking" %} diff --git a/InvenTree/part/urls.py b/InvenTree/part/urls.py index 0d376f8e5b..10db202fb9 100644 --- a/InvenTree/part/urls.py +++ b/InvenTree/part/urls.py @@ -51,6 +51,7 @@ part_detail_urls = [ url(r'^used/?', views.PartDetail.as_view(template_name='part/used_in.html'), name='part-used-in'), url(r'^suppliers/?', views.PartDetail.as_view(template_name='part/supplier.html'), name='part-suppliers'), url(r'^orders/?', views.PartDetail.as_view(template_name='part/orders.html'), name='part-orders'), + url(r'^sales-orders/', views.PartDetail.as_view(template_name='part/sales_orders.html'), name='part-sales-orders'), url(r'^track/?', views.PartDetail.as_view(template_name='part/track.html'), name='part-track'), url(r'^attachments/?', views.PartDetail.as_view(template_name='part/attachments.html'), name='part-attachments'), url(r'^notes/?', views.PartNotes.as_view(), name='part-notes'),