diff --git a/InvenTree/InvenTree/fields.py b/InvenTree/InvenTree/fields.py
index 7a2fa4b89a..b3393ef1eb 100644
--- a/InvenTree/InvenTree/fields.py
+++ b/InvenTree/InvenTree/fields.py
@@ -8,6 +8,8 @@ from .validators import allowable_url_schemes
from django.forms.fields import URLField as FormURLField
from django.db import models as models
from django.core import validators
+from django import forms
+from decimal import Decimal
class InvenTreeURLFormField(FormURLField):
@@ -25,3 +27,33 @@ class InvenTreeURLField(models.URLField):
return super().formfield(**{
'form_class': InvenTreeURLFormField
})
+
+
+def round_decimal(value, places):
+ """
+ Round value to the specified number of places.
+ """
+
+ if value is not None:
+ # see https://docs.python.org/2/library/decimal.html#decimal.Decimal.quantize for options
+ return value.quantize(Decimal(10) ** -places)
+ return value
+
+
+class RoundingDecimalFormField(forms.DecimalField):
+ def to_python(self, value):
+ value = super(RoundingDecimalFormField, self).to_python(value)
+ return round_decimal(value, self.decimal_places)
+
+
+class RoundingDecimalField(models.DecimalField):
+ def to_python(self, value):
+ value = super(RoundingDecimalField, self).to_python(value)
+ return round_decimal(value, self.decimal_places)
+
+ def formfield(self, **kwargs):
+ defaults = {
+ 'form_class': RoundingDecimalFormField
+ }
+ defaults.update(kwargs)
+ return super(RoundingDecimalField, self).formfield(**kwargs)
diff --git a/InvenTree/InvenTree/static/script/inventree/build.js b/InvenTree/InvenTree/static/script/inventree/build.js
index aa938ecd53..8ec872bbcb 100644
--- a/InvenTree/InvenTree/static/script/inventree/build.js
+++ b/InvenTree/InvenTree/static/script/inventree/build.js
@@ -71,7 +71,7 @@ function loadAllocationTable(table, part_id, part, url, required, button) {
var count = 0;
for (var i = 0; i < results.length; i++) {
- count += results[i].quantity;
+ count += parseFloat(results[i].quantity);
}
updateAllocationTotal(part_id, count, required);
diff --git a/InvenTree/build/templates/build/allocation_item.html b/InvenTree/build/templates/build/allocation_item.html
index 87b6ba1340..0492e44280 100644
--- a/InvenTree/build/templates/build/allocation_item.html
+++ b/InvenTree/build/templates/build/allocation_item.html
@@ -18,7 +18,7 @@
{% decimal item.sub_part.total_stock %}
- {% multiply build.quantity item.quantity %}
+ {% multiply build.quantity item.quantity %}{% if item.overage %} (+ {{ item.overage }}){% endif %}
{% part_allocation_count build item.sub_part %}
diff --git a/InvenTree/company/forms.py b/InvenTree/company/forms.py
index 71b870497a..3190149e24 100644
--- a/InvenTree/company/forms.py
+++ b/InvenTree/company/forms.py
@@ -6,6 +6,7 @@ Django Forms for interacting with Company app
from __future__ import unicode_literals
from InvenTree.forms import HelperForm
+from InvenTree.fields import RoundingDecimalFormField
from .models import Company
from .models import SupplierPart
@@ -64,6 +65,10 @@ class EditSupplierPartForm(HelperForm):
class EditPriceBreakForm(HelperForm):
""" Form for creating / editing a supplier price break """
+ quantity = RoundingDecimalFormField(max_digits=10, decimal_places=5)
+
+ cost = RoundingDecimalFormField(max_digits=10, decimal_places=5)
+
class Meta:
model = SupplierPriceBreak
fields = [
diff --git a/InvenTree/company/migrations/0011_auto_20200318_1114.py b/InvenTree/company/migrations/0011_auto_20200318_1114.py
new file mode 100644
index 0000000000..cbfa73942b
--- /dev/null
+++ b/InvenTree/company/migrations/0011_auto_20200318_1114.py
@@ -0,0 +1,20 @@
+# Generated by Django 2.2.9 on 2020-03-18 11:14
+
+import InvenTree.fields
+import django.core.validators
+from django.db import migrations
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('company', '0010_auto_20200201_1231'),
+ ]
+
+ operations = [
+ migrations.AlterField(
+ model_name='supplierpricebreak',
+ name='cost',
+ field=InvenTree.fields.RoundingDecimalField(decimal_places=5, max_digits=10, validators=[django.core.validators.MinValueValidator(0)]),
+ ),
+ ]
diff --git a/InvenTree/company/migrations/0012_auto_20200318_1114.py b/InvenTree/company/migrations/0012_auto_20200318_1114.py
new file mode 100644
index 0000000000..ff99b91cab
--- /dev/null
+++ b/InvenTree/company/migrations/0012_auto_20200318_1114.py
@@ -0,0 +1,20 @@
+# Generated by Django 2.2.9 on 2020-03-18 11:14
+
+import InvenTree.fields
+import django.core.validators
+from django.db import migrations
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('company', '0011_auto_20200318_1114'),
+ ]
+
+ operations = [
+ migrations.AlterField(
+ model_name='supplierpricebreak',
+ name='quantity',
+ field=InvenTree.fields.RoundingDecimalField(decimal_places=5, default=1, max_digits=15, validators=[django.core.validators.MinValueValidator(1)]),
+ ),
+ ]
diff --git a/InvenTree/company/models.py b/InvenTree/company/models.py
index a5e56f99fb..b079c084fc 100644
--- a/InvenTree/company/models.py
+++ b/InvenTree/company/models.py
@@ -21,7 +21,7 @@ from django.conf import settings
from markdownx.models import MarkdownxField
-from InvenTree.fields import InvenTreeURLField
+from InvenTree.fields import InvenTreeURLField, RoundingDecimalField
from InvenTree.status_codes import OrderStatus
from common.models import Currency
@@ -381,9 +381,9 @@ class SupplierPriceBreak(models.Model):
part = models.ForeignKey(SupplierPart, on_delete=models.CASCADE, related_name='pricebreaks')
- quantity = models.DecimalField(max_digits=15, decimal_places=5, default=1, validators=[MinValueValidator(1)])
+ quantity = RoundingDecimalField(max_digits=15, decimal_places=5, default=1, validators=[MinValueValidator(1)])
- cost = models.DecimalField(max_digits=10, decimal_places=5, validators=[MinValueValidator(0)])
+ cost = RoundingDecimalField(max_digits=10, decimal_places=5, validators=[MinValueValidator(0)])
currency = models.ForeignKey(Currency, blank=True, null=True, on_delete=models.SET_NULL)
diff --git a/InvenTree/company/templates/company/supplier_part_base.html b/InvenTree/company/templates/company/supplier_part_base.html
index f7e6ce88cc..76f75094f7 100644
--- a/InvenTree/company/templates/company/supplier_part_base.html
+++ b/InvenTree/company/templates/company/supplier_part_base.html
@@ -21,19 +21,49 @@ InvenTree | {% trans "Supplier Part" %}
-
-
+
+
{% trans "Supplier Part Details" %}
+
+
+ {% trans "Internal Part" %} |
+
+ {% if part.part %}
+ {{ part.part.full_name }}
+ {% endif %}
+ |
+
+ {% trans "Supplier" %} | {{ part.supplier.name }} |
+ {% trans "SKU" %} | {{ part.SKU }} |
+ {% if part.URL %}
+ {% trans "URL" %} | {{ part.URL }} |
+ {% endif %}
+ {% if part.description %}
+ {% trans "Description" %} | {{ part.description }} |
+ {% endif %}
+ {% if part.manufacturer %}
+ {% trans "Manufacturer" %} | {{ part.manufacturer }} |
+ {% trans "MPN" %} | {{ part.MPN }} |
+ {% endif %}
+ {% if part.note %}
+ {% trans "Note" %} | {{ part.note }} |
+ {% endif %}
+
+
+
+
+
+
diff --git a/InvenTree/company/templates/company/supplier_part_tabs.html b/InvenTree/company/templates/company/supplier_part_tabs.html
index 0bcd8aa4fa..b3a4389bbd 100644
--- a/InvenTree/company/templates/company/supplier_part_tabs.html
+++ b/InvenTree/company/templates/company/supplier_part_tabs.html
@@ -1,9 +1,6 @@
{% load i18n %}
- -
- {% trans "Details" %}
-
-
{% trans "Pricing" %}
diff --git a/InvenTree/company/urls.py b/InvenTree/company/urls.py
index 66cc0b9cd8..65eba73f84 100644
--- a/InvenTree/company/urls.py
+++ b/InvenTree/company/urls.py
@@ -53,7 +53,7 @@ supplier_part_detail_urls = [
url(r'^orders/', views.SupplierPartDetail.as_view(template_name='company/supplier_part_orders.html'), name='supplier-part-orders'),
url(r'^stock/', views.SupplierPartDetail.as_view(template_name='company/supplier_part_stock.html'), name='supplier-part-stock'),
- url('^.*$', views.SupplierPartDetail.as_view(), name='supplier-part-detail'),
+ url('^.*$', views.SupplierPartDetail.as_view(template_name='company/supplier_part_pricing.html'), name='supplier-part-detail'),
]
supplier_part_urls = [
diff --git a/InvenTree/part/models.py b/InvenTree/part/models.py
index 39c61079ea..d8cb8b07e0 100644
--- a/InvenTree/part/models.py
+++ b/InvenTree/part/models.py
@@ -1198,9 +1198,9 @@ class BomItem(models.Model):
overage = str(self.overage).strip()
- # Is the overage an integer value?
+ # Is the overage a numerical value?
try:
- ovg = int(overage)
+ ovg = float(overage)
if ovg < 0:
ovg = 0
@@ -1223,7 +1223,7 @@ class BomItem(models.Model):
# Must be represented as a decimal
percent = Decimal(percent)
- return int(percent * quantity)
+ return float(percent * quantity)
except ValueError:
pass
@@ -1245,7 +1245,12 @@ class BomItem(models.Model):
# Base quantity requirement
base_quantity = self.quantity * build_quantity
- return base_quantity + self.get_overage_quantity(base_quantity)
+ # Overage requiremet
+ ovrg_quantity = self.get_overage_quantity(base_quantity)
+
+ required = float(base_quantity) + float(ovrg_quantity)
+
+ return required
@property
def price_range(self):
diff --git a/InvenTree/part/views.py b/InvenTree/part/views.py
index c7a1b959fa..1752607d2a 100644
--- a/InvenTree/part/views.py
+++ b/InvenTree/part/views.py
@@ -38,7 +38,7 @@ from InvenTree.views import AjaxView, AjaxCreateView, AjaxUpdateView, AjaxDelete
from InvenTree.views import QRCodeView
from InvenTree.helpers import DownloadFile, str2bool
-from InvenTree.status_codes import OrderStatus
+from InvenTree.status_codes import OrderStatus, BuildStatus
class PartIndex(ListView):
@@ -593,6 +593,7 @@ class PartDetail(DetailView):
context['disabled'] = not part.active
context['OrderStatus'] = OrderStatus
+ context['BuildStatus'] = BuildStatus
return context