From c7003fbed85c864177cd3472ac6b7e14e214b433 Mon Sep 17 00:00:00 2001 From: Maksim Stojkovic <18454392+maksimstojkovic@users.noreply.github.com> Date: Wed, 18 May 2022 22:01:47 +1000 Subject: [PATCH 1/6] Create a default shipment when creating SO --- InvenTree/templates/js/translated/order.js | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/InvenTree/templates/js/translated/order.js b/InvenTree/templates/js/translated/order.js index e2bee865fd..35bd791382 100644 --- a/InvenTree/templates/js/translated/order.js +++ b/InvenTree/templates/js/translated/order.js @@ -362,6 +362,17 @@ function createSalesOrder(options={}) { } }, onSuccess: function(data) { + inventreePut( + '{% url "api-so-shipment-list" %}', + { + order: data.pk, + reference: 1 + }, + { + method: 'POST' + } + ); + location.href = `/order/sales-order/${data.pk}/`; }, title: '{% trans "Create Sales Order" %}', From 9ae8a6b21925318fc525b0674b208e8afcd31a1a Mon Sep 17 00:00:00 2001 From: Maksim Stojkovic <18454392+maksimstojkovic@users.noreply.github.com> Date: Wed, 18 May 2022 23:43:06 +1000 Subject: [PATCH 2/6] Revert "Create a default shipment when creating SO" This reverts commit c7003fbed85c864177cd3472ac6b7e14e214b433. --- InvenTree/templates/js/translated/order.js | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/InvenTree/templates/js/translated/order.js b/InvenTree/templates/js/translated/order.js index 35bd791382..e2bee865fd 100644 --- a/InvenTree/templates/js/translated/order.js +++ b/InvenTree/templates/js/translated/order.js @@ -362,17 +362,6 @@ function createSalesOrder(options={}) { } }, onSuccess: function(data) { - inventreePut( - '{% url "api-so-shipment-list" %}', - { - order: data.pk, - reference: 1 - }, - { - method: 'POST' - } - ); - location.href = `/order/sales-order/${data.pk}/`; }, title: '{% trans "Create Sales Order" %}', From 2cf67ea0c977fdaae0b2cbd0eaec076e7585455f Mon Sep 17 00:00:00 2001 From: Maksim Stojkovic <18454392+maksimstojkovic@users.noreply.github.com> Date: Thu, 19 May 2022 00:10:55 +1000 Subject: [PATCH 3/6] Create default shipment in backend --- InvenTree/common/models.py | 7 +++++++ InvenTree/order/models.py | 16 ++++++++++++++++ InvenTree/templates/InvenTree/settings/so.html | 1 + 3 files changed, 24 insertions(+) diff --git a/InvenTree/common/models.py b/InvenTree/common/models.py index 83773fe48a..0ef766d19d 100644 --- a/InvenTree/common/models.py +++ b/InvenTree/common/models.py @@ -1111,6 +1111,13 @@ class InvenTreeSetting(BaseInvenTreeSetting): 'default': 'SO', }, + 'SALESORDER_DEFAULT_SHIPMENT': { + 'name': _('Sales Order Default Shipment'), + 'description': _('Enable creation of default shipment with sales orders'), + 'default': False, + 'validator': bool, + }, + 'PURCHASEORDER_REFERENCE_PREFIX': { 'name': _('Purchase Order Reference Prefix'), 'description': _('Prefix value for purchase order reference'), diff --git a/InvenTree/order/models.py b/InvenTree/order/models.py index 7460e81e56..58f4fd5c2f 100644 --- a/InvenTree/order/models.py +++ b/InvenTree/order/models.py @@ -12,6 +12,8 @@ from decimal import Decimal from django.db import models, transaction from django.db.models import Q, F, Sum from django.db.models.functions import Coalesce +from django.db.models.signals import post_save +from django.dispatch.dispatcher import receiver from django.core.validators import MinValueValidator from django.core.exceptions import ValidationError @@ -808,6 +810,20 @@ class SalesOrder(Order): def pending_shipment_count(self): return self.pending_shipments().count() +@receiver(post_save, sender=SalesOrder, dispatch_uid='build_post_save_log') +def after_save_sales_order(sender, instance: SalesOrder, created: bool, **kwargs): + """ + Callback function to be executed after a SalesOrder instance is saved + """ + if created and getSetting('SALESORDER_DEFAULT_SHIPMENT'): + # A new SalesOrder has just been created + + # Create default shipment + SalesOrderShipment.objects.create( + order=instance, + reference='1', + ) + class PurchaseOrderAttachment(InvenTreeAttachment): """ diff --git a/InvenTree/templates/InvenTree/settings/so.html b/InvenTree/templates/InvenTree/settings/so.html index e6fde3a093..ac84f5fa86 100644 --- a/InvenTree/templates/InvenTree/settings/so.html +++ b/InvenTree/templates/InvenTree/settings/so.html @@ -12,6 +12,7 @@ {% include "InvenTree/settings/setting.html" with key="SALESORDER_REFERENCE_PREFIX" %} + {% include "InvenTree/settings/setting.html" with key="SALESORDER_DEFAULT_SHIPMENT" icon="fa-truck-loading" %}
From 276075ce0508b3f6dfb35a9df41f3094966fb8aa Mon Sep 17 00:00:00 2001 From: Maksim Stojkovic <18454392+maksimstojkovic@users.noreply.github.com> Date: Thu, 19 May 2022 00:33:03 +1000 Subject: [PATCH 4/6] PEP styling --- InvenTree/common/models.py | 2 +- InvenTree/order/models.py | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/InvenTree/common/models.py b/InvenTree/common/models.py index 0ef766d19d..92e5c1522c 100644 --- a/InvenTree/common/models.py +++ b/InvenTree/common/models.py @@ -1117,7 +1117,7 @@ class InvenTreeSetting(BaseInvenTreeSetting): 'default': False, 'validator': bool, }, - + 'PURCHASEORDER_REFERENCE_PREFIX': { 'name': _('Purchase Order Reference Prefix'), 'description': _('Prefix value for purchase order reference'), diff --git a/InvenTree/order/models.py b/InvenTree/order/models.py index 58f4fd5c2f..f4688f3736 100644 --- a/InvenTree/order/models.py +++ b/InvenTree/order/models.py @@ -810,6 +810,7 @@ class SalesOrder(Order): def pending_shipment_count(self): return self.pending_shipments().count() + @receiver(post_save, sender=SalesOrder, dispatch_uid='build_post_save_log') def after_save_sales_order(sender, instance: SalesOrder, created: bool, **kwargs): """ From 4dc997c4aecbfd6fd7ab5db8944bbbb50c30c2f7 Mon Sep 17 00:00:00 2001 From: Maksim Stojkovic <18454392+maksimstojkovic@users.noreply.github.com> Date: Thu, 19 May 2022 02:06:43 +1000 Subject: [PATCH 5/6] Added unit test --- InvenTree/order/test_sales_order.py | 37 +++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/InvenTree/order/test_sales_order.py b/InvenTree/order/test_sales_order.py index d43c94996c..954fecf2fe 100644 --- a/InvenTree/order/test_sales_order.py +++ b/InvenTree/order/test_sales_order.py @@ -10,6 +10,8 @@ from company.models import Company from InvenTree import status_codes as status +from common.models import InvenTreeSetting + from order.models import SalesOrder, SalesOrderLineItem, SalesOrderAllocation, SalesOrderShipment from part.models import Part @@ -200,3 +202,38 @@ class SalesOrderTest(TestCase): self.assertTrue(self.line.is_fully_allocated()) self.assertEqual(self.line.fulfilled_quantity(), 50) self.assertEqual(self.line.allocated_quantity(), 50) + + def test_default_shipment(self): + # Test sales order default shipment creation + + # Default setting value should be False + self.assertEqual(False, InvenTreeSetting.get_setting('SALESORDER_DEFAULT_SHIPMENT')) + + # Create an order + order_1 = SalesOrder.objects.create( + customer=self.customer, + reference='1235', + customer_reference='ABC 55556' + ) + + # Order should have no shipments when setting is False + self.assertEqual(0, order_1.shipment_count) + + # Update setting to True + InvenTreeSetting.set_setting('SALESORDER_DEFAULT_SHIPMENT', True, None) + self.assertEqual(True, InvenTreeSetting.get_setting('SALESORDER_DEFAULT_SHIPMENT')) + + # Create a second order + order_2 = SalesOrder.objects.create( + customer=self.customer, + reference='1236', + customer_reference='ABC 55557' + ) + + # Order should have one shipment + self.assertEqual(1, order_2.shipment_count) + self.assertEqual(1, order_2.pending_shipments().count()) + + # Shipment should have default reference of '1' + self.assertEqual('1', order_2.pending_shipments()[0].reference) + \ No newline at end of file From 140006a4cdefefdb37eb9a6f1b6293fb2c4e2a1b Mon Sep 17 00:00:00 2001 From: Maksim Stojkovic <18454392+maksimstojkovic@users.noreply.github.com> Date: Thu, 19 May 2022 12:19:55 +1000 Subject: [PATCH 6/6] Fix PEP styles --- InvenTree/order/test_sales_order.py | 1 - 1 file changed, 1 deletion(-) diff --git a/InvenTree/order/test_sales_order.py b/InvenTree/order/test_sales_order.py index 954fecf2fe..cbd572e24d 100644 --- a/InvenTree/order/test_sales_order.py +++ b/InvenTree/order/test_sales_order.py @@ -236,4 +236,3 @@ class SalesOrderTest(TestCase): # Shipment should have default reference of '1' self.assertEqual('1', order_2.pending_shipments()[0].reference) - \ No newline at end of file