feat(sales_order): Stock Items show the PO number

Stock items show the PO number that they were purchased on when being
viewed in the sales order allocation modal and when viewing the sales
order details.
This commit is contained in:
Nigel 2021-04-15 15:21:13 -06:00
parent a1fa3315b1
commit bca2f4a07b
No known key found for this signature in database
GPG Key ID: 3AB9572E33E501E6
5 changed files with 39 additions and 3 deletions

View File

@ -826,6 +826,9 @@ class SalesOrderAllocation(models.Model):
else:
return ""
def get_po(self):
return self.item.purchase_order
def complete_allocation(self, user):
"""
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_id = serializers.IntegerField(source='get_location')
serial = serializers.CharField(source='get_serial')
po = serializers.CharField(source='get_po')
quantity = serializers.FloatField()
class Meta:
@ -247,6 +248,7 @@ class SalesOrderAllocationSerializer(InvenTreeModelSerializer):
'quantity',
'location_id',
'location_path',
'po',
'item',
]

View File

@ -87,6 +87,9 @@ function showAllocationSubTable(index, row, element) {
return renderLink(row.location_path, `/stock/location/${row.location_id}/`);
},
},
{
field: 'po'
},
{
field: 'buttons',
title: '{% trans "Actions" %}',
@ -159,9 +162,12 @@ function showFulfilledSubTable(index, row, element) {
text = `{% trans "Quantity" %}: ${row.quantity}`;
}
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',
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 %}
{
field: 'buttons',

View File

@ -90,7 +90,7 @@ class SalesOrderDetail(InvenTreeRoleMixin, DetailView):
""" Detail view for a SalesOrder object """
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'

View File

@ -1370,6 +1370,12 @@ class StockItem(MPTTModel):
if self.location:
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
@transaction.atomic