diff --git a/InvenTree/InvenTree/helpers.py b/InvenTree/InvenTree/helpers.py index 9d00697230..330bd2bb68 100644 --- a/InvenTree/InvenTree/helpers.py +++ b/InvenTree/InvenTree/helpers.py @@ -21,6 +21,9 @@ import InvenTree.version from common.models import InvenTreeSetting from .settings import MEDIA_URL, STATIC_URL +from common.settings import currency_code_default + +from djmoney.money import Money def getSetting(key, backup_value=None): @@ -247,6 +250,22 @@ def decimal2string(d): return s.rstrip("0").rstrip(".") +def decimal2money(d, currency=None): + """ + Format a Decimal number as Money + + Args: + d: A python Decimal object + currency: Currency of the input amount, defaults to default currency in settings + + Returns: + A Money object from the input(s) + """ + if not currency: + currency = currency_code_default() + return Money(d, currency) + + def WrapWithQuotes(text, quote='"'): """ Wrap the supplied text with quotes diff --git a/InvenTree/part/models.py b/InvenTree/part/models.py index 2b97fde596..9f4da436df 100644 --- a/InvenTree/part/models.py +++ b/InvenTree/part/models.py @@ -39,7 +39,7 @@ from InvenTree import helpers from InvenTree import validators from InvenTree.models import InvenTreeTree, InvenTreeAttachment from InvenTree.fields import InvenTreeURLField -from InvenTree.helpers import decimal2string, normalize +from InvenTree.helpers import decimal2string, normalize, decimal2money from InvenTree.status_codes import BuildStatus, PurchaseOrderStatus, SalesOrderStatus @@ -2414,7 +2414,7 @@ class BomItem(models.Model): return "{n} x {child} to make {parent}".format( parent=self.part.full_name, child=self.sub_part.full_name, - n=helpers.decimal2string(self.quantity)) + n=decimal2string(self.quantity)) def available_stock(self): """ @@ -2498,12 +2498,12 @@ class BomItem(models.Model): return required @property - def price_range(self): + def price_range(self, internal=False): """ Return the price-range for this BOM item. """ # get internal price setting use_internal = common.models.InvenTreeSetting.get_setting('PART_BOM_USE_INTERNAL_PRICE', False) - prange = self.sub_part.get_price_range(self.quantity, intenal=use_internal) + prange = self.sub_part.get_price_range(self.quantity, internal=use_internal and internal) if prange is None: return prange @@ -2511,11 +2511,11 @@ class BomItem(models.Model): pmin, pmax = prange if pmin == pmax: - return decimal2string(pmin) + return decimal2money(pmin) # Convert to better string representation - pmin = decimal2string(pmin) - pmax = decimal2string(pmax) + pmin = decimal2money(pmin) + pmax = decimal2money(pmax) return "{pmin} to {pmax}".format(pmin=pmin, pmax=pmax) diff --git a/InvenTree/part/serializers.py b/InvenTree/part/serializers.py index 6c47f1310f..2da2d05d3b 100644 --- a/InvenTree/part/serializers.py +++ b/InvenTree/part/serializers.py @@ -377,7 +377,7 @@ class PartStarSerializer(InvenTreeModelSerializer): class BomItemSerializer(InvenTreeModelSerializer): """ Serializer for BomItem object """ - # price_range = serializers.CharField(read_only=True) + price_range = serializers.CharField(read_only=True) quantity = serializers.FloatField() @@ -492,7 +492,7 @@ class BomItemSerializer(InvenTreeModelSerializer): 'reference', 'sub_part', 'sub_part_detail', - # 'price_range', + 'price_range', 'validated', ] diff --git a/InvenTree/templates/js/bom.js b/InvenTree/templates/js/bom.js index 7328bcb331..665379d8d5 100644 --- a/InvenTree/templates/js/bom.js +++ b/InvenTree/templates/js/bom.js @@ -259,26 +259,19 @@ function loadBomTable(table, options) { sortable: true, }); - /* - - // TODO - Re-introduce the pricing column at a later stage, - // once the pricing has been "fixed" - // O.W. 2020-11-24 - cols.push( { field: 'price_range', - title: '{% trans "Price" %}', + title: '{% trans "Buy Price" %}', sortable: true, formatter: function(value, row, index, field) { if (value) { return value; } else { - return "{% trans "No pricing available" %}"; + return "{% trans 'No pricing available' %}"; } } }); - */ cols.push({ field: 'optional',