mirror of
https://github.com/inventree/InvenTree
synced 2024-08-30 18:33:04 +00:00
Merge pull request #3028 from maksimstojkovic/automatic-shipment-creation
[Feature] Create a default shipment when creating SO
This commit is contained in:
commit
0c02e57b58
@ -1111,6 +1111,13 @@ class InvenTreeSetting(BaseInvenTreeSetting):
|
|||||||
'default': 'SO',
|
'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': {
|
'PURCHASEORDER_REFERENCE_PREFIX': {
|
||||||
'name': _('Purchase Order Reference Prefix'),
|
'name': _('Purchase Order Reference Prefix'),
|
||||||
'description': _('Prefix value for purchase order reference'),
|
'description': _('Prefix value for purchase order reference'),
|
||||||
|
@ -12,6 +12,8 @@ from decimal import Decimal
|
|||||||
from django.db import models, transaction
|
from django.db import models, transaction
|
||||||
from django.db.models import Q, F, Sum
|
from django.db.models import Q, F, Sum
|
||||||
from django.db.models.functions import Coalesce
|
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.validators import MinValueValidator
|
||||||
from django.core.exceptions import ValidationError
|
from django.core.exceptions import ValidationError
|
||||||
@ -809,6 +811,21 @@ class SalesOrder(Order):
|
|||||||
return self.pending_shipments().count()
|
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):
|
class PurchaseOrderAttachment(InvenTreeAttachment):
|
||||||
"""
|
"""
|
||||||
Model for storing file attachments against a PurchaseOrder object
|
Model for storing file attachments against a PurchaseOrder object
|
||||||
|
@ -10,6 +10,8 @@ from company.models import Company
|
|||||||
|
|
||||||
from InvenTree import status_codes as status
|
from InvenTree import status_codes as status
|
||||||
|
|
||||||
|
from common.models import InvenTreeSetting
|
||||||
|
|
||||||
from order.models import SalesOrder, SalesOrderLineItem, SalesOrderAllocation, SalesOrderShipment
|
from order.models import SalesOrder, SalesOrderLineItem, SalesOrderAllocation, SalesOrderShipment
|
||||||
|
|
||||||
from part.models import Part
|
from part.models import Part
|
||||||
@ -200,3 +202,37 @@ class SalesOrderTest(TestCase):
|
|||||||
self.assertTrue(self.line.is_fully_allocated())
|
self.assertTrue(self.line.is_fully_allocated())
|
||||||
self.assertEqual(self.line.fulfilled_quantity(), 50)
|
self.assertEqual(self.line.fulfilled_quantity(), 50)
|
||||||
self.assertEqual(self.line.allocated_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)
|
||||||
|
@ -12,6 +12,7 @@
|
|||||||
<table class='table table-striped table-condensed'>
|
<table class='table table-striped table-condensed'>
|
||||||
<tbody>
|
<tbody>
|
||||||
{% include "InvenTree/settings/setting.html" with key="SALESORDER_REFERENCE_PREFIX" %}
|
{% include "InvenTree/settings/setting.html" with key="SALESORDER_REFERENCE_PREFIX" %}
|
||||||
|
{% include "InvenTree/settings/setting.html" with key="SALESORDER_DEFAULT_SHIPMENT" icon="fa-truck-loading" %}
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user