2
0
mirror of https://github.com/inventree/InvenTree.git synced 2025-04-29 20:16:44 +00:00

Merge pull request #1465 from nwns/feature/po_on_sales_order

Show PO for Stock Items on Sales Order Detail and stock
This commit is contained in:
Oliver 2021-05-15 07:49:59 +10:00 committed by GitHub
commit 6f10195f8c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 39 additions and 3 deletions

View File

@ -826,6 +826,9 @@ class SalesOrderAllocation(models.Model):
else: else:
return "" return ""
def get_po(self):
return self.item.purchase_order
def complete_allocation(self, user): def complete_allocation(self, user):
""" """
Complete this allocation (called when the parent SalesOrder is marked as "shipped"): Complete this allocation (called when the parent SalesOrder is marked as "shipped"):

View File

@ -235,6 +235,7 @@ class SalesOrderAllocationSerializer(InvenTreeModelSerializer):
location_path = serializers.CharField(source='get_location_path') location_path = serializers.CharField(source='get_location_path')
location_id = serializers.IntegerField(source='get_location') location_id = serializers.IntegerField(source='get_location')
serial = serializers.CharField(source='get_serial') serial = serializers.CharField(source='get_serial')
po = serializers.CharField(source='get_po')
quantity = serializers.FloatField() quantity = serializers.FloatField()
class Meta: class Meta:
@ -247,6 +248,7 @@ class SalesOrderAllocationSerializer(InvenTreeModelSerializer):
'quantity', 'quantity',
'location_id', 'location_id',
'location_path', 'location_path',
'po',
'item', 'item',
] ]

View File

@ -87,6 +87,9 @@ function showAllocationSubTable(index, row, element) {
return renderLink(row.location_path, `/stock/location/${row.location_id}/`); return renderLink(row.location_path, `/stock/location/${row.location_id}/`);
}, },
}, },
{
field: 'po'
},
{ {
field: 'buttons', field: 'buttons',
title: '{% trans "Actions" %}', title: '{% trans "Actions" %}',
@ -161,7 +164,10 @@ function showFulfilledSubTable(index, row, element) {
return renderLink(text, `/stock/item/${row.pk}/`); return renderLink(text, `/stock/item/${row.pk}/`);
}, },
} },
{
field: 'po'
},
], ],
}); });
} }
@ -271,6 +277,25 @@ $("#so-lines-table").inventreeTable({
field: 'notes', field: 'notes',
title: '{% trans "Notes" %}', title: '{% trans "Notes" %}',
}, },
{
field: 'po',
title: '{% trans "PO" %}',
formatter: function(value, row, index, field) {
var po_name = "";
if (row.allocated) {
row.allocations.forEach(function(allocation) {
if (allocation.po != po_name) {
if (po_name) {
po_name = "-";
} else {
po_name = allocation.po
}
}
})
}
return `<div>` + po_name + `</div>`;
}
},
{% if order.status == SalesOrderStatus.PENDING %} {% if order.status == SalesOrderStatus.PENDING %}
{ {
field: 'buttons', field: 'buttons',

View File

@ -90,7 +90,7 @@ class SalesOrderDetail(InvenTreeRoleMixin, DetailView):
""" Detail view for a SalesOrder object """ """ Detail view for a SalesOrder object """
context_object_name = 'order' context_object_name = 'order'
queryset = SalesOrder.objects.all().prefetch_related('lines') queryset = SalesOrder.objects.all().prefetch_related('lines__allocations__item__purchase_order')
template_name = 'order/sales_order_detail.html' template_name = 'order/sales_order_detail.html'

View File

@ -1370,6 +1370,12 @@ class StockItem(MPTTModel):
if self.location: if self.location:
s += ' @ {loc}'.format(loc=self.location.name) s += ' @ {loc}'.format(loc=self.location.name)
if self.purchase_order:
s += " ({pre}{po})".format(
pre=helpers.getSetting("PURCHASEORDER_REFERENCE_PREFIX"),
po=self.purchase_order,
)
return s return s
@transaction.atomic @transaction.atomic