diff --git a/InvenTree/order/models.py b/InvenTree/order/models.py index 684d2b76b4..5443a6ce9f 100644 --- a/InvenTree/order/models.py +++ b/InvenTree/order/models.py @@ -822,14 +822,24 @@ class PurchaseOrderLineItem(OrderLineItem): """ - @staticmethod - def get_api_url(): - return reverse('api-po-line-list') - class Meta: unique_together = ( ('order', 'part', 'quantity', 'purchase_price') ) + + + @staticmethod + def get_api_url(): + return reverse('api-po-line-list') + + def clean(self): + + if self.order.supplier and self.part: + # Supplier part *must* point to the same supplier! + if self.part.supplier != self.order.supplier: + raise ValidationError({ + 'part': _('Supplier part must match supplier') + }) def __str__(self): return "{n} x {part} from {supplier} (for {po})".format( diff --git a/InvenTree/templates/js/translated/forms.js b/InvenTree/templates/js/translated/forms.js index 50ae39df2f..2f2d1f8ae4 100644 --- a/InvenTree/templates/js/translated/forms.js +++ b/InvenTree/templates/js/translated/forms.js @@ -1734,6 +1734,9 @@ function renderModelData(name, model, data, parameters, options) { case 'partparametertemplate': renderer = renderPartParameterTemplate; break; + case 'purchaseorder': + renderer = renderPurchaseOrder; + break; case 'salesorder': renderer = renderSalesOrder; break; diff --git a/InvenTree/templates/js/translated/model_renderers.js b/InvenTree/templates/js/translated/model_renderers.js index 710f67ad67..ee4c4cb5ef 100644 --- a/InvenTree/templates/js/translated/model_renderers.js +++ b/InvenTree/templates/js/translated/model_renderers.js @@ -221,20 +221,54 @@ function renderOwner(name, data, parameters, options) { } -// Renderer for "SalesOrder" model +// Renderer for "PurchaseOrder" model // eslint-disable-next-line no-unused-vars -function renderSalesOrder(name, data, parameters, options) { - var html = `${data.reference}`; +function renderPurchaseOrder(name, data, parameters, options) { + var html = ''; + + var prefix = global_settings.PURCHASEORDER_REFERENCE_PREFIX; + + var thumbnail = null; + + html += `${prefix}${data.reference}`; + + if (data.supplier_detail) { + thumbnail = data.supplier_detail.thumbnail || data.supplier_detail.image; + + html += ' - ' + select2Thumbnail(thumbnail); + html += `${data.supplier_detail.name}`; + } if (data.description) { - html += ` - ${data.description}`; + html += ` - ${data.description}`; } html += ` {% trans "Order ID" %}: ${data.pk} - + + + `; + + return html; +} + + +// Renderer for "SalesOrder" model +// eslint-disable-next-line no-unused-vars +function renderSalesOrder(name, data, parameters, options) { + var html = `${data.reference}`; + + if (data.description) { + html += ` - ${data.description}`; + } + + html += ` + + + {% trans "Order ID" %}: ${data.pk} + `; return html;