diff --git a/InvenTree/InvenTree/settings.py b/InvenTree/InvenTree/settings.py
index d0695c4b7d..7247caa8d9 100644
--- a/InvenTree/InvenTree/settings.py
+++ b/InvenTree/InvenTree/settings.py
@@ -69,7 +69,7 @@ logger = logging.getLogger(__name__)
# Read the autogenerated key-file
key_file_name = os.path.join(BASE_DIR, 'secret_key.txt')
-logger.info(f'Loading SERCRET_KEY from {key_file_name}')
+logger.info(f'Loading SECRET_KEY from {key_file_name}')
key_file = open(key_file_name, 'r')
SECRET_KEY = key_file.read().strip()
diff --git a/InvenTree/build/api.py b/InvenTree/build/api.py
index 2401e9d936..ffc8d97a92 100644
--- a/InvenTree/build/api.py
+++ b/InvenTree/build/api.py
@@ -46,6 +46,8 @@ class BuildList(generics.ListCreateAPIView):
queryset = super().get_queryset().prefetch_related('part')
+ queryset = BuildSerializer.annotate_queryset(queryset)
+
return queryset
def filter_queryset(self, queryset):
@@ -71,6 +73,17 @@ class BuildList(generics.ListCreateAPIView):
else:
queryset = queryset.exclude(status__in=BuildStatus.ACTIVE_CODES)
+ # Filter by "overdue" status?
+ overdue = params.get('overdue', None)
+
+ if overdue is not None:
+ overdue = str2bool(overdue)
+
+ if overdue:
+ queryset = queryset.filter(Build.OVERDUE_FILTER)
+ else:
+ queryset = queryset.exclude(Build.OVERDUE_FILTER)
+
# Filter by associated part?
part = params.get('part', None)
diff --git a/InvenTree/build/forms.py b/InvenTree/build/forms.py
index ba7787798d..70deeef7b1 100644
--- a/InvenTree/build/forms.py
+++ b/InvenTree/build/forms.py
@@ -32,6 +32,14 @@ class EditBuildForm(HelperForm):
'reference': _('Build Order reference')
}
+ # TODO: Make this a more "presentable" date picker
+ # TODO: Currently does not render super nicely with crispy forms
+ target_date = forms.DateField(
+ widget=forms.DateInput(
+ attrs={'type': 'date'}
+ )
+ )
+
class Meta:
model = Build
fields = [
@@ -40,6 +48,7 @@ class EditBuildForm(HelperForm):
'part',
'quantity',
'batch',
+ 'target_date',
'take_from',
'destination',
'parent',
diff --git a/InvenTree/build/migrations/0025_build_target_date.py b/InvenTree/build/migrations/0025_build_target_date.py
new file mode 100644
index 0000000000..e834d74d0f
--- /dev/null
+++ b/InvenTree/build/migrations/0025_build_target_date.py
@@ -0,0 +1,18 @@
+# Generated by Django 3.0.7 on 2020-12-15 12:13
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('build', '0024_auto_20201201_1023'),
+ ]
+
+ operations = [
+ migrations.AddField(
+ model_name='build',
+ name='target_date',
+ field=models.DateField(blank=True, help_text='Target date for build completion. Build will be overdue after this date.', null=True, verbose_name='Target completion date'),
+ ),
+ ]
diff --git a/InvenTree/build/models.py b/InvenTree/build/models.py
index 8616e11b2a..488a8b79e8 100644
--- a/InvenTree/build/models.py
+++ b/InvenTree/build/models.py
@@ -14,7 +14,7 @@ from django.core.exceptions import ValidationError
from django.urls import reverse
from django.db import models, transaction
-from django.db.models import Sum
+from django.db.models import Sum, Q
from django.db.models.functions import Coalesce
from django.core.validators import MinValueValidator
@@ -47,11 +47,14 @@ class Build(MPTTModel):
status: Build status code
batch: Batch code transferred to build parts (optional)
creation_date: Date the build was created (auto)
- completion_date: Date the build was completed
+ target_date: Date the build will be overdue
+ completion_date: Date the build was completed (or, if incomplete, the expected date of completion)
link: External URL for extra information
notes: Text notes
"""
+ OVERDUE_FILTER = Q(status__in=BuildStatus.ACTIVE_CODES) & ~Q(target_date=None) & Q(target_date__lte=datetime.now().date())
+
class Meta:
verbose_name = _("Build Order")
verbose_name_plural = _("Build Orders")
@@ -164,6 +167,12 @@ class Build(MPTTModel):
creation_date = models.DateField(auto_now_add=True, editable=False)
+ target_date = models.DateField(
+ null=True, blank=True,
+ verbose_name=_('Target completion date'),
+ help_text=_('Target date for build completion. Build will be overdue after this date.')
+ )
+
completion_date = models.DateField(null=True, blank=True)
completed_by = models.ForeignKey(
@@ -183,6 +192,22 @@ class Build(MPTTModel):
blank=True, help_text=_('Extra build notes')
)
+ def is_overdue(self):
+ """
+ Returns true if this build is "overdue":
+
+ - Not completed
+ - Target date is "in the past"
+ """
+
+ # Cannot be deemed overdue if target_date is not set
+ if self.target_date is None:
+ return False
+
+ today = datetime.now().date()
+
+ return self.active and self.target_date < today
+
@property
def active(self):
"""
diff --git a/InvenTree/build/serializers.py b/InvenTree/build/serializers.py
index 4423619b8a..b71aaecc61 100644
--- a/InvenTree/build/serializers.py
+++ b/InvenTree/build/serializers.py
@@ -5,12 +5,17 @@ JSON serializers for Build API
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
+from django.db.models import Case, When, Value
+from django.db.models import BooleanField
+
from rest_framework import serializers
+
from InvenTree.serializers import InvenTreeModelSerializer
+
from stock.serializers import StockItemSerializerBrief
+from part.serializers import PartBriefSerializer
from .models import Build, BuildItem
-from part.serializers import PartBriefSerializer
class BuildSerializer(InvenTreeModelSerializer):
@@ -23,6 +28,33 @@ class BuildSerializer(InvenTreeModelSerializer):
quantity = serializers.FloatField()
+ overdue = serializers.BooleanField()
+
+ @staticmethod
+ def annotate_queryset(queryset):
+ """
+ Add custom annotations to the BuildSerializer queryset,
+ performing database queries as efficiently as possible.
+
+ The following annoted fields are added:
+
+ - overdue: True if the build is outstanding *and* the completion date has past
+
+ """
+
+ # Annotate a boolean 'overdue' flag
+
+ queryset = queryset.annotate(
+ overdue=Case(
+ When(
+ Build.OVERDUE_FILTER, then=Value(True, output_field=BooleanField()),
+ ),
+ default=Value(False, output_field=BooleanField())
+ )
+ )
+
+ return queryset
+
def __init__(self, *args, **kwargs):
part_detail = kwargs.pop('part_detail', False)
@@ -42,11 +74,13 @@ class BuildSerializer(InvenTreeModelSerializer):
'completion_date',
'part',
'part_detail',
+ 'overdue',
'reference',
'sales_order',
'quantity',
'status',
'status_text',
+ 'target_date',
'notes',
'link',
]
diff --git a/InvenTree/build/templates/build/build_base.html b/InvenTree/build/templates/build/build_base.html
index 3a94398e87..1124dd16c0 100644
--- a/InvenTree/build/templates/build/build_base.html
+++ b/InvenTree/build/templates/build/build_base.html
@@ -37,7 +37,12 @@ src="{% static 'img/blank_image.png' %}"
{% endif %}
-
{% build_status_label build.status large=True %}
+
+ {% build_status_label build.status large=True %}
+ {% if build.is_overdue %}
+ {% trans "Overdue" %}
+ {% endif %}
+
{{ build.title }}
@@ -81,7 +86,12 @@ src="{% static 'img/blank_image.png' %}"
{% trans "Status" %}
- {% build_status_label build.status %}
+
+ {% build_status_label build.status %}
+ {% if build.is_overdue %}
+ {% trans "Overdue" %}
+ {% endif %}
+
diff --git a/InvenTree/build/templates/build/detail.html b/InvenTree/build/templates/build/detail.html
index 68a842755d..a9a2288c4e 100644
--- a/InvenTree/build/templates/build/detail.html
+++ b/InvenTree/build/templates/build/detail.html
@@ -95,33 +95,26 @@
{% trans "Created" %}
{{ build.creation_date }}
-
-
-
-
-
-
-
- {% trans "BOM Price" %}
-
- {% if bom_price %}
- {{ bom_price }}
- {% if build.part.has_complete_bom_pricing == False %}
- {% trans "BOM pricing is incomplete" %}
- {% endif %}
- {% else %}
- {% trans "No pricing information" %}
- {% endif %}
-
-
- {% if build.completion_date %}
-
-
- {% trans "Completed" %}
- {{ build.completion_date }}{% if build.completed_by %}{{ build.completed_by }} {% endif %}
-
+
+
+ {% trans "Target Date" %}
+ {% if build.target_date %}
+
+ {{ build.target_date }}{% if build.is_overdue %} {% endif %}
+
+ {% else %}
+ {% trans "No target date set" %}
{% endif %}
-
+
+
+
+ {% trans "Completed" %}
+ {% if build.completion_date %}
+ {{ build.completion_date }}{% if build.completed_by %}{{ build.completed_by }} {% endif %}
+ {% else %}
+ {% trans "Build not complete" %}
+ {% endif %}
+
diff --git a/InvenTree/build/views.py b/InvenTree/build/views.py
index 1355738a9c..69d1dd9415 100644
--- a/InvenTree/build/views.py
+++ b/InvenTree/build/views.py
@@ -721,7 +721,7 @@ class BuildUpdate(AjaxUpdateView):
model = Build
form_class = forms.EditBuildForm
context_object_name = 'build'
- ajax_form_title = _('Edit Build Details')
+ ajax_form_title = _('Edit Build Order Details')
ajax_template_name = 'modal_form.html'
role_required = 'build.change'
@@ -764,7 +764,7 @@ class BuildDelete(AjaxDeleteView):
model = Build
ajax_template_name = 'build/delete_build.html'
- ajax_form_title = _('Delete Build')
+ ajax_form_title = _('Delete Build Order')
role_required = 'build.delete'
diff --git a/InvenTree/common/models.py b/InvenTree/common/models.py
index 9de3726bb7..c78bd9cb77 100644
--- a/InvenTree/common/models.py
+++ b/InvenTree/common/models.py
@@ -160,11 +160,13 @@ class InvenTreeSetting(models.Model):
'SALESORDER_REFERENCE_PREFIX': {
'name': _('Sales Order Reference Prefix'),
'description': _('Prefix value for sales order reference'),
+ 'default': 'SO',
},
'PURCHASEORDER_REFERENCE_PREFIX': {
'name': _('Purchase Order Reference Prefix'),
'description': _('Prefix value for purchase order reference'),
+ 'default': 'PO',
},
}
diff --git a/InvenTree/gunicorn.conf.py b/InvenTree/gunicorn.conf.py
index aeee2a366b..0e5eee75f9 100644
--- a/InvenTree/gunicorn.conf.py
+++ b/InvenTree/gunicorn.conf.py
@@ -3,3 +3,6 @@ import multiprocessing
bind = "0.0.0.0:8000"
workers = multiprocessing.cpu_count() * 2 + 1
+
+max_requests = 1000
+max_requests_jitter = 50
diff --git a/InvenTree/locale/de/LC_MESSAGES/django.mo b/InvenTree/locale/de/LC_MESSAGES/django.mo
index 4d57b3c49d..b2a1691aac 100644
Binary files a/InvenTree/locale/de/LC_MESSAGES/django.mo and b/InvenTree/locale/de/LC_MESSAGES/django.mo differ
diff --git a/InvenTree/locale/de/LC_MESSAGES/django.po b/InvenTree/locale/de/LC_MESSAGES/django.po
index e7f273efc2..5b18692564 100644
--- a/InvenTree/locale/de/LC_MESSAGES/django.po
+++ b/InvenTree/locale/de/LC_MESSAGES/django.po
@@ -6,7 +6,7 @@ msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2020-11-12 22:05+1100\n"
+"POT-Creation-Date: 2020-12-16 19:08+1100\n"
"PO-Revision-Date: 2020-05-03 11:32+0200\n"
"Last-Translator: Christian Schlüter \n"
"Language-Team: C \n"
@@ -17,45 +17,46 @@ msgstr ""
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: Lokalize 19.12.0\n"
-#: InvenTree/api.py:85
+#: InvenTree/api.py:90
msgid "No action specified"
msgstr "Keine Aktion angegeben"
-#: InvenTree/api.py:99
+#: InvenTree/api.py:104
msgid "No matching action found"
msgstr "Keine passende Aktion gefunden"
-#: InvenTree/forms.py:108 build/forms.py:82 build/forms.py:170
+#: InvenTree/forms.py:110 build/forms.py:91 build/forms.py:179
msgid "Confirm"
msgstr "Bestätigen"
-#: InvenTree/forms.py:124
+#: InvenTree/forms.py:126
#, fuzzy
#| msgid "Confim BOM item deletion"
msgid "Confirm item deletion"
msgstr "Löschung von BOM-Position bestätigen"
-#: InvenTree/forms.py:156
+#: InvenTree/forms.py:158
#, fuzzy
#| msgid "Create new part"
msgid "Enter new password"
msgstr "Neues Teil anlegen"
-#: InvenTree/forms.py:163
+#: InvenTree/forms.py:165
msgid "Confirm new password"
msgstr ""
-#: InvenTree/forms.py:198
+#: InvenTree/forms.py:200
msgid "Apply Theme"
msgstr ""
-#: InvenTree/forms.py:228
+#: InvenTree/forms.py:230
#, fuzzy
#| msgid "Set Part Category"
msgid "Select Category"
msgstr "Teilkategorie auswählen"
#: InvenTree/helpers.py:361 order/models.py:189 order/models.py:271
+#: stock/views.py:1646
msgid "Invalid quantity provided"
msgstr "Keine gültige Menge"
@@ -98,7 +99,7 @@ msgstr "Datei zum Anhängen auswählen"
msgid "File comment"
msgstr "Datei-Kommentar"
-#: InvenTree/models.py:68 templates/js/stock.js:734
+#: InvenTree/models.py:68 templates/js/stock.js:738
msgid "User"
msgstr "Benutzer"
@@ -113,24 +114,34 @@ msgstr "Name"
msgid "Description (optional)"
msgstr "Firmenbeschreibung"
-#: InvenTree/settings.py:354
+#: InvenTree/settings.py:422
msgid "English"
msgstr "Englisch"
-#: InvenTree/settings.py:355
+#: InvenTree/settings.py:423
msgid "German"
msgstr "Deutsch"
-#: InvenTree/settings.py:356
+#: InvenTree/settings.py:424
msgid "French"
msgstr "Französisch"
-#: InvenTree/settings.py:357
+#: InvenTree/settings.py:425
msgid "Polish"
msgstr "Polnisch"
+#: InvenTree/status.py:24
+msgid "Celery worker check failed"
+msgstr ""
+
+#: InvenTree/status.py:27
+#, fuzzy
+#| msgid "Instance Name"
+msgid "InvenTree system health checks failed"
+msgstr "Instanzname"
+
#: InvenTree/status_codes.py:94 InvenTree/status_codes.py:135
-#: InvenTree/status_codes.py:222
+#: InvenTree/status_codes.py:223
msgid "Pending"
msgstr "Ausstehend"
@@ -138,12 +149,12 @@ msgstr "Ausstehend"
msgid "Placed"
msgstr "Platziert"
-#: InvenTree/status_codes.py:96 InvenTree/status_codes.py:225
+#: InvenTree/status_codes.py:96 InvenTree/status_codes.py:226
msgid "Complete"
msgstr "Fertig"
#: InvenTree/status_codes.py:97 InvenTree/status_codes.py:137
-#: InvenTree/status_codes.py:224
+#: InvenTree/status_codes.py:225
msgid "Cancelled"
msgstr "Storniert"
@@ -182,7 +193,7 @@ msgstr "Zerstört"
msgid "Rejected"
msgstr ""
-#: InvenTree/status_codes.py:223
+#: InvenTree/status_codes.py:224
#, fuzzy
#| msgid "Location"
msgid "Production"
@@ -224,37 +235,39 @@ msgstr "Überschuss darf 100% nicht überschreiten"
msgid "Overage must be an integer value or a percentage"
msgstr "Überschuss muss eine Ganzzahl oder ein Prozentwert sein"
-#: InvenTree/views.py:494
+#: InvenTree/views.py:495
#, fuzzy
#| msgid "Delete BOM Item"
msgid "Delete Item"
msgstr "BOM-Position löschen"
-#: InvenTree/views.py:543
+#: InvenTree/views.py:544
#, fuzzy
#| msgid "Confim BOM item deletion"
msgid "Check box to confirm item deletion"
msgstr "Löschung von BOM-Position bestätigen"
-#: InvenTree/views.py:558 templates/InvenTree/settings/user.html:18
+#: InvenTree/views.py:559 templates/InvenTree/settings/user.html:18
#, fuzzy
#| msgid "No user information"
msgid "Edit User Information"
msgstr "Keine Benutzerinformation"
-#: InvenTree/views.py:569 templates/InvenTree/settings/user.html:22
+#: InvenTree/views.py:570 templates/InvenTree/settings/user.html:22
#, fuzzy
#| msgid "Select part"
msgid "Set Password"
msgstr "Teil auswählen"
-#: InvenTree/views.py:588
+#: InvenTree/views.py:589
msgid "Password fields must match"
msgstr ""
-#: InvenTree/views.py:794
-msgid "Database Statistics"
-msgstr "Datenbankstatistiken"
+#: InvenTree/views.py:795 templates/navbar.html:78
+#, fuzzy
+#| msgid "No user information"
+msgid "System Information"
+msgstr "Keine Benutzerinformation"
#: barcode/api.py:53 barcode/api.py:150
msgid "Must provide barcode_data parameter"
@@ -306,9 +319,9 @@ msgstr "Neues Lagerobjekt hinzufügen"
msgid "Build Order reference"
msgstr "Bestell-Referenz"
-#: build/forms.py:70 build/templates/build/auto_allocate.html:17
-#: build/templates/build/build_base.html:78
-#: build/templates/build/detail.html:29 common/models.py:488
+#: build/forms.py:79 build/templates/build/auto_allocate.html:17
+#: build/templates/build/build_base.html:83
+#: build/templates/build/detail.html:29 common/models.py:494
#: company/forms.py:112 company/templates/company/supplier_part_pricing.html:75
#: order/templates/order/order_wizard/select_parts.html:32
#: order/templates/order/purchase_order_detail.html:179
@@ -321,168 +334,168 @@ msgstr "Bestell-Referenz"
#: stock/templates/stock/item_base.html:46
#: stock/templates/stock/item_base.html:197
#: stock/templates/stock/stock_adjust.html:18 templates/js/barcode.js:338
-#: templates/js/bom.js:189 templates/js/build.js:404 templates/js/stock.js:725
-#: templates/js/stock.js:953
+#: templates/js/bom.js:195 templates/js/build.js:420 templates/js/stock.js:729
+#: templates/js/stock.js:957
msgid "Quantity"
msgstr "Anzahl"
-#: build/forms.py:71
+#: build/forms.py:80
#, fuzzy
#| msgid "Serial number for this item"
msgid "Enter quantity for build output"
msgstr "Seriennummer für dieses Teil"
-#: build/forms.py:75 stock/forms.py:111
+#: build/forms.py:84 stock/forms.py:111
#, fuzzy
#| msgid "Serial Number"
msgid "Serial numbers"
msgstr "Seriennummer"
-#: build/forms.py:77
+#: build/forms.py:86
#, fuzzy
#| msgid "Serial number for this item"
msgid "Enter serial numbers for build outputs"
msgstr "Seriennummer für dieses Teil"
-#: build/forms.py:83
+#: build/forms.py:92
#, fuzzy
#| msgid "Confirm completion of build"
msgid "Confirm creation of build outut"
msgstr "Baufertigstellung bestätigen"
-#: build/forms.py:103
+#: build/forms.py:112
#, fuzzy
#| msgid "Confirm completion of build"
msgid "Confirm deletion of build output"
msgstr "Baufertigstellung bestätigen"
-#: build/forms.py:124
+#: build/forms.py:133
#, fuzzy
#| msgid "Confirm unallocation of build stock"
msgid "Confirm unallocation of stock"
msgstr "Zuweisungsaufhebung bestätigen"
-#: build/forms.py:148
+#: build/forms.py:157
msgid "Confirm stock allocation"
msgstr "Lagerbestandszuordnung bestätigen"
-#: build/forms.py:171
+#: build/forms.py:180
#, fuzzy
#| msgid "Mark order as complete"
msgid "Mark build as complete"
msgstr "Bestellung als vollständig markieren"
-#: build/forms.py:195
+#: build/forms.py:204
#, fuzzy
#| msgid "Location Details"
msgid "Location of completed parts"
msgstr "Standort-Details"
-#: build/forms.py:200
+#: build/forms.py:209
#, fuzzy
#| msgid "Confirm stock allocation"
msgid "Confirm completion with incomplete stock allocation"
msgstr "Lagerbestandszuordnung bestätigen"
-#: build/forms.py:203
+#: build/forms.py:212
msgid "Confirm build completion"
msgstr "Bau-Fertigstellung bestätigen"
-#: build/forms.py:223 build/views.py:68
+#: build/forms.py:232 build/views.py:68
msgid "Confirm build cancellation"
msgstr "Bauabbruch bestätigen"
-#: build/forms.py:237
+#: build/forms.py:246
#, fuzzy
#| msgid "Select stock item to allocate"
msgid "Select quantity of stock to allocate"
msgstr "Lagerobjekt für Zuordnung auswählen"
-#: build/models.py:56 build/templates/build/build_base.html:8
+#: build/models.py:59 build/templates/build/build_base.html:8
#: build/templates/build/build_base.html:35
#: part/templates/part/allocation.html:20
msgid "Build Order"
msgstr "Bauauftrag"
-#: build/models.py:57 build/templates/build/index.html:6
+#: build/models.py:60 build/templates/build/index.html:6
#: build/templates/build/index.html:14 order/templates/order/so_builds.html:11
#: order/templates/order/so_tabs.html:9 part/templates/part/tabs.html:31
#: templates/InvenTree/settings/tabs.html:28 users/models.py:30
msgid "Build Orders"
msgstr "Bauaufträge"
-#: build/models.py:72
+#: build/models.py:75
#, fuzzy
#| msgid "Order Reference"
msgid "Build Order Reference"
msgstr "Bestellreferenz"
-#: build/models.py:73 order/templates/order/purchase_order_detail.html:174
-#: templates/js/bom.js:181 templates/js/build.js:493
+#: build/models.py:76 order/templates/order/purchase_order_detail.html:174
+#: templates/js/bom.js:187 templates/js/build.js:509
msgid "Reference"
msgstr "Referenz"
-#: build/models.py:80 build/templates/build/detail.html:19
+#: build/models.py:83 build/templates/build/detail.html:19
#: company/templates/company/detail.html:23
#: company/templates/company/supplier_part_base.html:61
#: company/templates/company/supplier_part_detail.html:27
#: order/templates/order/purchase_order_detail.html:161
#: part/templates/part/detail.html:51 part/templates/part/set_category.html:14
-#: templates/InvenTree/search.html:147 templates/js/bom.js:174
-#: templates/js/bom.js:499 templates/js/build.js:642 templates/js/company.js:56
-#: templates/js/order.js:168 templates/js/order.js:250 templates/js/part.js:188
+#: templates/InvenTree/search.html:147 templates/js/bom.js:180
+#: templates/js/bom.js:517 templates/js/build.js:664 templates/js/company.js:56
+#: templates/js/order.js:175 templates/js/order.js:257 templates/js/part.js:188
#: templates/js/part.js:271 templates/js/part.js:391 templates/js/part.js:572
-#: templates/js/stock.js:494 templates/js/stock.js:706
+#: templates/js/stock.js:494 templates/js/stock.js:710
msgid "Description"
msgstr "Beschreibung"
-#: build/models.py:83
+#: build/models.py:86
msgid "Brief description of the build"
msgstr "Kurze Beschreibung des Baus"
-#: build/models.py:91 build/templates/build/build_base.html:94
+#: build/models.py:95 build/templates/build/build_base.html:104
#: build/templates/build/detail.html:75
msgid "Parent Build"
msgstr "Eltern-Bau"
-#: build/models.py:92
+#: build/models.py:96
#, fuzzy
#| msgid "SalesOrder to which this build is allocated"
msgid "BuildOrder to which this build is allocated"
msgstr "Bestellung, die diesem Bau zugwiesen ist"
-#: build/models.py:97 build/templates/build/auto_allocate.html:16
-#: build/templates/build/build_base.html:73
+#: build/models.py:101 build/templates/build/auto_allocate.html:16
+#: build/templates/build/build_base.html:78
#: build/templates/build/detail.html:24 order/models.py:530
#: order/templates/order/order_wizard/select_parts.html:30
#: order/templates/order/purchase_order_detail.html:148
#: order/templates/order/receive_parts.html:19 part/models.py:315
#: part/templates/part/part_app_base.html:7 part/templates/part/related.html:26
#: part/templates/part/set_category.html:13 templates/InvenTree/search.html:133
-#: templates/js/barcode.js:336 templates/js/bom.js:147 templates/js/bom.js:484
-#: templates/js/build.js:647 templates/js/company.js:138
+#: templates/js/barcode.js:336 templates/js/bom.js:153 templates/js/bom.js:502
+#: templates/js/build.js:669 templates/js/company.js:138
#: templates/js/part.js:252 templates/js/part.js:357 templates/js/stock.js:468
-#: templates/js/stock.js:1025
+#: templates/js/stock.js:1029
msgid "Part"
msgstr "Teil"
-#: build/models.py:105
+#: build/models.py:109
msgid "Select part to build"
msgstr "Teil für den Bau wählen"
-#: build/models.py:110
+#: build/models.py:114
msgid "Sales Order Reference"
msgstr "Bestellungsreferenz"
-#: build/models.py:114
+#: build/models.py:118
msgid "SalesOrder to which this build is allocated"
msgstr "Bestellung, die diesem Bau zugwiesen ist"
-#: build/models.py:119
+#: build/models.py:123
msgid "Source Location"
msgstr "Quell-Standort"
-#: build/models.py:123
+#: build/models.py:127
msgid ""
"Select location to take stock from for this build (leave blank to take from "
"any stock location)"
@@ -490,55 +503,64 @@ msgstr ""
"Lager-Entnahmestandort für diesen Bau wählen (oder leer lassen für einen "
"beliebigen Lager-Standort)"
-#: build/models.py:128
+#: build/models.py:132
#, fuzzy
#| msgid "Destination stock location"
msgid "Destination Location"
msgstr "Ziel-Lagerbestand"
-#: build/models.py:132
+#: build/models.py:136
msgid "Select location where the completed items will be stored"
msgstr ""
-#: build/models.py:136
+#: build/models.py:140
msgid "Build Quantity"
msgstr "Bau-Anzahl"
-#: build/models.py:139
+#: build/models.py:143
#, fuzzy
#| msgid "Number of parts to build"
msgid "Number of stock items to build"
msgstr "Anzahl der zu bauenden Teile"
-#: build/models.py:143
+#: build/models.py:147
#, fuzzy
#| msgid "Completed"
msgid "Completed items"
msgstr "Fertig"
-#: build/models.py:145
+#: build/models.py:149
#, fuzzy
#| msgid "Delete this Stock Item when stock is depleted"
msgid "Number of stock items which have been completed"
msgstr "Objekt löschen wenn Lagerbestand aufgebraucht"
-#: build/models.py:149 part/templates/part/part_base.html:155
+#: build/models.py:153 part/templates/part/part_base.html:155
msgid "Build Status"
msgstr "Bau-Status"
-#: build/models.py:153
+#: build/models.py:157
msgid "Build status code"
msgstr "Bau-Statuscode"
-#: build/models.py:157 stock/models.py:390
+#: build/models.py:161 stock/models.py:390
msgid "Batch Code"
msgstr "Losnummer"
-#: build/models.py:161
+#: build/models.py:165
msgid "Batch code for this build output"
msgstr "Chargennummer für diese Bau-Ausgabe"
-#: build/models.py:176 build/templates/build/detail.html:89
+#: build/models.py:172
+msgid "Target completion date"
+msgstr ""
+
+#: build/models.py:173
+msgid ""
+"Target date for build completion. Build will be overdue after this date."
+msgstr ""
+
+#: build/models.py:186 build/templates/build/detail.html:89
#: company/templates/company/supplier_part_base.html:68
#: company/templates/company/supplier_part_detail.html:24
#: part/templates/part/detail.html:80 part/templates/part/part_base.html:102
@@ -546,95 +568,95 @@ msgstr "Chargennummer für diese Bau-Ausgabe"
msgid "External Link"
msgstr "Externer Link"
-#: build/models.py:177 part/models.py:672 stock/models.py:386
+#: build/models.py:187 part/models.py:672 stock/models.py:386
msgid "Link to external URL"
msgstr "Link zu einer externen URL"
-#: build/models.py:181 build/templates/build/tabs.html:23 company/models.py:344
+#: build/models.py:191 build/templates/build/tabs.html:23 company/models.py:344
#: company/templates/company/tabs.html:33 order/templates/order/po_tabs.html:18
#: order/templates/order/purchase_order_detail.html:213
#: order/templates/order/so_tabs.html:23 part/templates/part/tabs.html:73
#: stock/forms.py:307 stock/forms.py:339 stock/forms.py:367 stock/models.py:448
-#: stock/models.py:1432 stock/templates/stock/tabs.html:26
-#: templates/js/barcode.js:391 templates/js/bom.js:250
-#: templates/js/stock.js:116 templates/js/stock.js:578
+#: stock/models.py:1433 stock/templates/stock/tabs.html:26
+#: templates/js/barcode.js:391 templates/js/bom.js:263
+#: templates/js/stock.js:116 templates/js/stock.js:582
msgid "Notes"
msgstr "Notizen"
-#: build/models.py:182
+#: build/models.py:192
msgid "Extra build notes"
msgstr "Notizen für den Bau"
-#: build/models.py:551
+#: build/models.py:577
#, fuzzy
#| msgid "No action specified"
msgid "No build output specified"
msgstr "Keine Aktion angegeben"
-#: build/models.py:554
+#: build/models.py:580
msgid "Build output is already completed"
msgstr ""
-#: build/models.py:557
+#: build/models.py:583
#, fuzzy
#| msgid "Quantity does not match serial numbers"
msgid "Build output does not match Build Order"
msgstr "Anzahl stimmt nicht mit den Seriennummern überein"
-#: build/models.py:632
+#: build/models.py:658
#, fuzzy
#| msgid "Complete Build"
msgid "Completed build output"
msgstr "Bau fertigstellen"
-#: build/models.py:870
+#: build/models.py:896
msgid "BuildItem must be unique for build, stock_item and install_into"
msgstr ""
-#: build/models.py:892
+#: build/models.py:918
#, fuzzy
#| msgid "Allocate Stock to Build"
msgid "Build item must specify a build output"
msgstr "Lagerbestand dem Bau zuweisen"
-#: build/models.py:897
+#: build/models.py:923
#, python-brace-format
msgid "Selected stock item not found in BOM for part '{p}'"
msgstr "Ausgewähltes Lagerobjekt nicht in BOM für Teil '{p}' gefunden"
-#: build/models.py:901
+#: build/models.py:927
#, python-brace-format
msgid "Allocated quantity ({n}) must not exceed available quantity ({q})"
msgstr ""
"zugewiesene Anzahl ({n}) darf nicht die verfügbare ({q}) Anzahl überschreiten"
-#: build/models.py:908 order/models.py:614
+#: build/models.py:934 order/models.py:614
msgid "StockItem is over-allocated"
msgstr "Zu viele Lagerobjekte zugewiesen"
-#: build/models.py:912 order/models.py:617
+#: build/models.py:938 order/models.py:617
msgid "Allocation quantity must be greater than zero"
msgstr "Anzahl muss größer null sein"
-#: build/models.py:916
+#: build/models.py:942
msgid "Quantity must be 1 for serialized stock"
msgstr "Anzahl muss 1 für Objekte mit Seriennummer sein"
-#: build/models.py:956
+#: build/models.py:982
msgid "Build to allocate parts"
msgstr "Bau starten um Teile zuzuweisen"
-#: build/models.py:963
+#: build/models.py:989
#, fuzzy
#| msgid "Remove stock"
msgid "Source stock item"
msgstr "Bestand entfernen"
-#: build/models.py:975
+#: build/models.py:1001
msgid "Stock quantity to allocate to build"
msgstr "Lagerobjekt-Anzahl dem Bau zuweisen"
-#: build/models.py:983
+#: build/models.py:1009
#, fuzzy
#| msgid "Destination stock location"
msgid "Destination stock item"
@@ -676,7 +698,7 @@ msgstr "Teil bestellen"
msgid "Order Parts"
msgstr "Teile bestellen"
-#: build/templates/build/allocate.html:33 templates/js/build.js:574
+#: build/templates/build/allocate.html:33 templates/js/build.js:590
#, fuzzy
#| msgid "Unallocate Stock"
msgid "Unallocate stock"
@@ -723,7 +745,7 @@ msgstr "Lagerobjekt dem Bau zuweisen"
#: stock/templates/stock/item_base.html:227
#: stock/templates/stock/stock_adjust.html:17
#: templates/InvenTree/search.html:183 templates/js/barcode.js:337
-#: templates/js/build.js:418 templates/js/stock.js:570
+#: templates/js/build.js:434 templates/js/stock.js:574
msgid "Location"
msgstr "Standort"
@@ -763,51 +785,60 @@ msgstr "Dieser Bau ist Kind von Bau"
msgid "Admin view"
msgstr "Admin"
-#: build/templates/build/build_base.html:46
+#: build/templates/build/build_base.html:43
+#: build/templates/build/build_base.html:92 templates/js/table_filters.js:190
+msgid "Overdue"
+msgstr ""
+
+#: build/templates/build/build_base.html:51
#, fuzzy
#| msgid "Edited build"
msgid "Edit Build"
msgstr "Bau bearbeitet"
-#: build/templates/build/build_base.html:50
+#: build/templates/build/build_base.html:55
msgid "Complete Build"
msgstr "Bau fertigstellen"
-#: build/templates/build/build_base.html:53 build/views.py:58
+#: build/templates/build/build_base.html:58 build/views.py:58
msgid "Cancel Build"
msgstr "Bau abbrechen"
-#: build/templates/build/build_base.html:59 build/views.py:767
+#: build/templates/build/build_base.html:64
msgid "Delete Build"
msgstr "Bau entfernt"
-#: build/templates/build/build_base.html:69 build/templates/build/detail.html:9
+#: build/templates/build/build_base.html:74 build/templates/build/detail.html:9
msgid "Build Details"
msgstr "Bau-Status"
-#: build/templates/build/build_base.html:83
+#: build/templates/build/build_base.html:88
#: build/templates/build/detail.html:57
#: order/templates/order/receive_parts.html:24
#: stock/templates/stock/item_base.html:312 templates/InvenTree/search.html:175
-#: templates/js/barcode.js:42 templates/js/build.js:675
-#: templates/js/order.js:173 templates/js/order.js:255
-#: templates/js/stock.js:557 templates/js/stock.js:961
+#: templates/js/barcode.js:42 templates/js/build.js:697
+#: templates/js/order.js:180 templates/js/order.js:262
+#: templates/js/stock.js:561 templates/js/stock.js:965
msgid "Status"
msgstr "Status"
-#: build/templates/build/build_base.html:88
+#: build/templates/build/build_base.html:92
+msgid "This build was due on"
+msgstr ""
+
+#: build/templates/build/build_base.html:98
#: build/templates/build/detail.html:62
msgid "Progress"
msgstr ""
-#: build/templates/build/build_base.html:101
+#: build/templates/build/build_base.html:111
#: build/templates/build/detail.html:82 order/models.py:528
#: order/templates/order/sales_order_base.html:9
#: order/templates/order/sales_order_base.html:33
#: order/templates/order/sales_order_notes.html:10
#: order/templates/order/sales_order_ship.html:25
#: part/templates/part/allocation.html:27
-#: stock/templates/stock/item_base.html:221 templates/js/order.js:222
+#: stock/templates/stock/item_base.html:221 templates/js/order.js:229
msgid "Sales Order"
msgstr "Bestellung"
@@ -941,35 +972,41 @@ msgid "Destination location not specified"
msgstr "Hat dieses Teil Tracking für einzelne Objekte?"
#: build/templates/build/detail.html:68
-#: stock/templates/stock/item_base.html:245 templates/js/stock.js:565
-#: templates/js/stock.js:968 templates/js/table_filters.js:80
+#: stock/templates/stock/item_base.html:245 templates/js/stock.js:569
+#: templates/js/stock.js:972 templates/js/table_filters.js:80
#: templates/js/table_filters.js:151
msgid "Batch"
msgstr "Los"
#: build/templates/build/detail.html:95
#: order/templates/order/order_base.html:98
-#: order/templates/order/sales_order_base.html:100 templates/js/build.js:683
+#: order/templates/order/sales_order_base.html:100 templates/js/build.js:705
msgid "Created"
msgstr "Erstellt"
-#: build/templates/build/detail.html:105
-msgid "BOM Price"
-msgstr "Stücklistenpreis"
+#: build/templates/build/detail.html:100 templates/js/build.js:710
+#, fuzzy
+#| msgid "Shipment Date"
+msgid "Target Date"
+msgstr "Versanddatum"
-#: build/templates/build/detail.html:110
-msgid "BOM pricing is incomplete"
-msgstr "Stücklistenbepreisung ist unvollständig"
+#: build/templates/build/detail.html:106
+#, fuzzy
+#| msgid "No destination set"
+msgid "No target date set"
+msgstr "Kein Ziel gesetzt"
-#: build/templates/build/detail.html:113
-msgid "No pricing information"
-msgstr "Keine Preisinformation"
-
-#: build/templates/build/detail.html:120 templates/js/build.js:661
-#: templates/js/build.js:688
+#: build/templates/build/detail.html:111 templates/js/build.js:683
+#: templates/js/build.js:715
msgid "Completed"
msgstr "Fertig"
+#: build/templates/build/detail.html:115
+#, fuzzy
+#| msgid "Build order allocation is complete"
+msgid "Build not complete"
+msgstr "Bau-Zuweisung ist vollständig"
+
#: build/templates/build/edit_build_item.html:7
#, fuzzy
#| msgid "Stock quantity to allocate to build"
@@ -1046,7 +1083,7 @@ msgstr "Lagerbestand dem Bau zuweisen"
msgid "Create Build Output"
msgstr "Bau-Ausgabe"
-#: build/views.py:207 stock/models.py:827 stock/views.py:1660
+#: build/views.py:207 stock/models.py:828 stock/views.py:1667
#, fuzzy
#| msgid "Serial numbers already exist: "
msgid "Serial numbers already exist"
@@ -1131,13 +1168,21 @@ msgid "Created new build"
msgstr "Neuen Bau angelegt"
#: build/views.py:724
-msgid "Edit Build Details"
+#, fuzzy
+#| msgid "Edit Build Details"
+msgid "Edit Build Order Details"
msgstr "Baudetails bearbeiten"
#: build/views.py:758
msgid "Edited build"
msgstr "Bau bearbeitet"
+#: build/views.py:767
+#, fuzzy
+#| msgid "Complete Build"
+msgid "Delete Build Order"
+msgstr "Bau fertigstellen"
+
#: build/views.py:784
msgid "Removed parts from build allocation"
msgstr "Teile von Bauzuordnung entfernt"
@@ -1160,8 +1205,8 @@ msgstr "Dieses Lagerobjekt ist dem Bau zugewiesen"
msgid "Stock item is over-allocated"
msgstr "Zu viele Lagerobjekte zugewiesen"
-#: build/views.py:847 templates/js/bom.js:215 templates/js/build.js:503
-#: templates/js/build.js:731
+#: build/views.py:847 templates/js/bom.js:221 templates/js/build.js:519
+#: templates/js/build.js:758
msgid "Available"
msgstr "verfügbar"
@@ -1299,7 +1344,7 @@ msgid "Copy category parameter templates when creating a part"
msgstr ""
#: common/models.py:115 part/models.py:743 part/templates/part/detail.html:168
-#: templates/js/table_filters.js:264
+#: templates/js/table_filters.js:268
msgid "Component"
msgstr "Komponente"
@@ -1318,7 +1363,7 @@ msgid "Parts are purchaseable by default"
msgstr ""
#: common/models.py:129 part/models.py:759 part/templates/part/detail.html:198
-#: templates/js/table_filters.js:272
+#: templates/js/table_filters.js:276
msgid "Salable"
msgstr "Verkäuflich"
@@ -1327,7 +1372,7 @@ msgid "Parts are salable by default"
msgstr ""
#: common/models.py:136 part/models.py:749 part/templates/part/detail.html:178
-#: templates/js/table_filters.js:31 templates/js/table_filters.js:276
+#: templates/js/table_filters.js:31 templates/js/table_filters.js:280
msgid "Trackable"
msgstr "nachverfolgbar"
@@ -1381,42 +1426,42 @@ msgstr "Bestell-Referenz"
msgid "Prefix value for purchase order reference"
msgstr "Bestell-Referenz"
-#: common/models.py:373
+#: common/models.py:376
msgid "Settings key (must be unique - case insensitive"
msgstr ""
"Einstellungs-Schlüssel (muss einzigartig sein, Groß-/ Kleinschreibung wird "
"nicht beachtet)"
-#: common/models.py:375
+#: common/models.py:378
msgid "Settings value"
msgstr "Einstellungs-Wert"
-#: common/models.py:431
+#: common/models.py:437
msgid "Value must be a boolean value"
msgstr ""
-#: common/models.py:445
+#: common/models.py:451
msgid "Key string must be unique"
msgstr "Schlüsseltext muss eindeutig sein"
-#: common/models.py:489 company/forms.py:113
+#: common/models.py:495 company/forms.py:113
#, fuzzy
#| msgid "Price Breaks"
msgid "Price break quantity"
msgstr "Preisstaffelung"
-#: common/models.py:497 company/templates/company/supplier_part_pricing.html:80
-#: part/templates/part/sale_prices.html:87 templates/js/bom.js:234
+#: common/models.py:503 company/templates/company/supplier_part_pricing.html:80
+#: part/templates/part/sale_prices.html:87 templates/js/bom.js:246
msgid "Price"
msgstr "Preis"
-#: common/models.py:498
+#: common/models.py:504
#, fuzzy
#| msgid "Enter a valid quantity"
msgid "Unit price at specified quantity"
msgstr "Bitte eine gültige Anzahl eingeben"
-#: common/models.py:521
+#: common/models.py:527
#, fuzzy
#| msgid "Default Location"
msgid "Default"
@@ -1434,6 +1479,16 @@ msgstr "Währungs-Wert"
msgid "Change Setting"
msgstr "Einstellungen"
+#: common/views.py:94
+msgid "Supplied value is not allowed"
+msgstr ""
+
+#: common/views.py:103
+#, fuzzy
+#| msgid "Supplier part description"
+msgid "Supplied value must be a boolean"
+msgstr "Zuliefererbeschreibung des Teils"
+
#: company/forms.py:37 company/models.py:139
#, fuzzy
#| msgid "Do you purchase items from this company?"
@@ -1569,7 +1624,7 @@ msgid "Part packaging"
msgstr "Teile-Packaging"
#: company/templates/company/assigned_stock.html:9
-#: company/templates/company/tabs.html:25 templates/js/build.js:395
+#: company/templates/company/tabs.html:25 templates/js/build.js:411
#, fuzzy
#| msgid "Assigned"
msgid "Assigned Stock"
@@ -1620,14 +1675,14 @@ msgstr "Hersteller"
#: order/templates/order/order_base.html:79
#: order/templates/order/order_wizard/select_pos.html:30 part/bom.py:170
#: stock/templates/stock/item_base.html:287 templates/js/company.js:48
-#: templates/js/company.js:164 templates/js/order.js:155
+#: templates/js/company.js:164 templates/js/order.js:162
msgid "Supplier"
msgstr "Zulieferer"
#: company/templates/company/detail.html:62
#: order/templates/order/sales_order_base.html:81 stock/models.py:373
#: stock/models.py:374 stock/templates/stock/item_base.html:204
-#: templates/js/company.js:40 templates/js/order.js:237
+#: templates/js/company.js:40 templates/js/order.js:244
msgid "Customer"
msgstr "Kunde"
@@ -1642,7 +1697,7 @@ msgstr "Neues Zuliefererteil anlegen"
#: company/templates/company/detail_part.html:18
#: order/templates/order/purchase_order_detail.html:68
-#: part/templates/part/supplier.html:14 templates/js/stock.js:845
+#: part/templates/part/supplier.html:14 templates/js/stock.js:849
msgid "New Supplier Part"
msgstr "Neues Zulieferer-Teil"
@@ -1670,7 +1725,7 @@ msgid "Delete Parts"
msgstr "Teile löschen"
#: company/templates/company/detail_part.html:63
-#: part/templates/part/category.html:116 templates/js/stock.js:839
+#: part/templates/part/category.html:116 templates/js/stock.js:843
msgid "New Part"
msgstr "Neues Teil"
@@ -1820,8 +1875,8 @@ msgstr "Teil bestellen"
msgid "Pricing Information"
msgstr "Preisinformationen ansehen"
-#: company/templates/company/supplier_part_pricing.html:17 company/views.py:459
-#: part/templates/part/sale_prices.html:14 part/views.py:2546
+#: company/templates/company/supplier_part_pricing.html:17 company/views.py:486
+#: part/templates/part/sale_prices.html:14 part/views.py:2555
msgid "Add Price Break"
msgstr "Preisstaffel hinzufügen"
@@ -1872,7 +1927,7 @@ msgstr "Bestellungen"
#: part/templates/part/cat_link.html:7 part/templates/part/category.html:94
#: part/templates/part/category_tabs.html:6
#: templates/InvenTree/settings/tabs.html:22 templates/navbar.html:19
-#: templates/stats.html:8 templates/stats.html:17 users/models.py:28
+#: templates/stats.html:35 templates/stats.html:44 users/models.py:28
msgid "Parts"
msgstr "Teile"
@@ -1941,25 +1996,25 @@ msgstr "Firma gelöscht"
msgid "Edit Supplier Part"
msgstr "Zuliefererteil bearbeiten"
-#: company/views.py:289 templates/js/stock.js:846
+#: company/views.py:295 templates/js/stock.js:850
msgid "Create new Supplier Part"
msgstr "Neues Zuliefererteil anlegen"
-#: company/views.py:388
+#: company/views.py:415
msgid "Delete Supplier Part"
msgstr "Zuliefererteil entfernen"
-#: company/views.py:465 part/views.py:2552
+#: company/views.py:492 part/views.py:2561
#, fuzzy
#| msgid "Add Price Break"
msgid "Added new price break"
msgstr "Preisstaffel hinzufügen"
-#: company/views.py:521 part/views.py:2596
+#: company/views.py:548 part/views.py:2605
msgid "Edit Price Break"
msgstr "Preisstaffel bearbeiten"
-#: company/views.py:537 part/views.py:2612
+#: company/views.py:564 part/views.py:2621
msgid "Delete Price Break"
msgstr "Preisstaffel löschen"
@@ -2064,8 +2119,8 @@ msgstr ""
msgid "Date order was completed"
msgstr "Bestellung als vollständig markieren"
-#: order/models.py:187 order/models.py:269 part/views.py:1496
-#: stock/models.py:244 stock/models.py:811
+#: order/models.py:187 order/models.py:269 part/views.py:1494
+#: stock/models.py:244 stock/models.py:812
msgid "Quantity must be greater than zero"
msgstr "Anzahl muss größer Null sein"
@@ -2103,7 +2158,7 @@ msgstr "Position - Notizen"
#: order/models.py:486 order/templates/order/order_base.html:9
#: order/templates/order/order_base.html:24
-#: stock/templates/stock/item_base.html:259 templates/js/order.js:139
+#: stock/templates/stock/item_base.html:259 templates/js/order.js:146
msgid "Purchase Order"
msgstr "Kaufvertrag"
@@ -2115,7 +2170,7 @@ msgstr "Zulieferer-Teil"
msgid "Number of items received"
msgstr "Empfangene Objekt-Anzahl"
-#: order/models.py:509 stock/models.py:457
+#: order/models.py:509 stock/models.py:458
#: stock/templates/stock/item_base.html:266
#, fuzzy
#| msgid "Purchase Order"
@@ -2188,7 +2243,7 @@ msgstr "Bestellreferenz"
msgid "Order Status"
msgstr "Bestellstatus"
-#: order/templates/order/order_base.html:85 templates/js/order.js:162
+#: order/templates/order/order_base.html:85 templates/js/order.js:169
msgid "Supplier Reference"
msgstr "Zuliefererreferenz"
@@ -2221,11 +2276,15 @@ msgid "Step 1 of 2 - Select Part Suppliers"
msgstr "Schritt 1 von 2 - Zulieferer auswählen"
#: order/templates/order/order_wizard/select_parts.html:14
-msgid "Select suppliers."
+#, fuzzy
+#| msgid "Select suppliers."
+msgid "Select suppliers"
msgstr "Zulieferer auswählen."
#: order/templates/order/order_wizard/select_parts.html:18
-msgid "No purchaseable parts selected."
+#, fuzzy
+#| msgid "No purchaseable parts selected."
+msgid "No purchaseable parts selected"
msgstr "Keine kaufbaren Teile ausgewählt."
#: order/templates/order/order_wizard/select_parts.html:31
@@ -2245,7 +2304,7 @@ msgid "Select existing purchase orders, or create new orders."
msgstr "Bestellungen auswählen oder anlegen."
#: order/templates/order/order_wizard/select_pos.html:31
-#: templates/js/order.js:186 templates/js/order.js:273
+#: templates/js/order.js:193 templates/js/order.js:280
msgid "Items"
msgstr "Positionen"
@@ -2287,7 +2346,7 @@ msgstr "Bestellpositionen"
#: order/templates/order/purchase_order_detail.html:39
#: order/templates/order/purchase_order_detail.html:119
#: part/templates/part/category.html:173 part/templates/part/category.html:215
-#: templates/js/stock.js:851
+#: templates/js/stock.js:855
msgid "New Location"
msgstr "Neuer Standort"
@@ -2360,7 +2419,7 @@ msgstr "Packliste"
msgid "Sales Order Details"
msgstr "Auftragsdetails"
-#: order/templates/order/sales_order_base.html:87 templates/js/order.js:244
+#: order/templates/order/sales_order_base.html:87 templates/js/order.js:251
msgid "Customer Reference"
msgstr "Kundenreferenz"
@@ -2377,23 +2436,23 @@ msgstr "Auftragspositionen"
#: order/templates/order/sales_order_detail.html:72
#: order/templates/order/sales_order_detail.html:154 stock/models.py:378
-#: stock/templates/stock/item_base.html:191 templates/js/build.js:402
+#: stock/templates/stock/item_base.html:191 templates/js/build.js:418
msgid "Serial Number"
msgstr "Seriennummer"
-#: order/templates/order/sales_order_detail.html:96 templates/js/build.js:443
-#: templates/js/build.js:742
+#: order/templates/order/sales_order_detail.html:96 templates/js/build.js:459
+#: templates/js/build.js:769
msgid "Edit stock allocation"
msgstr "Lagerobjekt-Standort bearbeiten"
-#: order/templates/order/sales_order_detail.html:97 templates/js/build.js:445
-#: templates/js/build.js:743
+#: order/templates/order/sales_order_detail.html:97 templates/js/build.js:461
+#: templates/js/build.js:770
msgid "Delete stock allocation"
msgstr "Zuweisung löschen"
#: order/templates/order/sales_order_detail.html:225
-#: part/templates/part/tabs.html:23 templates/js/build.js:507
-#: templates/js/build.js:738
+#: part/templates/part/tabs.html:23 templates/js/build.js:523
+#: templates/js/build.js:765
msgid "Allocated"
msgstr "Zugeordnet"
@@ -2681,7 +2740,7 @@ msgstr "Neues Zulieferer-Teil"
msgid "Include part supplier data in exported BOM"
msgstr ""
-#: part/forms.py:92 part/models.py:1715
+#: part/forms.py:92 part/models.py:1717
msgid "Parent Part"
msgstr "Ausgangsteil"
@@ -2783,13 +2842,13 @@ msgstr "Standard-Standort für Teile dieser Kategorie"
msgid "Default keywords for parts in this category"
msgstr "Standard-Stichworte für Teile dieser Kategorie"
-#: part/models.py:77 part/models.py:1760
+#: part/models.py:77 part/models.py:1762
#: part/templates/part/part_app_base.html:9
msgid "Part Category"
msgstr "Teilkategorie"
#: part/models.py:78 part/templates/part/category.html:18
-#: part/templates/part/category.html:89 templates/stats.html:12
+#: part/templates/part/category.html:89 templates/stats.html:39
msgid "Part Categories"
msgstr "Teile-Kategorien"
@@ -2871,7 +2930,7 @@ msgid "Stock keeping units for this part"
msgstr "Stock Keeping Units (SKU) für dieses Teil"
#: part/models.py:737 part/templates/part/detail.html:158
-#: templates/js/table_filters.js:260
+#: templates/js/table_filters.js:264
msgid "Assembly"
msgstr "Baugruppe"
@@ -2897,7 +2956,7 @@ msgstr "Kann dieses Teil an Kunden verkauft werden?"
#: part/models.py:764 part/templates/part/detail.html:215
#: templates/js/table_filters.js:19 templates/js/table_filters.js:55
-#: templates/js/table_filters.js:186 templates/js/table_filters.js:243
+#: templates/js/table_filters.js:186 templates/js/table_filters.js:247
msgid "Active"
msgstr "Aktiv"
@@ -2922,13 +2981,13 @@ msgstr "Bemerkungen - unterstüzt Markdown-Formatierung"
msgid "Stored BOM checksum"
msgstr "Prüfsumme der Stückliste gespeichert"
-#: part/models.py:1588
+#: part/models.py:1590
#, fuzzy
#| msgid "Stock item cannot be created for a template Part"
msgid "Test templates can only be created for trackable parts"
msgstr "Lagerobjekt kann nicht für Vorlagen-Teile angelegt werden"
-#: part/models.py:1605
+#: part/models.py:1607
#, fuzzy
#| msgid ""
#| "A stock item with this serial number already exists for template part "
@@ -2938,140 +2997,146 @@ msgstr ""
"Ein Teil mit dieser Seriennummer existiert bereits für die Teilevorlage "
"{part}"
-#: part/models.py:1624 templates/js/part.js:567 templates/js/stock.js:92
+#: part/models.py:1626 templates/js/part.js:567 templates/js/stock.js:92
#, fuzzy
#| msgid "Instance Name"
msgid "Test Name"
msgstr "Instanzname"
-#: part/models.py:1625
+#: part/models.py:1627
#, fuzzy
#| msgid "Serial number for this item"
msgid "Enter a name for the test"
msgstr "Seriennummer für dieses Teil"
-#: part/models.py:1630
+#: part/models.py:1632
#, fuzzy
#| msgid "Description"
msgid "Test Description"
msgstr "Beschreibung"
-#: part/models.py:1631
+#: part/models.py:1633
#, fuzzy
#| msgid "Brief description of the build"
msgid "Enter description for this test"
msgstr "Kurze Beschreibung des Baus"
-#: part/models.py:1636 templates/js/part.js:576
+#: part/models.py:1638 templates/js/part.js:576
#: templates/js/table_filters.js:172
msgid "Required"
msgstr "benötigt"
-#: part/models.py:1637
+#: part/models.py:1639
msgid "Is this test required to pass?"
msgstr ""
-#: part/models.py:1642 templates/js/part.js:584
+#: part/models.py:1644 templates/js/part.js:584
#, fuzzy
#| msgid "Required Parts"
msgid "Requires Value"
msgstr "benötigte Teile"
-#: part/models.py:1643
+#: part/models.py:1645
msgid "Does this test require a value when adding a test result?"
msgstr ""
-#: part/models.py:1648 templates/js/part.js:591
+#: part/models.py:1650 templates/js/part.js:591
#, fuzzy
#| msgid "Delete Attachment"
msgid "Requires Attachment"
msgstr "Anhang löschen"
-#: part/models.py:1649
+#: part/models.py:1651
msgid "Does this test require a file attachment when adding a test result?"
msgstr ""
-#: part/models.py:1682
+#: part/models.py:1684
msgid "Parameter template name must be unique"
msgstr "Vorlagen-Name des Parameters muss eindeutig sein"
-#: part/models.py:1687
+#: part/models.py:1689
msgid "Parameter Name"
msgstr "Name des Parameters"
-#: part/models.py:1689
+#: part/models.py:1691
msgid "Parameter Units"
msgstr "Parameter Einheit"
-#: part/models.py:1717 part/models.py:1765
+#: part/models.py:1719 part/models.py:1767
#: templates/InvenTree/settings/category.html:62
msgid "Parameter Template"
msgstr "Parameter Vorlage"
-#: part/models.py:1719
+#: part/models.py:1721
msgid "Parameter Value"
msgstr "Parameter Wert"
-#: part/models.py:1769
+#: part/models.py:1771
#, fuzzy
#| msgid "Parameter Value"
msgid "Default Parameter Value"
msgstr "Parameter Wert"
-#: part/models.py:1799
+#: part/models.py:1801
msgid "Select parent part"
msgstr "Ausgangsteil auswählen"
-#: part/models.py:1807
+#: part/models.py:1809
msgid "Select part to be used in BOM"
msgstr "Teil für die Nutzung in der Stückliste auswählen"
-#: part/models.py:1813
+#: part/models.py:1815
msgid "BOM quantity for this BOM item"
msgstr "Stücklisten-Anzahl für dieses Stücklisten-Teil"
-#: part/models.py:1815
+#: part/models.py:1817
#, fuzzy
#| msgid "Confim BOM item deletion"
msgid "This BOM item is optional"
msgstr "Löschung von BOM-Position bestätigen"
-#: part/models.py:1818
+#: part/models.py:1820
msgid "Estimated build wastage quantity (absolute or percentage)"
msgstr "Geschätzter Ausschuss (absolut oder prozentual)"
-#: part/models.py:1821
+#: part/models.py:1823
msgid "BOM item reference"
msgstr "Referenz des Objekts auf der Stückliste"
-#: part/models.py:1824
+#: part/models.py:1826
msgid "BOM item notes"
msgstr "Notizen zum Stücklisten-Objekt"
-#: part/models.py:1826
+#: part/models.py:1828
msgid "BOM line checksum"
msgstr "Prüfsumme der Stückliste"
-#: part/models.py:1893 part/views.py:1502 part/views.py:1554
+#: part/models.py:1899 part/views.py:1500 part/views.py:1552
#: stock/models.py:234
#, fuzzy
#| msgid "Overage must be an integer value or a percentage"
msgid "Quantity must be integer value for trackable parts"
msgstr "Überschuss muss eine Ganzzahl oder ein Prozentwert sein"
-#: part/models.py:1909
+#: part/models.py:1908 part/models.py:1910
+#, fuzzy
+#| msgid "Supplier part description"
+msgid "Sub part must be specified"
+msgstr "Zuliefererbeschreibung des Teils"
+
+#: part/models.py:1913
#, fuzzy
#| msgid "New BOM Item"
msgid "BOM Item"
msgstr "Neue Stücklistenposition"
-#: part/models.py:2024
+#: part/models.py:2028
#, fuzzy
#| msgid "Select a part"
msgid "Select Related Part"
msgstr "Teil auswählen"
-#: part/models.py:2056
+#: part/models.py:2060
msgid ""
"Error creating relationship: check that the part is not related to itself "
"and that the relationship is unique"
@@ -3093,8 +3158,8 @@ msgstr "Bestellung"
#: stock/templates/stock/item_base.html:8
#: stock/templates/stock/item_base.html:72
#: stock/templates/stock/item_base.html:274
-#: stock/templates/stock/stock_adjust.html:16 templates/js/build.js:724
-#: templates/js/stock.js:695 templates/js/stock.js:944
+#: stock/templates/stock/stock_adjust.html:16 templates/js/build.js:751
+#: templates/js/stock.js:699 templates/js/stock.js:948
msgid "Stock Item"
msgstr "Lagerobjekt"
@@ -3167,7 +3232,7 @@ msgstr "Stückliste validieren"
msgid "Validate"
msgstr "BOM validieren"
-#: part/templates/part/bom.html:62 part/views.py:1793
+#: part/templates/part/bom.html:62 part/views.py:1791
msgid "Export Bill of Materials"
msgstr "Stückliste exportieren"
@@ -3221,6 +3286,12 @@ msgstr ""
msgid "Match Fields"
msgstr ""
+#: part/templates/part/bom_upload/select_fields.html:62
+#, fuzzy
+#| msgid "Duplicate part selected"
+msgid "Duplicate column selection"
+msgstr "Teil doppelt ausgewählt"
+
#: part/templates/part/bom_upload/select_parts.html:10
#, fuzzy
#| msgid "Step 1 of 2 - Select Part Suppliers"
@@ -3289,7 +3360,7 @@ msgstr "Neuen Bau beginnen"
msgid "All parts"
msgstr "Alle Teile"
-#: part/templates/part/category.html:24 part/views.py:2184
+#: part/templates/part/category.html:24 part/views.py:2182
msgid "Create new part category"
msgstr "Teilkategorie anlegen"
@@ -3379,7 +3450,7 @@ msgstr "Teilkategorie anlegen"
msgid "Create new Part Category"
msgstr "Teilkategorie anlegen"
-#: part/templates/part/category.html:216 stock/views.py:1342
+#: part/templates/part/category.html:216 stock/views.py:1358
msgid "Create new Stock Location"
msgstr "Neuen Lager-Standort erstellen"
@@ -3451,7 +3522,7 @@ msgstr "Einheiten"
msgid "Minimum Stock"
msgstr "Minimaler Lagerbestand"
-#: part/templates/part/detail.html:114 templates/js/order.js:263
+#: part/templates/part/detail.html:114 templates/js/order.js:270
msgid "Creation Date"
msgstr "Erstelldatum"
@@ -3472,7 +3543,7 @@ msgid "Part is not a virtual part"
msgstr "Teil ist nicht virtuell"
#: part/templates/part/detail.html:148 stock/forms.py:249
-#: templates/js/table_filters.js:23 templates/js/table_filters.js:248
+#: templates/js/table_filters.js:23 templates/js/table_filters.js:252
msgid "Template"
msgstr "Vorlage"
@@ -3554,7 +3625,7 @@ msgstr "Parameter hinzufügen"
msgid "New Parameter"
msgstr "Neuer Parameter"
-#: part/templates/part/params.html:25 stock/models.py:1419
+#: part/templates/part/params.html:25 stock/models.py:1420
#: templates/js/stock.js:112
msgid "Value"
msgstr "Wert"
@@ -3725,7 +3796,7 @@ msgstr "Teil entfernen"
msgid "Part Stock"
msgstr "Teilbestand"
-#: part/templates/part/stock_count.html:7 templates/js/bom.js:224
+#: part/templates/part/stock_count.html:7 templates/js/bom.js:230
#: templates/js/part.js:442
msgid "No Stock"
msgstr "Kein Bestand"
@@ -3885,7 +3956,7 @@ msgstr "Teil kopiert"
msgid "Possible matches exist - confirm creation of new part"
msgstr ""
-#: part/views.py:592 templates/js/stock.js:840
+#: part/views.py:592 templates/js/stock.js:844
msgid "Create New Part"
msgstr "Neues Teil anlegen"
@@ -3949,109 +4020,109 @@ msgstr "Stückliste validieren"
msgid "No BOM file provided"
msgstr "Keine Stückliste angegeben"
-#: part/views.py:1505
+#: part/views.py:1503
msgid "Enter a valid quantity"
msgstr "Bitte eine gültige Anzahl eingeben"
-#: part/views.py:1530 part/views.py:1533
+#: part/views.py:1528 part/views.py:1531
msgid "Select valid part"
msgstr "Bitte ein gültiges Teil auswählen"
-#: part/views.py:1539
+#: part/views.py:1537
msgid "Duplicate part selected"
msgstr "Teil doppelt ausgewählt"
-#: part/views.py:1577
+#: part/views.py:1575
msgid "Select a part"
msgstr "Teil auswählen"
-#: part/views.py:1583
+#: part/views.py:1581
#, fuzzy
#| msgid "Select part to be used in BOM"
msgid "Selected part creates a circular BOM"
msgstr "Teil für die Nutzung in der Stückliste auswählen"
-#: part/views.py:1587
+#: part/views.py:1585
msgid "Specify quantity"
msgstr "Anzahl angeben"
-#: part/views.py:1843
+#: part/views.py:1841
msgid "Confirm Part Deletion"
msgstr "Löschen des Teils bestätigen"
-#: part/views.py:1852
+#: part/views.py:1850
msgid "Part was deleted"
msgstr "Teil wurde gelöscht"
-#: part/views.py:1861
+#: part/views.py:1859
msgid "Part Pricing"
msgstr "Teilbepreisung"
-#: part/views.py:1975
+#: part/views.py:1973
msgid "Create Part Parameter Template"
msgstr "Teilparametervorlage anlegen"
-#: part/views.py:1985
+#: part/views.py:1983
msgid "Edit Part Parameter Template"
msgstr "Teilparametervorlage bearbeiten"
-#: part/views.py:1994
+#: part/views.py:1992
msgid "Delete Part Parameter Template"
msgstr "Teilparametervorlage löschen"
-#: part/views.py:2004
+#: part/views.py:2002
msgid "Create Part Parameter"
msgstr "Teilparameter anlegen"
-#: part/views.py:2056
+#: part/views.py:2054
msgid "Edit Part Parameter"
msgstr "Teilparameter bearbeiten"
-#: part/views.py:2072
+#: part/views.py:2070
msgid "Delete Part Parameter"
msgstr "Teilparameter löschen"
-#: part/views.py:2131
+#: part/views.py:2129
msgid "Edit Part Category"
msgstr "Teilkategorie bearbeiten"
-#: part/views.py:2168
+#: part/views.py:2166
msgid "Delete Part Category"
msgstr "Teilkategorie löschen"
-#: part/views.py:2176
+#: part/views.py:2174
msgid "Part category was deleted"
msgstr "Teilekategorie wurde gelöscht"
-#: part/views.py:2232
+#: part/views.py:2230
#, fuzzy
#| msgid "Create Part Parameter Template"
msgid "Create Category Parameter Template"
msgstr "Teilparametervorlage anlegen"
-#: part/views.py:2335
+#: part/views.py:2333
#, fuzzy
#| msgid "Edit Part Parameter Template"
msgid "Edit Category Parameter Template"
msgstr "Teilparametervorlage bearbeiten"
-#: part/views.py:2393
+#: part/views.py:2391
#, fuzzy
#| msgid "Delete Part Parameter Template"
msgid "Delete Category Parameter Template"
msgstr "Teilparametervorlage löschen"
-#: part/views.py:2418
+#: part/views.py:2416
#, fuzzy
#| msgid "Create BOM item"
msgid "Create BOM Item"
msgstr "BOM-Position anlegen"
-#: part/views.py:2486
+#: part/views.py:2488
msgid "Edit BOM item"
msgstr "BOM-Position beaarbeiten"
-#: part/views.py:2536
+#: part/views.py:2545
msgid "Confim BOM item deletion"
msgstr "Löschung von BOM-Position bestätigen"
@@ -4081,11 +4152,11 @@ msgstr "Zuliefererbeschreibung des Teils"
msgid "Part query filters (comma-separated list of key=value pairs)"
msgstr ""
-#: report/models.py:227
+#: report/models.py:230
msgid "Report asset file"
msgstr ""
-#: report/models.py:230
+#: report/models.py:233
#, fuzzy
#| msgid "Settings description"
msgid "Asset file description"
@@ -4159,7 +4230,7 @@ msgstr "Ziel-Lagerbestand"
msgid "Add note (required)"
msgstr ""
-#: stock/forms.py:371 stock/views.py:920 stock/views.py:1118
+#: stock/forms.py:371 stock/views.py:935 stock/views.py:1133
msgid "Confirm stock adjustment"
msgstr "Bestands-Anpassung bestätigen"
@@ -4284,153 +4355,153 @@ msgstr "Objekt löschen wenn Lagerbestand aufgebraucht"
msgid "Stock Item Notes"
msgstr "Lagerobjekt-Notizen"
-#: stock/models.py:458
+#: stock/models.py:459
msgid "Single unit purchase price at time of purchase"
msgstr ""
-#: stock/models.py:509
+#: stock/models.py:510
#, fuzzy
#| msgid "Item assigned to customer?"
msgid "Assigned to Customer"
msgstr "Ist dieses Objekt einem Kunden zugeteilt?"
-#: stock/models.py:511
+#: stock/models.py:512
#, fuzzy
#| msgid "Item assigned to customer?"
msgid "Manually assigned to customer"
msgstr "Ist dieses Objekt einem Kunden zugeteilt?"
-#: stock/models.py:524
+#: stock/models.py:525
#, fuzzy
#| msgid "Item assigned to customer?"
msgid "Returned from customer"
msgstr "Ist dieses Objekt einem Kunden zugeteilt?"
-#: stock/models.py:526
+#: stock/models.py:527
#, fuzzy
#| msgid "Create new stock location"
msgid "Returned to location"
msgstr "Neuen Lagerort anlegen"
-#: stock/models.py:651
+#: stock/models.py:652
#, fuzzy
#| msgid "Installed in Stock Item"
msgid "Installed into stock item"
msgstr "In Lagerobjekt installiert"
-#: stock/models.py:659
+#: stock/models.py:660
#, fuzzy
#| msgid "Installed in Stock Item"
msgid "Installed stock item"
msgstr "In Lagerobjekt installiert"
-#: stock/models.py:683
+#: stock/models.py:684
#, fuzzy
#| msgid "Installed in Stock Item"
msgid "Uninstalled stock item"
msgstr "In Lagerobjekt installiert"
-#: stock/models.py:702
+#: stock/models.py:703
#, fuzzy
#| msgid "Include sublocations"
msgid "Uninstalled into location"
msgstr "Unterlagerorte einschließen"
-#: stock/models.py:802
+#: stock/models.py:803
#, fuzzy
#| msgid "Part is not a virtual part"
msgid "Part is not set as trackable"
msgstr "Teil ist nicht virtuell"
-#: stock/models.py:808
+#: stock/models.py:809
msgid "Quantity must be integer"
msgstr "Anzahl muss eine Ganzzahl sein"
-#: stock/models.py:814
+#: stock/models.py:815
#, python-brace-format
msgid "Quantity must not exceed available stock quantity ({n})"
msgstr "Anzahl darf nicht die verfügbare Anzahl überschreiten ({n})"
-#: stock/models.py:817
+#: stock/models.py:818
msgid "Serial numbers must be a list of integers"
msgstr "Seriennummern muss eine Liste von Ganzzahlen sein"
-#: stock/models.py:820
+#: stock/models.py:821
msgid "Quantity does not match serial numbers"
msgstr "Anzahl stimmt nicht mit den Seriennummern überein"
-#: stock/models.py:852
+#: stock/models.py:853
msgid "Add serial number"
msgstr "Seriennummer hinzufügen"
-#: stock/models.py:855
+#: stock/models.py:856
#, python-brace-format
msgid "Serialized {n} items"
msgstr "{n} Teile serialisiert"
-#: stock/models.py:966
+#: stock/models.py:967
msgid "StockItem cannot be moved as it is not in stock"
msgstr "Lagerobjekt kann nicht bewegt werden, da kein Bestand vorhanden ist"
-#: stock/models.py:1320
+#: stock/models.py:1321
msgid "Tracking entry title"
msgstr "Name des Eintrags-Trackings"
-#: stock/models.py:1322
+#: stock/models.py:1323
msgid "Entry notes"
msgstr "Eintrags-Notizen"
-#: stock/models.py:1324
+#: stock/models.py:1325
msgid "Link to external page for further information"
msgstr "Link auf externe Seite für weitere Informationen"
-#: stock/models.py:1384
+#: stock/models.py:1385
#, fuzzy
#| msgid "Serial number for this item"
msgid "Value must be provided for this test"
msgstr "Seriennummer für dieses Teil"
-#: stock/models.py:1390
+#: stock/models.py:1391
msgid "Attachment must be uploaded for this test"
msgstr ""
-#: stock/models.py:1407
+#: stock/models.py:1408
msgid "Test"
msgstr ""
-#: stock/models.py:1408
+#: stock/models.py:1409
#, fuzzy
#| msgid "Part name"
msgid "Test name"
msgstr "Name des Teils"
-#: stock/models.py:1413
+#: stock/models.py:1414
#, fuzzy
#| msgid "Search Results"
msgid "Result"
msgstr "Suchergebnisse"
-#: stock/models.py:1414 templates/js/table_filters.js:162
+#: stock/models.py:1415 templates/js/table_filters.js:162
msgid "Test result"
msgstr ""
-#: stock/models.py:1420
+#: stock/models.py:1421
msgid "Test output value"
msgstr ""
-#: stock/models.py:1426
+#: stock/models.py:1427
#, fuzzy
#| msgid "Attachments"
msgid "Attachment"
msgstr "Anhänge"
-#: stock/models.py:1427
+#: stock/models.py:1428
#, fuzzy
#| msgid "Delete attachment"
msgid "Test result attachment"
msgstr "Anhang löschen"
-#: stock/models.py:1433
+#: stock/models.py:1434
#, fuzzy
#| msgid "Edit notes"
msgid "Test notes"
@@ -4547,7 +4618,7 @@ msgstr "Ist dieses Objekt einem Kunden zugeteilt?"
msgid "Return to stock"
msgstr "Bestand zählen"
-#: stock/templates/stock/item_base.html:138 templates/js/stock.js:981
+#: stock/templates/stock/item_base.html:138 templates/js/stock.js:985
#, fuzzy
#| msgid "Installed in Stock Item"
msgid "Uninstall stock item"
@@ -4596,7 +4667,7 @@ msgstr ""
msgid "Stock Item Details"
msgstr "Lagerbestands-Details"
-#: stock/templates/stock/item_base.html:231 templates/js/build.js:426
+#: stock/templates/stock/item_base.html:231 templates/js/build.js:442
#, fuzzy
#| msgid "No stock location set"
msgid "No location set"
@@ -4608,7 +4679,7 @@ msgstr "Kein Lagerort gesetzt"
msgid "Barcode Identifier"
msgstr "Eindeutiger Bezeichner"
-#: stock/templates/stock/item_base.html:252 templates/js/build.js:626
+#: stock/templates/stock/item_base.html:252 templates/js/build.js:642
#: templates/navbar.html:25
msgid "Build"
msgstr "Bau"
@@ -4743,8 +4814,8 @@ msgstr "Sub-Standorte"
#: stock/templates/stock/location.html:79
#: stock/templates/stock/location.html:94
-#: templates/InvenTree/search_stock_items.html:6 templates/stats.html:21
-#: templates/stats.html:30
+#: templates/InvenTree/search_stock_items.html:6 templates/stats.html:48
+#: templates/stats.html:57
msgid "Stock Items"
msgstr "Lagerobjekte"
@@ -4753,7 +4824,7 @@ msgid "Stock Details"
msgstr "Objekt-Details"
#: stock/templates/stock/location.html:89
-#: templates/InvenTree/search_stock_location.html:6 templates/stats.html:25
+#: templates/InvenTree/search_stock_location.html:6 templates/stats.html:52
msgid "Stock Locations"
msgstr "Lagerobjekt-Standorte"
@@ -4769,7 +4840,7 @@ msgstr "Sind Sie sicher, dass Sie diesen Anhang löschen wollen?"
msgid "The following stock items will be uninstalled"
msgstr "Die folgenden Objekte werden erstellt"
-#: stock/templates/stock/stockitem_convert.html:7 stock/views.py:1314
+#: stock/templates/stock/stockitem_convert.html:7 stock/views.py:1330
#, fuzzy
#| msgid "Count Stock Items"
msgid "Convert Stock Item"
@@ -4905,162 +4976,145 @@ msgstr "Vorlage löschen"
msgid "Select Test Report Template"
msgstr "Vorlage löschen"
-#: stock/views.py:522
+#: stock/views.py:537
#, fuzzy
#| msgid "Select valid part"
msgid "Select valid template"
msgstr "Bitte ein gültiges Teil auswählen"
-#: stock/views.py:575
+#: stock/views.py:590
msgid "Stock Export Options"
msgstr "Lagerbestandsexportoptionen"
-#: stock/views.py:697
+#: stock/views.py:712
msgid "Stock Item QR Code"
msgstr "Lagerobjekt-QR-Code"
-#: stock/views.py:723
+#: stock/views.py:738
#, fuzzy
#| msgid "Installed in Stock Item"
msgid "Install Stock Item"
msgstr "In Lagerobjekt installiert"
-#: stock/views.py:823
+#: stock/views.py:838
#, fuzzy
#| msgid "Installed in Stock Item"
msgid "Uninstall Stock Items"
msgstr "In Lagerobjekt installiert"
-#: stock/views.py:931
+#: stock/views.py:946
#, fuzzy
#| msgid "Installed in Stock Item"
msgid "Uninstalled stock items"
msgstr "In Lagerobjekt installiert"
-#: stock/views.py:956
+#: stock/views.py:971
msgid "Adjust Stock"
msgstr "Lagerbestand anpassen"
-#: stock/views.py:1066
+#: stock/views.py:1081
msgid "Move Stock Items"
msgstr "Lagerobjekte bewegen"
-#: stock/views.py:1067
+#: stock/views.py:1082
msgid "Count Stock Items"
msgstr "Lagerobjekte zählen"
-#: stock/views.py:1068
+#: stock/views.py:1083
msgid "Remove From Stock"
msgstr "Aus Lagerbestand entfernen"
-#: stock/views.py:1069
+#: stock/views.py:1084
msgid "Add Stock Items"
msgstr "Lagerobjekte hinzufügen"
-#: stock/views.py:1070
+#: stock/views.py:1085
msgid "Delete Stock Items"
msgstr "Lagerobjekte löschen"
-#: stock/views.py:1098
+#: stock/views.py:1113
msgid "Must enter integer value"
msgstr "Nur Ganzzahl eingeben"
-#: stock/views.py:1103
+#: stock/views.py:1118
msgid "Quantity must be positive"
msgstr "Anzahl muss positiv sein"
-#: stock/views.py:1110
+#: stock/views.py:1125
#, python-brace-format
msgid "Quantity must not exceed {x}"
msgstr "Anzahl darf {x} nicht überschreiten"
-#: stock/views.py:1189
+#: stock/views.py:1204
#, python-brace-format
msgid "Added stock to {n} items"
msgstr "Vorrat zu {n} Lagerobjekten hinzugefügt"
-#: stock/views.py:1204
+#: stock/views.py:1219
#, python-brace-format
msgid "Removed stock from {n} items"
msgstr "Vorrat von {n} Lagerobjekten entfernt"
-#: stock/views.py:1217
+#: stock/views.py:1232
#, python-brace-format
msgid "Counted stock for {n} items"
msgstr "Bestand für {n} Objekte erfasst"
-#: stock/views.py:1245
+#: stock/views.py:1260
msgid "No items were moved"
msgstr "Keine Lagerobjekte wurden bewegt"
-#: stock/views.py:1248
+#: stock/views.py:1263
#, python-brace-format
msgid "Moved {n} items to {dest}"
msgstr "{n} Teile nach {dest} bewegt"
-#: stock/views.py:1267
+#: stock/views.py:1282
#, python-brace-format
msgid "Deleted {n} stock items"
msgstr "{n} Teile im Lager gelöscht"
-#: stock/views.py:1279
+#: stock/views.py:1294
msgid "Edit Stock Item"
msgstr "Lagerobjekt bearbeiten"
-#: stock/views.py:1364
+#: stock/views.py:1380
msgid "Serialize Stock"
msgstr "Lagerbestand erfassen"
-#: stock/views.py:1458 templates/js/build.js:210
+#: stock/views.py:1474 templates/js/build.js:210
msgid "Create new Stock Item"
msgstr "Neues Lagerobjekt hinzufügen"
-#: stock/views.py:1559
+#: stock/views.py:1578
#, fuzzy
#| msgid "Count stock items"
msgid "Duplicate Stock Item"
msgstr "Lagerobjekte zählen"
-#: stock/views.py:1634
-msgid "Invalid quantity"
-msgstr "Ungültige Menge"
-
-#: stock/views.py:1637
+#: stock/views.py:1650
#, fuzzy
#| msgid "Quantity must be greater than zero"
-msgid "Quantity cannot be less than zero"
+msgid "Quantity cannot be negative"
msgstr "Anzahl muss größer Null sein"
-#: stock/views.py:1641
-msgid "Invalid part selection"
-msgstr "Ungültige Teileauswahl"
-
-#: stock/views.py:1689
-#, python-brace-format
-msgid "Created {n} new stock items"
-msgstr "{n} neue Lagerobjekte erstellt"
-
-#: stock/views.py:1708 stock/views.py:1724
-msgid "Created new stock item"
-msgstr "Neues Lagerobjekt erstellt"
-
-#: stock/views.py:1743
+#: stock/views.py:1736
msgid "Delete Stock Location"
msgstr "Standort löschen"
-#: stock/views.py:1757
+#: stock/views.py:1750
msgid "Delete Stock Item"
msgstr "Lagerobjekt löschen"
-#: stock/views.py:1769
+#: stock/views.py:1762
msgid "Delete Stock Tracking Entry"
msgstr "Lagerbestands-Tracking-Eintrag löschen"
-#: stock/views.py:1788
+#: stock/views.py:1781
msgid "Edit Stock Tracking Entry"
msgstr "Lagerbestands-Tracking-Eintrag bearbeiten"
-#: stock/views.py:1798
+#: stock/views.py:1791
msgid "Add Stock Tracking Entry"
msgstr "Lagerbestands-Tracking-Eintrag hinzufügen"
@@ -5088,6 +5142,12 @@ msgstr "Teil existiert nicht"
msgid "BOM Waiting Validation"
msgstr ""
+#: templates/InvenTree/build_overdue.html:7
+#, fuzzy
+#| msgid "Parent Build"
+msgid "Overdue Builds"
+msgstr "Eltern-Bau"
+
#: templates/InvenTree/build_pending.html:7
#, fuzzy
#| msgid "Parent Build"
@@ -5233,7 +5293,7 @@ msgid "Edit setting"
msgstr "Einstellungen"
#: templates/InvenTree/settings/settings.html:7
-#: templates/InvenTree/settings/settings.html:13 templates/navbar.html:62
+#: templates/InvenTree/settings/settings.html:13 templates/navbar.html:66
msgid "Settings"
msgstr "Einstellungen"
@@ -5351,34 +5411,30 @@ msgid "InvenTree Version Information"
msgstr "InvenTree-Versionsinformationen"
#: templates/about.html:21
-msgid "Instance Name"
-msgstr "Instanzname"
-
-#: templates/about.html:26
msgid "InvenTree Version"
msgstr "InvenTree-Version"
-#: templates/about.html:30
+#: templates/about.html:25
msgid "Django Version"
msgstr "Django-Version"
-#: templates/about.html:34
+#: templates/about.html:29
msgid "Commit Hash"
msgstr "Commit-Hash"
-#: templates/about.html:38
+#: templates/about.html:33
msgid "Commit Date"
msgstr "Commit-Datum"
-#: templates/about.html:42
+#: templates/about.html:37
msgid "InvenTree Documentation"
msgstr "InvenTree-Dokumentation"
-#: templates/about.html:47
+#: templates/about.html:42
msgid "View Code on GitHub"
msgstr "Code auf GitHub ansehen"
-#: templates/about.html:51
+#: templates/about.html:46
msgid "Submit Bug Report"
msgstr "Fehlerbericht senden"
@@ -5505,55 +5561,55 @@ msgstr "Vorrat zu {n} Lagerobjekten hinzugefügt"
msgid "Barcode does not match Stock Item"
msgstr "Neues Lagerobjekt hinzufügen"
-#: templates/js/bom.js:159
+#: templates/js/bom.js:165
msgid "Open subassembly"
msgstr "Unterbaugruppe öffnen"
-#: templates/js/bom.js:200
+#: templates/js/bom.js:206
#, fuzzy
#| msgid "Options"
msgid "Optional"
msgstr "Optionen"
-#: templates/js/bom.js:240
+#: templates/js/bom.js:252
msgid "No pricing available"
msgstr "Keine Preisinformation verfügbar"
-#: templates/js/bom.js:259 templates/js/build.js:555
+#: templates/js/bom.js:272 templates/js/build.js:571
#, fuzzy
#| msgid "Options"
msgid "Actions"
msgstr "Optionen"
-#: templates/js/bom.js:267
+#: templates/js/bom.js:280
msgid "Validate BOM Item"
msgstr "BOM-Position validieren"
-#: templates/js/bom.js:269
+#: templates/js/bom.js:282
msgid "This line has been validated"
msgstr "Diese Position wurde validiert"
-#: templates/js/bom.js:271
+#: templates/js/bom.js:284
msgid "Edit BOM Item"
msgstr "BOM-Position bearbeiten"
-#: templates/js/bom.js:273
+#: templates/js/bom.js:286
msgid "Delete BOM Item"
msgstr "BOM-Position löschen"
-#: templates/js/bom.js:346 templates/js/build.js:289
+#: templates/js/bom.js:363 templates/js/build.js:305
msgid "No BOM items found"
msgstr "Keine BOM-Einträge gefunden"
-#: templates/js/bom.js:491
+#: templates/js/bom.js:509
msgid "INACTIVE"
msgstr "INAKTIV"
-#: templates/js/bom.js:505
+#: templates/js/bom.js:523
msgid "Uses"
msgstr ""
-#: templates/js/bom.js:516
+#: templates/js/bom.js:534
#, fuzzy
#| msgid "No matching action found"
msgid "No matching parts found"
@@ -5587,37 +5643,43 @@ msgstr "Bau entfernt"
msgid "New Stock Item"
msgstr "Neues Lagerobjekt"
-#: templates/js/build.js:477
+#: templates/js/build.js:493
#, fuzzy
#| msgid "Required"
msgid "Required Part"
msgstr "benötigt"
-#: templates/js/build.js:498
+#: templates/js/build.js:514
#, fuzzy
#| msgid "Quantity"
msgid "Quantity Per"
msgstr "Anzahl"
-#: templates/js/build.js:562
+#: templates/js/build.js:578
#, fuzzy
#| msgid "Builds"
msgid "Build stock"
msgstr "Baue"
-#: templates/js/build.js:566 templates/stock_table.html:25
+#: templates/js/build.js:582 templates/stock_table.html:25
msgid "Order stock"
msgstr "Bestand bestellen"
-#: templates/js/build.js:569
+#: templates/js/build.js:585
msgid "Allocate stock"
msgstr "Lagerbestand zuweisen"
-#: templates/js/build.js:610
+#: templates/js/build.js:626
msgid "No builds matching query"
msgstr "Keine Baue passen zur Anfrage"
-#: templates/js/build.js:720
+#: templates/js/build.js:656
+#, fuzzy
+#| msgid "Build order allocation is complete"
+msgid "Build order is overdue"
+msgstr "Bau-Zuweisung ist vollständig"
+
+#: templates/js/build.js:747
msgid "No parts allocated for"
msgstr "Keine Teile zugeordnet zu"
@@ -5653,19 +5715,19 @@ msgstr "Baugruppe"
msgid "Link"
msgstr "Link"
-#: templates/js/order.js:128
+#: templates/js/order.js:135
msgid "No purchase orders found"
msgstr "Keine Bestellungen gefunden"
-#: templates/js/order.js:181 templates/js/stock.js:677
+#: templates/js/order.js:188 templates/js/stock.js:681
msgid "Date"
msgstr "Datum"
-#: templates/js/order.js:211
+#: templates/js/order.js:218
msgid "No sales orders found"
msgstr "Keine Aufträge gefunden"
-#: templates/js/order.js:268
+#: templates/js/order.js:275
msgid "Shipment Date"
msgstr "Versanddatum"
@@ -5700,7 +5762,7 @@ msgid "No parts found"
msgstr "Keine Teile gefunden"
#: templates/js/part.js:343 templates/js/stock.js:456
-#: templates/js/stock.js:1013
+#: templates/js/stock.js:1017
msgid "Select"
msgstr "Auswählen"
@@ -5708,7 +5770,7 @@ msgstr "Auswählen"
msgid "No category"
msgstr "Keine Kategorie"
-#: templates/js/part.js:429 templates/js/table_filters.js:256
+#: templates/js/part.js:429 templates/js/table_filters.js:260
msgid "Low stock"
msgstr "Bestand niedrig"
@@ -5832,45 +5894,51 @@ msgstr "Lagerobjekt wurde zugewiesen"
msgid "Stock item has been installed in another item"
msgstr "Ist dieses Teil in einem anderen verbaut?"
-#: templates/js/stock.js:541
+#: templates/js/stock.js:542
#, fuzzy
#| msgid "StockItem has been allocated"
msgid "Stock item has been rejected"
msgstr "Lagerobjekt wurde zugewiesen"
-#: templates/js/stock.js:545
+#: templates/js/stock.js:546
#, fuzzy
#| msgid "StockItem is lost"
msgid "Stock item is lost"
msgstr "Lagerobjekt verloren"
-#: templates/js/stock.js:549 templates/js/table_filters.js:106
+#: templates/js/stock.js:549
+#, fuzzy
+#| msgid "StockItem is lost"
+msgid "Stock item is destroyed"
+msgstr "Lagerobjekt verloren"
+
+#: templates/js/stock.js:553 templates/js/table_filters.js:106
#, fuzzy
#| msgid "Delete"
msgid "Depleted"
msgstr "Löschen"
-#: templates/js/stock.js:743
+#: templates/js/stock.js:747
msgid "No user information"
msgstr "Keine Benutzerinformation"
-#: templates/js/stock.js:852
+#: templates/js/stock.js:856
msgid "Create New Location"
msgstr "Neuen Standort anlegen"
-#: templates/js/stock.js:951
+#: templates/js/stock.js:955
#, fuzzy
#| msgid "Serial Number"
msgid "Serial"
msgstr "Seriennummer"
-#: templates/js/stock.js:1044 templates/js/table_filters.js:121
+#: templates/js/stock.js:1048 templates/js/table_filters.js:121
#, fuzzy
#| msgid "Installed In"
msgid "Installed"
msgstr "Installiert in"
-#: templates/js/stock.js:1069
+#: templates/js/stock.js:1073
#, fuzzy
#| msgid "Installed In"
msgid "Install item"
@@ -5931,7 +5999,7 @@ msgstr "Seriennummer"
msgid "Batch code"
msgstr "Losnummer"
-#: templates/js/table_filters.js:91 templates/js/table_filters.js:223
+#: templates/js/table_filters.js:91 templates/js/table_filters.js:227
msgid "Active parts"
msgstr "Aktive Teile"
@@ -5999,47 +6067,47 @@ msgstr "Bestandsstatus"
msgid "Build status"
msgstr "Bau-Status"
-#: templates/js/table_filters.js:196 templates/js/table_filters.js:209
+#: templates/js/table_filters.js:200 templates/js/table_filters.js:213
msgid "Order status"
msgstr "Bestellstatus"
-#: templates/js/table_filters.js:201 templates/js/table_filters.js:214
+#: templates/js/table_filters.js:205 templates/js/table_filters.js:218
#, fuzzy
#| msgid "Cascading"
msgid "Outstanding"
msgstr "Kaskadierend"
-#: templates/js/table_filters.js:233
+#: templates/js/table_filters.js:237
msgid "Include subcategories"
msgstr "Unterkategorien einschließen"
-#: templates/js/table_filters.js:234
+#: templates/js/table_filters.js:238
msgid "Include parts in subcategories"
msgstr "Teile in Unterkategorien einschließen"
-#: templates/js/table_filters.js:238
+#: templates/js/table_filters.js:242
msgid "Has IPN"
msgstr ""
-#: templates/js/table_filters.js:239
+#: templates/js/table_filters.js:243
#, fuzzy
#| msgid "Internal Part Number"
msgid "Part has internal part number"
msgstr "Interne Teilenummer"
-#: templates/js/table_filters.js:244
+#: templates/js/table_filters.js:248
msgid "Show active parts"
msgstr "Aktive Teile anzeigen"
-#: templates/js/table_filters.js:252
+#: templates/js/table_filters.js:256
msgid "Stock available"
msgstr "Bestand verfügbar"
-#: templates/js/table_filters.js:268
+#: templates/js/table_filters.js:272
msgid "Starred"
msgstr "Favorit"
-#: templates/js/table_filters.js:280
+#: templates/js/table_filters.js:284
msgid "Purchasable"
msgstr "Käuflich"
@@ -6069,30 +6137,54 @@ msgstr "Verkaufen"
msgid "Scan Barcode"
msgstr ""
-#: templates/navbar.html:59 users/models.py:27
+#: templates/navbar.html:57
+msgid "InvenTree server issues detected"
+msgstr ""
+
+#: templates/navbar.html:63 users/models.py:27
msgid "Admin"
msgstr "Admin"
-#: templates/navbar.html:63
+#: templates/navbar.html:67
msgid "Logout"
msgstr "Ausloggen"
-#: templates/navbar.html:65
+#: templates/navbar.html:69
msgid "Login"
msgstr "Einloggen"
-#: templates/navbar.html:68
+#: templates/navbar.html:80
msgid "About InvenTree"
msgstr "Über InvenBaum"
-#: templates/navbar.html:69
-msgid "Statistics"
-msgstr "Statistiken"
-
#: templates/search_form.html:6 templates/search_form.html:8
msgid "Search"
msgstr "Suche"
+#: templates/stats.html:9
+msgid "Server"
+msgstr ""
+
+#: templates/stats.html:13
+msgid "Instance Name"
+msgstr "Instanzname"
+
+#: templates/stats.html:18
+#, fuzzy
+#| msgid "Order status"
+msgid "Server status"
+msgstr "Bestellstatus"
+
+#: templates/stats.html:21
+msgid "Healthy"
+msgstr ""
+
+#: templates/stats.html:23
+#, fuzzy
+#| msgid "Issue Order"
+msgid "Issues detected"
+msgstr "Bestellung aufgeben"
+
#: templates/stock_table.html:6
#, fuzzy
#| msgid "Edit Stock Location"
@@ -6153,23 +6245,23 @@ msgstr "Benutzer"
msgid "Select which users are assigned to this group"
msgstr ""
-#: users/admin.py:120
+#: users/admin.py:178
msgid "The following users are members of multiple groups:"
msgstr ""
-#: users/admin.py:143
+#: users/admin.py:201
#, fuzzy
#| msgid "External Link"
msgid "Personal info"
msgstr "Externer Link"
-#: users/admin.py:144
+#: users/admin.py:202
#, fuzzy
#| msgid "Revision"
msgid "Permissions"
msgstr "Revision"
-#: users/admin.py:147
+#: users/admin.py:205
#, fuzzy
#| msgid "Import BOM data"
msgid "Important dates"
@@ -6215,6 +6307,33 @@ msgstr ""
msgid "Permission to delete items"
msgstr "Ausgewählte Stücklistenpositionen entfernen"
+#~ msgid "Database Statistics"
+#~ msgstr "Datenbankstatistiken"
+
+#~ msgid "BOM Price"
+#~ msgstr "Stücklistenpreis"
+
+#~ msgid "BOM pricing is incomplete"
+#~ msgstr "Stücklistenbepreisung ist unvollständig"
+
+#~ msgid "No pricing information"
+#~ msgstr "Keine Preisinformation"
+
+#~ msgid "Invalid quantity"
+#~ msgstr "Ungültige Menge"
+
+#~ msgid "Invalid part selection"
+#~ msgstr "Ungültige Teileauswahl"
+
+#~ msgid "Created {n} new stock items"
+#~ msgstr "{n} neue Lagerobjekte erstellt"
+
+#~ msgid "Created new stock item"
+#~ msgstr "Neues Lagerobjekt erstellt"
+
+#~ msgid "Statistics"
+#~ msgstr "Statistiken"
+
#~ msgid "Currency Symbol e.g. $"
#~ msgstr "Währungs-Symbol (z.B. €)"
diff --git a/InvenTree/locale/en/LC_MESSAGES/django.po b/InvenTree/locale/en/LC_MESSAGES/django.po
index f6cb0f4604..6f60f8ed93 100644
--- a/InvenTree/locale/en/LC_MESSAGES/django.po
+++ b/InvenTree/locale/en/LC_MESSAGES/django.po
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2020-11-12 22:05+1100\n"
+"POT-Creation-Date: 2020-12-16 19:08+1100\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME \n"
"Language-Team: LANGUAGE \n"
@@ -18,39 +18,40 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-#: InvenTree/api.py:85
+#: InvenTree/api.py:90
msgid "No action specified"
msgstr ""
-#: InvenTree/api.py:99
+#: InvenTree/api.py:104
msgid "No matching action found"
msgstr ""
-#: InvenTree/forms.py:108 build/forms.py:82 build/forms.py:170
+#: InvenTree/forms.py:110 build/forms.py:91 build/forms.py:179
msgid "Confirm"
msgstr ""
-#: InvenTree/forms.py:124
+#: InvenTree/forms.py:126
msgid "Confirm item deletion"
msgstr ""
-#: InvenTree/forms.py:156
+#: InvenTree/forms.py:158
msgid "Enter new password"
msgstr ""
-#: InvenTree/forms.py:163
+#: InvenTree/forms.py:165
msgid "Confirm new password"
msgstr ""
-#: InvenTree/forms.py:198
+#: InvenTree/forms.py:200
msgid "Apply Theme"
msgstr ""
-#: InvenTree/forms.py:228
+#: InvenTree/forms.py:230
msgid "Select Category"
msgstr ""
#: InvenTree/helpers.py:361 order/models.py:189 order/models.py:271
+#: stock/views.py:1646
msgid "Invalid quantity provided"
msgstr ""
@@ -90,7 +91,7 @@ msgstr ""
msgid "File comment"
msgstr ""
-#: InvenTree/models.py:68 templates/js/stock.js:734
+#: InvenTree/models.py:68 templates/js/stock.js:738
msgid "User"
msgstr ""
@@ -103,24 +104,32 @@ msgstr ""
msgid "Description (optional)"
msgstr ""
-#: InvenTree/settings.py:354
+#: InvenTree/settings.py:422
msgid "English"
msgstr ""
-#: InvenTree/settings.py:355
+#: InvenTree/settings.py:423
msgid "German"
msgstr ""
-#: InvenTree/settings.py:356
+#: InvenTree/settings.py:424
msgid "French"
msgstr ""
-#: InvenTree/settings.py:357
+#: InvenTree/settings.py:425
msgid "Polish"
msgstr ""
+#: InvenTree/status.py:24
+msgid "Celery worker check failed"
+msgstr ""
+
+#: InvenTree/status.py:27
+msgid "InvenTree system health checks failed"
+msgstr ""
+
#: InvenTree/status_codes.py:94 InvenTree/status_codes.py:135
-#: InvenTree/status_codes.py:222
+#: InvenTree/status_codes.py:223
msgid "Pending"
msgstr ""
@@ -128,12 +137,12 @@ msgstr ""
msgid "Placed"
msgstr ""
-#: InvenTree/status_codes.py:96 InvenTree/status_codes.py:225
+#: InvenTree/status_codes.py:96 InvenTree/status_codes.py:226
msgid "Complete"
msgstr ""
#: InvenTree/status_codes.py:97 InvenTree/status_codes.py:137
-#: InvenTree/status_codes.py:224
+#: InvenTree/status_codes.py:225
msgid "Cancelled"
msgstr ""
@@ -172,7 +181,7 @@ msgstr ""
msgid "Rejected"
msgstr ""
-#: InvenTree/status_codes.py:223
+#: InvenTree/status_codes.py:224
msgid "Production"
msgstr ""
@@ -210,28 +219,28 @@ msgstr ""
msgid "Overage must be an integer value or a percentage"
msgstr ""
-#: InvenTree/views.py:494
+#: InvenTree/views.py:495
msgid "Delete Item"
msgstr ""
-#: InvenTree/views.py:543
+#: InvenTree/views.py:544
msgid "Check box to confirm item deletion"
msgstr ""
-#: InvenTree/views.py:558 templates/InvenTree/settings/user.html:18
+#: InvenTree/views.py:559 templates/InvenTree/settings/user.html:18
msgid "Edit User Information"
msgstr ""
-#: InvenTree/views.py:569 templates/InvenTree/settings/user.html:22
+#: InvenTree/views.py:570 templates/InvenTree/settings/user.html:22
msgid "Set Password"
msgstr ""
-#: InvenTree/views.py:588
+#: InvenTree/views.py:589
msgid "Password fields must match"
msgstr ""
-#: InvenTree/views.py:794
-msgid "Database Statistics"
+#: InvenTree/views.py:795 templates/navbar.html:78
+msgid "System Information"
msgstr ""
#: barcode/api.py:53 barcode/api.py:150
@@ -278,9 +287,9 @@ msgstr ""
msgid "Build Order reference"
msgstr ""
-#: build/forms.py:70 build/templates/build/auto_allocate.html:17
-#: build/templates/build/build_base.html:78
-#: build/templates/build/detail.html:29 common/models.py:488
+#: build/forms.py:79 build/templates/build/auto_allocate.html:17
+#: build/templates/build/build_base.html:83
+#: build/templates/build/detail.html:29 common/models.py:494
#: company/forms.py:112 company/templates/company/supplier_part_pricing.html:75
#: order/templates/order/order_wizard/select_parts.html:32
#: order/templates/order/purchase_order_detail.html:179
@@ -293,190 +302,199 @@ msgstr ""
#: stock/templates/stock/item_base.html:46
#: stock/templates/stock/item_base.html:197
#: stock/templates/stock/stock_adjust.html:18 templates/js/barcode.js:338
-#: templates/js/bom.js:189 templates/js/build.js:404 templates/js/stock.js:725
-#: templates/js/stock.js:953
+#: templates/js/bom.js:195 templates/js/build.js:420 templates/js/stock.js:729
+#: templates/js/stock.js:957
msgid "Quantity"
msgstr ""
-#: build/forms.py:71
+#: build/forms.py:80
msgid "Enter quantity for build output"
msgstr ""
-#: build/forms.py:75 stock/forms.py:111
+#: build/forms.py:84 stock/forms.py:111
msgid "Serial numbers"
msgstr ""
-#: build/forms.py:77
+#: build/forms.py:86
msgid "Enter serial numbers for build outputs"
msgstr ""
-#: build/forms.py:83
+#: build/forms.py:92
msgid "Confirm creation of build outut"
msgstr ""
-#: build/forms.py:103
+#: build/forms.py:112
msgid "Confirm deletion of build output"
msgstr ""
-#: build/forms.py:124
+#: build/forms.py:133
msgid "Confirm unallocation of stock"
msgstr ""
-#: build/forms.py:148
+#: build/forms.py:157
msgid "Confirm stock allocation"
msgstr ""
-#: build/forms.py:171
+#: build/forms.py:180
msgid "Mark build as complete"
msgstr ""
-#: build/forms.py:195
+#: build/forms.py:204
msgid "Location of completed parts"
msgstr ""
-#: build/forms.py:200
+#: build/forms.py:209
msgid "Confirm completion with incomplete stock allocation"
msgstr ""
-#: build/forms.py:203
+#: build/forms.py:212
msgid "Confirm build completion"
msgstr ""
-#: build/forms.py:223 build/views.py:68
+#: build/forms.py:232 build/views.py:68
msgid "Confirm build cancellation"
msgstr ""
-#: build/forms.py:237
+#: build/forms.py:246
msgid "Select quantity of stock to allocate"
msgstr ""
-#: build/models.py:56 build/templates/build/build_base.html:8
+#: build/models.py:59 build/templates/build/build_base.html:8
#: build/templates/build/build_base.html:35
#: part/templates/part/allocation.html:20
msgid "Build Order"
msgstr ""
-#: build/models.py:57 build/templates/build/index.html:6
+#: build/models.py:60 build/templates/build/index.html:6
#: build/templates/build/index.html:14 order/templates/order/so_builds.html:11
#: order/templates/order/so_tabs.html:9 part/templates/part/tabs.html:31
#: templates/InvenTree/settings/tabs.html:28 users/models.py:30
msgid "Build Orders"
msgstr ""
-#: build/models.py:72
+#: build/models.py:75
msgid "Build Order Reference"
msgstr ""
-#: build/models.py:73 order/templates/order/purchase_order_detail.html:174
-#: templates/js/bom.js:181 templates/js/build.js:493
+#: build/models.py:76 order/templates/order/purchase_order_detail.html:174
+#: templates/js/bom.js:187 templates/js/build.js:509
msgid "Reference"
msgstr ""
-#: build/models.py:80 build/templates/build/detail.html:19
+#: build/models.py:83 build/templates/build/detail.html:19
#: company/templates/company/detail.html:23
#: company/templates/company/supplier_part_base.html:61
#: company/templates/company/supplier_part_detail.html:27
#: order/templates/order/purchase_order_detail.html:161
#: part/templates/part/detail.html:51 part/templates/part/set_category.html:14
-#: templates/InvenTree/search.html:147 templates/js/bom.js:174
-#: templates/js/bom.js:499 templates/js/build.js:642 templates/js/company.js:56
-#: templates/js/order.js:168 templates/js/order.js:250 templates/js/part.js:188
+#: templates/InvenTree/search.html:147 templates/js/bom.js:180
+#: templates/js/bom.js:517 templates/js/build.js:664 templates/js/company.js:56
+#: templates/js/order.js:175 templates/js/order.js:257 templates/js/part.js:188
#: templates/js/part.js:271 templates/js/part.js:391 templates/js/part.js:572
-#: templates/js/stock.js:494 templates/js/stock.js:706
+#: templates/js/stock.js:494 templates/js/stock.js:710
msgid "Description"
msgstr ""
-#: build/models.py:83
+#: build/models.py:86
msgid "Brief description of the build"
msgstr ""
-#: build/models.py:91 build/templates/build/build_base.html:94
+#: build/models.py:95 build/templates/build/build_base.html:104
#: build/templates/build/detail.html:75
msgid "Parent Build"
msgstr ""
-#: build/models.py:92
+#: build/models.py:96
msgid "BuildOrder to which this build is allocated"
msgstr ""
-#: build/models.py:97 build/templates/build/auto_allocate.html:16
-#: build/templates/build/build_base.html:73
+#: build/models.py:101 build/templates/build/auto_allocate.html:16
+#: build/templates/build/build_base.html:78
#: build/templates/build/detail.html:24 order/models.py:530
#: order/templates/order/order_wizard/select_parts.html:30
#: order/templates/order/purchase_order_detail.html:148
#: order/templates/order/receive_parts.html:19 part/models.py:315
#: part/templates/part/part_app_base.html:7 part/templates/part/related.html:26
#: part/templates/part/set_category.html:13 templates/InvenTree/search.html:133
-#: templates/js/barcode.js:336 templates/js/bom.js:147 templates/js/bom.js:484
-#: templates/js/build.js:647 templates/js/company.js:138
+#: templates/js/barcode.js:336 templates/js/bom.js:153 templates/js/bom.js:502
+#: templates/js/build.js:669 templates/js/company.js:138
#: templates/js/part.js:252 templates/js/part.js:357 templates/js/stock.js:468
-#: templates/js/stock.js:1025
+#: templates/js/stock.js:1029
msgid "Part"
msgstr ""
-#: build/models.py:105
+#: build/models.py:109
msgid "Select part to build"
msgstr ""
-#: build/models.py:110
+#: build/models.py:114
msgid "Sales Order Reference"
msgstr ""
-#: build/models.py:114
+#: build/models.py:118
msgid "SalesOrder to which this build is allocated"
msgstr ""
-#: build/models.py:119
+#: build/models.py:123
msgid "Source Location"
msgstr ""
-#: build/models.py:123
+#: build/models.py:127
msgid ""
"Select location to take stock from for this build (leave blank to take from "
"any stock location)"
msgstr ""
-#: build/models.py:128
+#: build/models.py:132
msgid "Destination Location"
msgstr ""
-#: build/models.py:132
+#: build/models.py:136
msgid "Select location where the completed items will be stored"
msgstr ""
-#: build/models.py:136
+#: build/models.py:140
msgid "Build Quantity"
msgstr ""
-#: build/models.py:139
+#: build/models.py:143
msgid "Number of stock items to build"
msgstr ""
-#: build/models.py:143
+#: build/models.py:147
msgid "Completed items"
msgstr ""
-#: build/models.py:145
+#: build/models.py:149
msgid "Number of stock items which have been completed"
msgstr ""
-#: build/models.py:149 part/templates/part/part_base.html:155
+#: build/models.py:153 part/templates/part/part_base.html:155
msgid "Build Status"
msgstr ""
-#: build/models.py:153
+#: build/models.py:157
msgid "Build status code"
msgstr ""
-#: build/models.py:157 stock/models.py:390
+#: build/models.py:161 stock/models.py:390
msgid "Batch Code"
msgstr ""
-#: build/models.py:161
+#: build/models.py:165
msgid "Batch code for this build output"
msgstr ""
-#: build/models.py:176 build/templates/build/detail.html:89
+#: build/models.py:172
+msgid "Target completion date"
+msgstr ""
+
+#: build/models.py:173
+msgid ""
+"Target date for build completion. Build will be overdue after this date."
+msgstr ""
+
+#: build/models.py:186 build/templates/build/detail.html:89
#: company/templates/company/supplier_part_base.html:68
#: company/templates/company/supplier_part_detail.html:24
#: part/templates/part/detail.html:80 part/templates/part/part_base.html:102
@@ -484,84 +502,84 @@ msgstr ""
msgid "External Link"
msgstr ""
-#: build/models.py:177 part/models.py:672 stock/models.py:386
+#: build/models.py:187 part/models.py:672 stock/models.py:386
msgid "Link to external URL"
msgstr ""
-#: build/models.py:181 build/templates/build/tabs.html:23 company/models.py:344
+#: build/models.py:191 build/templates/build/tabs.html:23 company/models.py:344
#: company/templates/company/tabs.html:33 order/templates/order/po_tabs.html:18
#: order/templates/order/purchase_order_detail.html:213
#: order/templates/order/so_tabs.html:23 part/templates/part/tabs.html:73
#: stock/forms.py:307 stock/forms.py:339 stock/forms.py:367 stock/models.py:448
-#: stock/models.py:1432 stock/templates/stock/tabs.html:26
-#: templates/js/barcode.js:391 templates/js/bom.js:250
-#: templates/js/stock.js:116 templates/js/stock.js:578
+#: stock/models.py:1433 stock/templates/stock/tabs.html:26
+#: templates/js/barcode.js:391 templates/js/bom.js:263
+#: templates/js/stock.js:116 templates/js/stock.js:582
msgid "Notes"
msgstr ""
-#: build/models.py:182
+#: build/models.py:192
msgid "Extra build notes"
msgstr ""
-#: build/models.py:551
+#: build/models.py:577
msgid "No build output specified"
msgstr ""
-#: build/models.py:554
+#: build/models.py:580
msgid "Build output is already completed"
msgstr ""
-#: build/models.py:557
+#: build/models.py:583
msgid "Build output does not match Build Order"
msgstr ""
-#: build/models.py:632
+#: build/models.py:658
msgid "Completed build output"
msgstr ""
-#: build/models.py:870
+#: build/models.py:896
msgid "BuildItem must be unique for build, stock_item and install_into"
msgstr ""
-#: build/models.py:892
+#: build/models.py:918
msgid "Build item must specify a build output"
msgstr ""
-#: build/models.py:897
+#: build/models.py:923
#, python-brace-format
msgid "Selected stock item not found in BOM for part '{p}'"
msgstr ""
-#: build/models.py:901
+#: build/models.py:927
#, python-brace-format
msgid "Allocated quantity ({n}) must not exceed available quantity ({q})"
msgstr ""
-#: build/models.py:908 order/models.py:614
+#: build/models.py:934 order/models.py:614
msgid "StockItem is over-allocated"
msgstr ""
-#: build/models.py:912 order/models.py:617
+#: build/models.py:938 order/models.py:617
msgid "Allocation quantity must be greater than zero"
msgstr ""
-#: build/models.py:916
+#: build/models.py:942
msgid "Quantity must be 1 for serialized stock"
msgstr ""
-#: build/models.py:956
+#: build/models.py:982
msgid "Build to allocate parts"
msgstr ""
-#: build/models.py:963
+#: build/models.py:989
msgid "Source stock item"
msgstr ""
-#: build/models.py:975
+#: build/models.py:1001
msgid "Stock quantity to allocate to build"
msgstr ""
-#: build/models.py:983
+#: build/models.py:1009
msgid "Destination stock item"
msgstr ""
@@ -591,7 +609,7 @@ msgstr ""
msgid "Order Parts"
msgstr ""
-#: build/templates/build/allocate.html:33 templates/js/build.js:574
+#: build/templates/build/allocate.html:33 templates/js/build.js:590
msgid "Unallocate stock"
msgstr ""
@@ -630,7 +648,7 @@ msgstr ""
#: stock/templates/stock/item_base.html:227
#: stock/templates/stock/stock_adjust.html:17
#: templates/InvenTree/search.html:183 templates/js/barcode.js:337
-#: templates/js/build.js:418 templates/js/stock.js:570
+#: templates/js/build.js:434 templates/js/stock.js:574
msgid "Location"
msgstr ""
@@ -660,49 +678,58 @@ msgstr ""
msgid "Admin view"
msgstr ""
-#: build/templates/build/build_base.html:46
+#: build/templates/build/build_base.html:43
+#: build/templates/build/build_base.html:92 templates/js/table_filters.js:190
+msgid "Overdue"
+msgstr ""
+
+#: build/templates/build/build_base.html:51
msgid "Edit Build"
msgstr ""
-#: build/templates/build/build_base.html:50
+#: build/templates/build/build_base.html:55
msgid "Complete Build"
msgstr ""
-#: build/templates/build/build_base.html:53 build/views.py:58
+#: build/templates/build/build_base.html:58 build/views.py:58
msgid "Cancel Build"
msgstr ""
-#: build/templates/build/build_base.html:59 build/views.py:767
+#: build/templates/build/build_base.html:64
msgid "Delete Build"
msgstr ""
-#: build/templates/build/build_base.html:69 build/templates/build/detail.html:9
+#: build/templates/build/build_base.html:74 build/templates/build/detail.html:9
msgid "Build Details"
msgstr ""
-#: build/templates/build/build_base.html:83
+#: build/templates/build/build_base.html:88
#: build/templates/build/detail.html:57
#: order/templates/order/receive_parts.html:24
#: stock/templates/stock/item_base.html:312 templates/InvenTree/search.html:175
-#: templates/js/barcode.js:42 templates/js/build.js:675
-#: templates/js/order.js:173 templates/js/order.js:255
-#: templates/js/stock.js:557 templates/js/stock.js:961
+#: templates/js/barcode.js:42 templates/js/build.js:697
+#: templates/js/order.js:180 templates/js/order.js:262
+#: templates/js/stock.js:561 templates/js/stock.js:965
msgid "Status"
msgstr ""
-#: build/templates/build/build_base.html:88
+#: build/templates/build/build_base.html:92
+msgid "This build was due on"
+msgstr ""
+
+#: build/templates/build/build_base.html:98
#: build/templates/build/detail.html:62
msgid "Progress"
msgstr ""
-#: build/templates/build/build_base.html:101
+#: build/templates/build/build_base.html:111
#: build/templates/build/detail.html:82 order/models.py:528
#: order/templates/order/sales_order_base.html:9
#: order/templates/order/sales_order_base.html:33
#: order/templates/order/sales_order_notes.html:10
#: order/templates/order/sales_order_ship.html:25
#: part/templates/part/allocation.html:27
-#: stock/templates/stock/item_base.html:221 templates/js/order.js:222
+#: stock/templates/stock/item_base.html:221 templates/js/order.js:229
msgid "Sales Order"
msgstr ""
@@ -803,35 +830,35 @@ msgid "Destination location not specified"
msgstr ""
#: build/templates/build/detail.html:68
-#: stock/templates/stock/item_base.html:245 templates/js/stock.js:565
-#: templates/js/stock.js:968 templates/js/table_filters.js:80
+#: stock/templates/stock/item_base.html:245 templates/js/stock.js:569
+#: templates/js/stock.js:972 templates/js/table_filters.js:80
#: templates/js/table_filters.js:151
msgid "Batch"
msgstr ""
#: build/templates/build/detail.html:95
#: order/templates/order/order_base.html:98
-#: order/templates/order/sales_order_base.html:100 templates/js/build.js:683
+#: order/templates/order/sales_order_base.html:100 templates/js/build.js:705
msgid "Created"
msgstr ""
-#: build/templates/build/detail.html:105
-msgid "BOM Price"
+#: build/templates/build/detail.html:100 templates/js/build.js:710
+msgid "Target Date"
msgstr ""
-#: build/templates/build/detail.html:110
-msgid "BOM pricing is incomplete"
+#: build/templates/build/detail.html:106
+msgid "No target date set"
msgstr ""
-#: build/templates/build/detail.html:113
-msgid "No pricing information"
-msgstr ""
-
-#: build/templates/build/detail.html:120 templates/js/build.js:661
-#: templates/js/build.js:688
+#: build/templates/build/detail.html:111 templates/js/build.js:683
+#: templates/js/build.js:715
msgid "Completed"
msgstr ""
+#: build/templates/build/detail.html:115
+msgid "Build not complete"
+msgstr ""
+
#: build/templates/build/edit_build_item.html:7
msgid "Alter the quantity of stock allocated to the build output"
msgstr ""
@@ -895,7 +922,7 @@ msgstr ""
msgid "Create Build Output"
msgstr ""
-#: build/views.py:207 stock/models.py:827 stock/views.py:1660
+#: build/views.py:207 stock/models.py:828 stock/views.py:1667
msgid "Serial numbers already exist"
msgstr ""
@@ -956,13 +983,17 @@ msgid "Created new build"
msgstr ""
#: build/views.py:724
-msgid "Edit Build Details"
+msgid "Edit Build Order Details"
msgstr ""
#: build/views.py:758
msgid "Edited build"
msgstr ""
+#: build/views.py:767
+msgid "Delete Build Order"
+msgstr ""
+
#: build/views.py:784
msgid "Removed parts from build allocation"
msgstr ""
@@ -979,8 +1010,8 @@ msgstr ""
msgid "Stock item is over-allocated"
msgstr ""
-#: build/views.py:847 templates/js/bom.js:215 templates/js/build.js:503
-#: templates/js/build.js:731
+#: build/views.py:847 templates/js/bom.js:221 templates/js/build.js:519
+#: templates/js/build.js:758
msgid "Available"
msgstr ""
@@ -1094,7 +1125,7 @@ msgid "Copy category parameter templates when creating a part"
msgstr ""
#: common/models.py:115 part/models.py:743 part/templates/part/detail.html:168
-#: templates/js/table_filters.js:264
+#: templates/js/table_filters.js:268
msgid "Component"
msgstr ""
@@ -1111,7 +1142,7 @@ msgid "Parts are purchaseable by default"
msgstr ""
#: common/models.py:129 part/models.py:759 part/templates/part/detail.html:198
-#: templates/js/table_filters.js:272
+#: templates/js/table_filters.js:276
msgid "Salable"
msgstr ""
@@ -1120,7 +1151,7 @@ msgid "Parts are salable by default"
msgstr ""
#: common/models.py:136 part/models.py:749 part/templates/part/detail.html:178
-#: templates/js/table_filters.js:31 templates/js/table_filters.js:276
+#: templates/js/table_filters.js:31 templates/js/table_filters.js:280
msgid "Trackable"
msgstr ""
@@ -1160,36 +1191,36 @@ msgstr ""
msgid "Prefix value for purchase order reference"
msgstr ""
-#: common/models.py:373
+#: common/models.py:376
msgid "Settings key (must be unique - case insensitive"
msgstr ""
-#: common/models.py:375
+#: common/models.py:378
msgid "Settings value"
msgstr ""
-#: common/models.py:431
+#: common/models.py:437
msgid "Value must be a boolean value"
msgstr ""
-#: common/models.py:445
+#: common/models.py:451
msgid "Key string must be unique"
msgstr ""
-#: common/models.py:489 company/forms.py:113
+#: common/models.py:495 company/forms.py:113
msgid "Price break quantity"
msgstr ""
-#: common/models.py:497 company/templates/company/supplier_part_pricing.html:80
-#: part/templates/part/sale_prices.html:87 templates/js/bom.js:234
+#: common/models.py:503 company/templates/company/supplier_part_pricing.html:80
+#: part/templates/part/sale_prices.html:87 templates/js/bom.js:246
msgid "Price"
msgstr ""
-#: common/models.py:498
+#: common/models.py:504
msgid "Unit price at specified quantity"
msgstr ""
-#: common/models.py:521
+#: common/models.py:527
msgid "Default"
msgstr ""
@@ -1201,6 +1232,14 @@ msgstr ""
msgid "Change Setting"
msgstr ""
+#: common/views.py:94
+msgid "Supplied value is not allowed"
+msgstr ""
+
+#: common/views.py:103
+msgid "Supplied value must be a boolean"
+msgstr ""
+
#: company/forms.py:37 company/models.py:139
msgid "Default currency used for this company"
msgstr ""
@@ -1324,7 +1363,7 @@ msgid "Part packaging"
msgstr ""
#: company/templates/company/assigned_stock.html:9
-#: company/templates/company/tabs.html:25 templates/js/build.js:395
+#: company/templates/company/tabs.html:25 templates/js/build.js:411
msgid "Assigned Stock"
msgstr ""
@@ -1367,14 +1406,14 @@ msgstr ""
#: order/templates/order/order_base.html:79
#: order/templates/order/order_wizard/select_pos.html:30 part/bom.py:170
#: stock/templates/stock/item_base.html:287 templates/js/company.js:48
-#: templates/js/company.js:164 templates/js/order.js:155
+#: templates/js/company.js:164 templates/js/order.js:162
msgid "Supplier"
msgstr ""
#: company/templates/company/detail.html:62
#: order/templates/order/sales_order_base.html:81 stock/models.py:373
#: stock/models.py:374 stock/templates/stock/item_base.html:204
-#: templates/js/company.js:40 templates/js/order.js:237
+#: templates/js/company.js:40 templates/js/order.js:244
msgid "Customer"
msgstr ""
@@ -1389,7 +1428,7 @@ msgstr ""
#: company/templates/company/detail_part.html:18
#: order/templates/order/purchase_order_detail.html:68
-#: part/templates/part/supplier.html:14 templates/js/stock.js:845
+#: part/templates/part/supplier.html:14 templates/js/stock.js:849
msgid "New Supplier Part"
msgstr ""
@@ -1413,7 +1452,7 @@ msgid "Delete Parts"
msgstr ""
#: company/templates/company/detail_part.html:63
-#: part/templates/part/category.html:116 templates/js/stock.js:839
+#: part/templates/part/category.html:116 templates/js/stock.js:843
msgid "New Part"
msgstr ""
@@ -1562,8 +1601,8 @@ msgstr ""
msgid "Pricing Information"
msgstr ""
-#: company/templates/company/supplier_part_pricing.html:17 company/views.py:459
-#: part/templates/part/sale_prices.html:14 part/views.py:2546
+#: company/templates/company/supplier_part_pricing.html:17 company/views.py:486
+#: part/templates/part/sale_prices.html:14 part/views.py:2555
msgid "Add Price Break"
msgstr ""
@@ -1608,7 +1647,7 @@ msgstr ""
#: part/templates/part/cat_link.html:7 part/templates/part/category.html:94
#: part/templates/part/category_tabs.html:6
#: templates/InvenTree/settings/tabs.html:22 templates/navbar.html:19
-#: templates/stats.html:8 templates/stats.html:17 users/models.py:28
+#: templates/stats.html:35 templates/stats.html:44 users/models.py:28
msgid "Parts"
msgstr ""
@@ -1677,23 +1716,23 @@ msgstr ""
msgid "Edit Supplier Part"
msgstr ""
-#: company/views.py:289 templates/js/stock.js:846
+#: company/views.py:295 templates/js/stock.js:850
msgid "Create new Supplier Part"
msgstr ""
-#: company/views.py:388
+#: company/views.py:415
msgid "Delete Supplier Part"
msgstr ""
-#: company/views.py:465 part/views.py:2552
+#: company/views.py:492 part/views.py:2561
msgid "Added new price break"
msgstr ""
-#: company/views.py:521 part/views.py:2596
+#: company/views.py:548 part/views.py:2605
msgid "Edit Price Break"
msgstr ""
-#: company/views.py:537 part/views.py:2612
+#: company/views.py:564 part/views.py:2621
msgid "Delete Price Break"
msgstr ""
@@ -1786,8 +1825,8 @@ msgstr ""
msgid "Date order was completed"
msgstr ""
-#: order/models.py:187 order/models.py:269 part/views.py:1496
-#: stock/models.py:244 stock/models.py:811
+#: order/models.py:187 order/models.py:269 part/views.py:1494
+#: stock/models.py:244 stock/models.py:812
msgid "Quantity must be greater than zero"
msgstr ""
@@ -1825,7 +1864,7 @@ msgstr ""
#: order/models.py:486 order/templates/order/order_base.html:9
#: order/templates/order/order_base.html:24
-#: stock/templates/stock/item_base.html:259 templates/js/order.js:139
+#: stock/templates/stock/item_base.html:259 templates/js/order.js:146
msgid "Purchase Order"
msgstr ""
@@ -1837,7 +1876,7 @@ msgstr ""
msgid "Number of items received"
msgstr ""
-#: order/models.py:509 stock/models.py:457
+#: order/models.py:509 stock/models.py:458
#: stock/templates/stock/item_base.html:266
msgid "Purchase Price"
msgstr ""
@@ -1902,7 +1941,7 @@ msgstr ""
msgid "Order Status"
msgstr ""
-#: order/templates/order/order_base.html:85 templates/js/order.js:162
+#: order/templates/order/order_base.html:85 templates/js/order.js:169
msgid "Supplier Reference"
msgstr ""
@@ -1934,11 +1973,11 @@ msgid "Step 1 of 2 - Select Part Suppliers"
msgstr ""
#: order/templates/order/order_wizard/select_parts.html:14
-msgid "Select suppliers."
+msgid "Select suppliers"
msgstr ""
#: order/templates/order/order_wizard/select_parts.html:18
-msgid "No purchaseable parts selected."
+msgid "No purchaseable parts selected"
msgstr ""
#: order/templates/order/order_wizard/select_parts.html:31
@@ -1958,7 +1997,7 @@ msgid "Select existing purchase orders, or create new orders."
msgstr ""
#: order/templates/order/order_wizard/select_pos.html:31
-#: templates/js/order.js:186 templates/js/order.js:273
+#: templates/js/order.js:193 templates/js/order.js:280
msgid "Items"
msgstr ""
@@ -1996,7 +2035,7 @@ msgstr ""
#: order/templates/order/purchase_order_detail.html:39
#: order/templates/order/purchase_order_detail.html:119
#: part/templates/part/category.html:173 part/templates/part/category.html:215
-#: templates/js/stock.js:851
+#: templates/js/stock.js:855
msgid "New Location"
msgstr ""
@@ -2065,7 +2104,7 @@ msgstr ""
msgid "Sales Order Details"
msgstr ""
-#: order/templates/order/sales_order_base.html:87 templates/js/order.js:244
+#: order/templates/order/sales_order_base.html:87 templates/js/order.js:251
msgid "Customer Reference"
msgstr ""
@@ -2082,23 +2121,23 @@ msgstr ""
#: order/templates/order/sales_order_detail.html:72
#: order/templates/order/sales_order_detail.html:154 stock/models.py:378
-#: stock/templates/stock/item_base.html:191 templates/js/build.js:402
+#: stock/templates/stock/item_base.html:191 templates/js/build.js:418
msgid "Serial Number"
msgstr ""
-#: order/templates/order/sales_order_detail.html:96 templates/js/build.js:443
-#: templates/js/build.js:742
+#: order/templates/order/sales_order_detail.html:96 templates/js/build.js:459
+#: templates/js/build.js:769
msgid "Edit stock allocation"
msgstr ""
-#: order/templates/order/sales_order_detail.html:97 templates/js/build.js:445
-#: templates/js/build.js:743
+#: order/templates/order/sales_order_detail.html:97 templates/js/build.js:461
+#: templates/js/build.js:770
msgid "Delete stock allocation"
msgstr ""
#: order/templates/order/sales_order_detail.html:225
-#: part/templates/part/tabs.html:23 templates/js/build.js:507
-#: templates/js/build.js:738
+#: part/templates/part/tabs.html:23 templates/js/build.js:523
+#: templates/js/build.js:765
msgid "Allocated"
msgstr ""
@@ -2366,7 +2405,7 @@ msgstr ""
msgid "Include part supplier data in exported BOM"
msgstr ""
-#: part/forms.py:92 part/models.py:1715
+#: part/forms.py:92 part/models.py:1717
msgid "Parent Part"
msgstr ""
@@ -2446,13 +2485,13 @@ msgstr ""
msgid "Default keywords for parts in this category"
msgstr ""
-#: part/models.py:77 part/models.py:1760
+#: part/models.py:77 part/models.py:1762
#: part/templates/part/part_app_base.html:9
msgid "Part Category"
msgstr ""
#: part/models.py:78 part/templates/part/category.html:18
-#: part/templates/part/category.html:89 templates/stats.html:12
+#: part/templates/part/category.html:89 templates/stats.html:39
msgid "Part Categories"
msgstr ""
@@ -2530,7 +2569,7 @@ msgid "Stock keeping units for this part"
msgstr ""
#: part/models.py:737 part/templates/part/detail.html:158
-#: templates/js/table_filters.js:260
+#: templates/js/table_filters.js:264
msgid "Assembly"
msgstr ""
@@ -2556,7 +2595,7 @@ msgstr ""
#: part/models.py:764 part/templates/part/detail.html:215
#: templates/js/table_filters.js:19 templates/js/table_filters.js:55
-#: templates/js/table_filters.js:186 templates/js/table_filters.js:243
+#: templates/js/table_filters.js:186 templates/js/table_filters.js:247
msgid "Active"
msgstr ""
@@ -2581,126 +2620,130 @@ msgstr ""
msgid "Stored BOM checksum"
msgstr ""
-#: part/models.py:1588
+#: part/models.py:1590
msgid "Test templates can only be created for trackable parts"
msgstr ""
-#: part/models.py:1605
+#: part/models.py:1607
msgid "Test with this name already exists for this part"
msgstr ""
-#: part/models.py:1624 templates/js/part.js:567 templates/js/stock.js:92
+#: part/models.py:1626 templates/js/part.js:567 templates/js/stock.js:92
msgid "Test Name"
msgstr ""
-#: part/models.py:1625
+#: part/models.py:1627
msgid "Enter a name for the test"
msgstr ""
-#: part/models.py:1630
+#: part/models.py:1632
msgid "Test Description"
msgstr ""
-#: part/models.py:1631
+#: part/models.py:1633
msgid "Enter description for this test"
msgstr ""
-#: part/models.py:1636 templates/js/part.js:576
+#: part/models.py:1638 templates/js/part.js:576
#: templates/js/table_filters.js:172
msgid "Required"
msgstr ""
-#: part/models.py:1637
+#: part/models.py:1639
msgid "Is this test required to pass?"
msgstr ""
-#: part/models.py:1642 templates/js/part.js:584
+#: part/models.py:1644 templates/js/part.js:584
msgid "Requires Value"
msgstr ""
-#: part/models.py:1643
+#: part/models.py:1645
msgid "Does this test require a value when adding a test result?"
msgstr ""
-#: part/models.py:1648 templates/js/part.js:591
+#: part/models.py:1650 templates/js/part.js:591
msgid "Requires Attachment"
msgstr ""
-#: part/models.py:1649
+#: part/models.py:1651
msgid "Does this test require a file attachment when adding a test result?"
msgstr ""
-#: part/models.py:1682
+#: part/models.py:1684
msgid "Parameter template name must be unique"
msgstr ""
-#: part/models.py:1687
+#: part/models.py:1689
msgid "Parameter Name"
msgstr ""
-#: part/models.py:1689
+#: part/models.py:1691
msgid "Parameter Units"
msgstr ""
-#: part/models.py:1717 part/models.py:1765
+#: part/models.py:1719 part/models.py:1767
#: templates/InvenTree/settings/category.html:62
msgid "Parameter Template"
msgstr ""
-#: part/models.py:1719
+#: part/models.py:1721
msgid "Parameter Value"
msgstr ""
-#: part/models.py:1769
+#: part/models.py:1771
msgid "Default Parameter Value"
msgstr ""
-#: part/models.py:1799
+#: part/models.py:1801
msgid "Select parent part"
msgstr ""
-#: part/models.py:1807
+#: part/models.py:1809
msgid "Select part to be used in BOM"
msgstr ""
-#: part/models.py:1813
+#: part/models.py:1815
msgid "BOM quantity for this BOM item"
msgstr ""
-#: part/models.py:1815
+#: part/models.py:1817
msgid "This BOM item is optional"
msgstr ""
-#: part/models.py:1818
+#: part/models.py:1820
msgid "Estimated build wastage quantity (absolute or percentage)"
msgstr ""
-#: part/models.py:1821
+#: part/models.py:1823
msgid "BOM item reference"
msgstr ""
-#: part/models.py:1824
+#: part/models.py:1826
msgid "BOM item notes"
msgstr ""
-#: part/models.py:1826
+#: part/models.py:1828
msgid "BOM line checksum"
msgstr ""
-#: part/models.py:1893 part/views.py:1502 part/views.py:1554
+#: part/models.py:1899 part/views.py:1500 part/views.py:1552
#: stock/models.py:234
msgid "Quantity must be integer value for trackable parts"
msgstr ""
-#: part/models.py:1909
+#: part/models.py:1908 part/models.py:1910
+msgid "Sub part must be specified"
+msgstr ""
+
+#: part/models.py:1913
msgid "BOM Item"
msgstr ""
-#: part/models.py:2024
+#: part/models.py:2028
msgid "Select Related Part"
msgstr ""
-#: part/models.py:2056
+#: part/models.py:2060
msgid ""
"Error creating relationship: check that the part is not related to itself "
"and that the relationship is unique"
@@ -2722,8 +2765,8 @@ msgstr ""
#: stock/templates/stock/item_base.html:8
#: stock/templates/stock/item_base.html:72
#: stock/templates/stock/item_base.html:274
-#: stock/templates/stock/stock_adjust.html:16 templates/js/build.js:724
-#: templates/js/stock.js:695 templates/js/stock.js:944
+#: stock/templates/stock/stock_adjust.html:16 templates/js/build.js:751
+#: templates/js/stock.js:699 templates/js/stock.js:948
msgid "Stock Item"
msgstr ""
@@ -2788,7 +2831,7 @@ msgstr ""
msgid "Validate"
msgstr ""
-#: part/templates/part/bom.html:62 part/views.py:1793
+#: part/templates/part/bom.html:62 part/views.py:1791
msgid "Export Bill of Materials"
msgstr ""
@@ -2830,6 +2873,10 @@ msgstr ""
msgid "Match Fields"
msgstr ""
+#: part/templates/part/bom_upload/select_fields.html:62
+msgid "Duplicate column selection"
+msgstr ""
+
#: part/templates/part/bom_upload/select_parts.html:10
msgid "Step 3 - Select Parts"
msgstr ""
@@ -2884,7 +2931,7 @@ msgstr ""
msgid "All parts"
msgstr ""
-#: part/templates/part/category.html:24 part/views.py:2184
+#: part/templates/part/category.html:24 part/views.py:2182
msgid "Create new part category"
msgstr ""
@@ -2956,7 +3003,7 @@ msgstr ""
msgid "Create new Part Category"
msgstr ""
-#: part/templates/part/category.html:216 stock/views.py:1342
+#: part/templates/part/category.html:216 stock/views.py:1358
msgid "Create new Stock Location"
msgstr ""
@@ -3018,7 +3065,7 @@ msgstr ""
msgid "Minimum Stock"
msgstr ""
-#: part/templates/part/detail.html:114 templates/js/order.js:263
+#: part/templates/part/detail.html:114 templates/js/order.js:270
msgid "Creation Date"
msgstr ""
@@ -3039,7 +3086,7 @@ msgid "Part is not a virtual part"
msgstr ""
#: part/templates/part/detail.html:148 stock/forms.py:249
-#: templates/js/table_filters.js:23 templates/js/table_filters.js:248
+#: templates/js/table_filters.js:23 templates/js/table_filters.js:252
msgid "Template"
msgstr ""
@@ -3113,7 +3160,7 @@ msgstr ""
msgid "New Parameter"
msgstr ""
-#: part/templates/part/params.html:25 stock/models.py:1419
+#: part/templates/part/params.html:25 stock/models.py:1420
#: templates/js/stock.js:112
msgid "Value"
msgstr ""
@@ -3258,7 +3305,7 @@ msgstr ""
msgid "Part Stock"
msgstr ""
-#: part/templates/part/stock_count.html:7 templates/js/bom.js:224
+#: part/templates/part/stock_count.html:7 templates/js/bom.js:230
#: templates/js/part.js:442
msgid "No Stock"
msgstr ""
@@ -3392,7 +3439,7 @@ msgstr ""
msgid "Possible matches exist - confirm creation of new part"
msgstr ""
-#: part/views.py:592 templates/js/stock.js:840
+#: part/views.py:592 templates/js/stock.js:844
msgid "Create New Part"
msgstr ""
@@ -3448,99 +3495,99 @@ msgstr ""
msgid "No BOM file provided"
msgstr ""
-#: part/views.py:1505
+#: part/views.py:1503
msgid "Enter a valid quantity"
msgstr ""
-#: part/views.py:1530 part/views.py:1533
+#: part/views.py:1528 part/views.py:1531
msgid "Select valid part"
msgstr ""
-#: part/views.py:1539
+#: part/views.py:1537
msgid "Duplicate part selected"
msgstr ""
-#: part/views.py:1577
+#: part/views.py:1575
msgid "Select a part"
msgstr ""
-#: part/views.py:1583
+#: part/views.py:1581
msgid "Selected part creates a circular BOM"
msgstr ""
-#: part/views.py:1587
+#: part/views.py:1585
msgid "Specify quantity"
msgstr ""
-#: part/views.py:1843
+#: part/views.py:1841
msgid "Confirm Part Deletion"
msgstr ""
-#: part/views.py:1852
+#: part/views.py:1850
msgid "Part was deleted"
msgstr ""
-#: part/views.py:1861
+#: part/views.py:1859
msgid "Part Pricing"
msgstr ""
-#: part/views.py:1975
+#: part/views.py:1973
msgid "Create Part Parameter Template"
msgstr ""
-#: part/views.py:1985
+#: part/views.py:1983
msgid "Edit Part Parameter Template"
msgstr ""
-#: part/views.py:1994
+#: part/views.py:1992
msgid "Delete Part Parameter Template"
msgstr ""
-#: part/views.py:2004
+#: part/views.py:2002
msgid "Create Part Parameter"
msgstr ""
-#: part/views.py:2056
+#: part/views.py:2054
msgid "Edit Part Parameter"
msgstr ""
-#: part/views.py:2072
+#: part/views.py:2070
msgid "Delete Part Parameter"
msgstr ""
-#: part/views.py:2131
+#: part/views.py:2129
msgid "Edit Part Category"
msgstr ""
-#: part/views.py:2168
+#: part/views.py:2166
msgid "Delete Part Category"
msgstr ""
-#: part/views.py:2176
+#: part/views.py:2174
msgid "Part category was deleted"
msgstr ""
-#: part/views.py:2232
+#: part/views.py:2230
msgid "Create Category Parameter Template"
msgstr ""
-#: part/views.py:2335
+#: part/views.py:2333
msgid "Edit Category Parameter Template"
msgstr ""
-#: part/views.py:2393
+#: part/views.py:2391
msgid "Delete Category Parameter Template"
msgstr ""
-#: part/views.py:2418
+#: part/views.py:2416
msgid "Create BOM Item"
msgstr ""
-#: part/views.py:2486
+#: part/views.py:2488
msgid "Edit BOM item"
msgstr ""
-#: part/views.py:2536
+#: part/views.py:2545
msgid "Confim BOM item deletion"
msgstr ""
@@ -3564,11 +3611,11 @@ msgstr ""
msgid "Part query filters (comma-separated list of key=value pairs)"
msgstr ""
-#: report/models.py:227
+#: report/models.py:230
msgid "Report asset file"
msgstr ""
-#: report/models.py:230
+#: report/models.py:233
msgid "Asset file description"
msgstr ""
@@ -3624,7 +3671,7 @@ msgstr ""
msgid "Add note (required)"
msgstr ""
-#: stock/forms.py:371 stock/views.py:920 stock/views.py:1118
+#: stock/forms.py:371 stock/views.py:935 stock/views.py:1133
msgid "Confirm stock adjustment"
msgstr ""
@@ -3742,125 +3789,125 @@ msgstr ""
msgid "Stock Item Notes"
msgstr ""
-#: stock/models.py:458
+#: stock/models.py:459
msgid "Single unit purchase price at time of purchase"
msgstr ""
-#: stock/models.py:509
+#: stock/models.py:510
msgid "Assigned to Customer"
msgstr ""
-#: stock/models.py:511
+#: stock/models.py:512
msgid "Manually assigned to customer"
msgstr ""
-#: stock/models.py:524
+#: stock/models.py:525
msgid "Returned from customer"
msgstr ""
-#: stock/models.py:526
+#: stock/models.py:527
msgid "Returned to location"
msgstr ""
-#: stock/models.py:651
+#: stock/models.py:652
msgid "Installed into stock item"
msgstr ""
-#: stock/models.py:659
+#: stock/models.py:660
msgid "Installed stock item"
msgstr ""
-#: stock/models.py:683
+#: stock/models.py:684
msgid "Uninstalled stock item"
msgstr ""
-#: stock/models.py:702
+#: stock/models.py:703
msgid "Uninstalled into location"
msgstr ""
-#: stock/models.py:802
+#: stock/models.py:803
msgid "Part is not set as trackable"
msgstr ""
-#: stock/models.py:808
+#: stock/models.py:809
msgid "Quantity must be integer"
msgstr ""
-#: stock/models.py:814
+#: stock/models.py:815
#, python-brace-format
msgid "Quantity must not exceed available stock quantity ({n})"
msgstr ""
-#: stock/models.py:817
+#: stock/models.py:818
msgid "Serial numbers must be a list of integers"
msgstr ""
-#: stock/models.py:820
+#: stock/models.py:821
msgid "Quantity does not match serial numbers"
msgstr ""
-#: stock/models.py:852
+#: stock/models.py:853
msgid "Add serial number"
msgstr ""
-#: stock/models.py:855
+#: stock/models.py:856
#, python-brace-format
msgid "Serialized {n} items"
msgstr ""
-#: stock/models.py:966
+#: stock/models.py:967
msgid "StockItem cannot be moved as it is not in stock"
msgstr ""
-#: stock/models.py:1320
+#: stock/models.py:1321
msgid "Tracking entry title"
msgstr ""
-#: stock/models.py:1322
+#: stock/models.py:1323
msgid "Entry notes"
msgstr ""
-#: stock/models.py:1324
+#: stock/models.py:1325
msgid "Link to external page for further information"
msgstr ""
-#: stock/models.py:1384
+#: stock/models.py:1385
msgid "Value must be provided for this test"
msgstr ""
-#: stock/models.py:1390
+#: stock/models.py:1391
msgid "Attachment must be uploaded for this test"
msgstr ""
-#: stock/models.py:1407
+#: stock/models.py:1408
msgid "Test"
msgstr ""
-#: stock/models.py:1408
+#: stock/models.py:1409
msgid "Test name"
msgstr ""
-#: stock/models.py:1413
+#: stock/models.py:1414
msgid "Result"
msgstr ""
-#: stock/models.py:1414 templates/js/table_filters.js:162
+#: stock/models.py:1415 templates/js/table_filters.js:162
msgid "Test result"
msgstr ""
-#: stock/models.py:1420
+#: stock/models.py:1421
msgid "Test output value"
msgstr ""
-#: stock/models.py:1426
+#: stock/models.py:1427
msgid "Attachment"
msgstr ""
-#: stock/models.py:1427
+#: stock/models.py:1428
msgid "Test result attachment"
msgstr ""
-#: stock/models.py:1433
+#: stock/models.py:1434
msgid "Test notes"
msgstr ""
@@ -3953,7 +4000,7 @@ msgstr ""
msgid "Return to stock"
msgstr ""
-#: stock/templates/stock/item_base.html:138 templates/js/stock.js:981
+#: stock/templates/stock/item_base.html:138 templates/js/stock.js:985
msgid "Uninstall stock item"
msgstr ""
@@ -3990,7 +4037,7 @@ msgstr ""
msgid "Stock Item Details"
msgstr ""
-#: stock/templates/stock/item_base.html:231 templates/js/build.js:426
+#: stock/templates/stock/item_base.html:231 templates/js/build.js:442
msgid "No location set"
msgstr ""
@@ -3998,7 +4045,7 @@ msgstr ""
msgid "Barcode Identifier"
msgstr ""
-#: stock/templates/stock/item_base.html:252 templates/js/build.js:626
+#: stock/templates/stock/item_base.html:252 templates/js/build.js:642
#: templates/navbar.html:25
msgid "Build"
msgstr ""
@@ -4113,8 +4160,8 @@ msgstr ""
#: stock/templates/stock/location.html:79
#: stock/templates/stock/location.html:94
-#: templates/InvenTree/search_stock_items.html:6 templates/stats.html:21
-#: templates/stats.html:30
+#: templates/InvenTree/search_stock_items.html:6 templates/stats.html:48
+#: templates/stats.html:57
msgid "Stock Items"
msgstr ""
@@ -4123,7 +4170,7 @@ msgid "Stock Details"
msgstr ""
#: stock/templates/stock/location.html:89
-#: templates/InvenTree/search_stock_location.html:6 templates/stats.html:25
+#: templates/InvenTree/search_stock_location.html:6 templates/stats.html:52
msgid "Stock Locations"
msgstr ""
@@ -4135,7 +4182,7 @@ msgstr ""
msgid "The following stock items will be uninstalled"
msgstr ""
-#: stock/templates/stock/stockitem_convert.html:7 stock/views.py:1314
+#: stock/templates/stock/stockitem_convert.html:7 stock/views.py:1330
msgid "Convert Stock Item"
msgstr ""
@@ -4239,150 +4286,133 @@ msgstr ""
msgid "Select Test Report Template"
msgstr ""
-#: stock/views.py:522
+#: stock/views.py:537
msgid "Select valid template"
msgstr ""
-#: stock/views.py:575
+#: stock/views.py:590
msgid "Stock Export Options"
msgstr ""
-#: stock/views.py:697
+#: stock/views.py:712
msgid "Stock Item QR Code"
msgstr ""
-#: stock/views.py:723
+#: stock/views.py:738
msgid "Install Stock Item"
msgstr ""
-#: stock/views.py:823
+#: stock/views.py:838
msgid "Uninstall Stock Items"
msgstr ""
-#: stock/views.py:931
+#: stock/views.py:946
msgid "Uninstalled stock items"
msgstr ""
-#: stock/views.py:956
+#: stock/views.py:971
msgid "Adjust Stock"
msgstr ""
-#: stock/views.py:1066
+#: stock/views.py:1081
msgid "Move Stock Items"
msgstr ""
-#: stock/views.py:1067
+#: stock/views.py:1082
msgid "Count Stock Items"
msgstr ""
-#: stock/views.py:1068
+#: stock/views.py:1083
msgid "Remove From Stock"
msgstr ""
-#: stock/views.py:1069
+#: stock/views.py:1084
msgid "Add Stock Items"
msgstr ""
-#: stock/views.py:1070
+#: stock/views.py:1085
msgid "Delete Stock Items"
msgstr ""
-#: stock/views.py:1098
+#: stock/views.py:1113
msgid "Must enter integer value"
msgstr ""
-#: stock/views.py:1103
+#: stock/views.py:1118
msgid "Quantity must be positive"
msgstr ""
-#: stock/views.py:1110
+#: stock/views.py:1125
#, python-brace-format
msgid "Quantity must not exceed {x}"
msgstr ""
-#: stock/views.py:1189
+#: stock/views.py:1204
#, python-brace-format
msgid "Added stock to {n} items"
msgstr ""
-#: stock/views.py:1204
+#: stock/views.py:1219
#, python-brace-format
msgid "Removed stock from {n} items"
msgstr ""
-#: stock/views.py:1217
+#: stock/views.py:1232
#, python-brace-format
msgid "Counted stock for {n} items"
msgstr ""
-#: stock/views.py:1245
+#: stock/views.py:1260
msgid "No items were moved"
msgstr ""
-#: stock/views.py:1248
+#: stock/views.py:1263
#, python-brace-format
msgid "Moved {n} items to {dest}"
msgstr ""
-#: stock/views.py:1267
+#: stock/views.py:1282
#, python-brace-format
msgid "Deleted {n} stock items"
msgstr ""
-#: stock/views.py:1279
+#: stock/views.py:1294
msgid "Edit Stock Item"
msgstr ""
-#: stock/views.py:1364
+#: stock/views.py:1380
msgid "Serialize Stock"
msgstr ""
-#: stock/views.py:1458 templates/js/build.js:210
+#: stock/views.py:1474 templates/js/build.js:210
msgid "Create new Stock Item"
msgstr ""
-#: stock/views.py:1559
+#: stock/views.py:1578
msgid "Duplicate Stock Item"
msgstr ""
-#: stock/views.py:1634
-msgid "Invalid quantity"
+#: stock/views.py:1650
+msgid "Quantity cannot be negative"
msgstr ""
-#: stock/views.py:1637
-msgid "Quantity cannot be less than zero"
-msgstr ""
-
-#: stock/views.py:1641
-msgid "Invalid part selection"
-msgstr ""
-
-#: stock/views.py:1689
-#, python-brace-format
-msgid "Created {n} new stock items"
-msgstr ""
-
-#: stock/views.py:1708 stock/views.py:1724
-msgid "Created new stock item"
-msgstr ""
-
-#: stock/views.py:1743
+#: stock/views.py:1736
msgid "Delete Stock Location"
msgstr ""
-#: stock/views.py:1757
+#: stock/views.py:1750
msgid "Delete Stock Item"
msgstr ""
-#: stock/views.py:1769
+#: stock/views.py:1762
msgid "Delete Stock Tracking Entry"
msgstr ""
-#: stock/views.py:1788
+#: stock/views.py:1781
msgid "Edit Stock Tracking Entry"
msgstr ""
-#: stock/views.py:1798
+#: stock/views.py:1791
msgid "Add Stock Tracking Entry"
msgstr ""
@@ -4406,6 +4436,10 @@ msgstr ""
msgid "BOM Waiting Validation"
msgstr ""
+#: templates/InvenTree/build_overdue.html:7
+msgid "Overdue Builds"
+msgstr ""
+
#: templates/InvenTree/build_pending.html:7
msgid "Pending Builds"
msgstr ""
@@ -4513,7 +4547,7 @@ msgid "Edit setting"
msgstr ""
#: templates/InvenTree/settings/settings.html:7
-#: templates/InvenTree/settings/settings.html:13 templates/navbar.html:62
+#: templates/InvenTree/settings/settings.html:13 templates/navbar.html:66
msgid "Settings"
msgstr ""
@@ -4605,34 +4639,30 @@ msgid "InvenTree Version Information"
msgstr ""
#: templates/about.html:21
-msgid "Instance Name"
-msgstr ""
-
-#: templates/about.html:26
msgid "InvenTree Version"
msgstr ""
-#: templates/about.html:30
+#: templates/about.html:25
msgid "Django Version"
msgstr ""
-#: templates/about.html:34
+#: templates/about.html:29
msgid "Commit Hash"
msgstr ""
-#: templates/about.html:38
+#: templates/about.html:33
msgid "Commit Date"
msgstr ""
-#: templates/about.html:42
+#: templates/about.html:37
msgid "InvenTree Documentation"
msgstr ""
-#: templates/about.html:47
+#: templates/about.html:42
msgid "View Code on GitHub"
msgstr ""
-#: templates/about.html:51
+#: templates/about.html:46
msgid "Submit Bug Report"
msgstr ""
@@ -4733,51 +4763,51 @@ msgstr ""
msgid "Barcode does not match Stock Item"
msgstr ""
-#: templates/js/bom.js:159
+#: templates/js/bom.js:165
msgid "Open subassembly"
msgstr ""
-#: templates/js/bom.js:200
+#: templates/js/bom.js:206
msgid "Optional"
msgstr ""
-#: templates/js/bom.js:240
+#: templates/js/bom.js:252
msgid "No pricing available"
msgstr ""
-#: templates/js/bom.js:259 templates/js/build.js:555
+#: templates/js/bom.js:272 templates/js/build.js:571
msgid "Actions"
msgstr ""
-#: templates/js/bom.js:267
+#: templates/js/bom.js:280
msgid "Validate BOM Item"
msgstr ""
-#: templates/js/bom.js:269
+#: templates/js/bom.js:282
msgid "This line has been validated"
msgstr ""
-#: templates/js/bom.js:271
+#: templates/js/bom.js:284
msgid "Edit BOM Item"
msgstr ""
-#: templates/js/bom.js:273
+#: templates/js/bom.js:286
msgid "Delete BOM Item"
msgstr ""
-#: templates/js/bom.js:346 templates/js/build.js:289
+#: templates/js/bom.js:363 templates/js/build.js:305
msgid "No BOM items found"
msgstr ""
-#: templates/js/bom.js:491
+#: templates/js/bom.js:509
msgid "INACTIVE"
msgstr ""
-#: templates/js/bom.js:505
+#: templates/js/bom.js:523
msgid "Uses"
msgstr ""
-#: templates/js/bom.js:516
+#: templates/js/bom.js:534
msgid "No matching parts found"
msgstr ""
@@ -4801,31 +4831,35 @@ msgstr ""
msgid "New Stock Item"
msgstr ""
-#: templates/js/build.js:477
+#: templates/js/build.js:493
msgid "Required Part"
msgstr ""
-#: templates/js/build.js:498
+#: templates/js/build.js:514
msgid "Quantity Per"
msgstr ""
-#: templates/js/build.js:562
+#: templates/js/build.js:578
msgid "Build stock"
msgstr ""
-#: templates/js/build.js:566 templates/stock_table.html:25
+#: templates/js/build.js:582 templates/stock_table.html:25
msgid "Order stock"
msgstr ""
-#: templates/js/build.js:569
+#: templates/js/build.js:585
msgid "Allocate stock"
msgstr ""
-#: templates/js/build.js:610
+#: templates/js/build.js:626
msgid "No builds matching query"
msgstr ""
-#: templates/js/build.js:720
+#: templates/js/build.js:656
+msgid "Build order is overdue"
+msgstr ""
+
+#: templates/js/build.js:747
msgid "No parts allocated for"
msgstr ""
@@ -4857,19 +4891,19 @@ msgstr ""
msgid "Link"
msgstr ""
-#: templates/js/order.js:128
+#: templates/js/order.js:135
msgid "No purchase orders found"
msgstr ""
-#: templates/js/order.js:181 templates/js/stock.js:677
+#: templates/js/order.js:188 templates/js/stock.js:681
msgid "Date"
msgstr ""
-#: templates/js/order.js:211
+#: templates/js/order.js:218
msgid "No sales orders found"
msgstr ""
-#: templates/js/order.js:268
+#: templates/js/order.js:275
msgid "Shipment Date"
msgstr ""
@@ -4898,7 +4932,7 @@ msgid "No parts found"
msgstr ""
#: templates/js/part.js:343 templates/js/stock.js:456
-#: templates/js/stock.js:1013
+#: templates/js/stock.js:1017
msgid "Select"
msgstr ""
@@ -4906,7 +4940,7 @@ msgstr ""
msgid "No category"
msgstr ""
-#: templates/js/part.js:429 templates/js/table_filters.js:256
+#: templates/js/part.js:429 templates/js/table_filters.js:260
msgid "Low stock"
msgstr ""
@@ -5002,35 +5036,39 @@ msgstr ""
msgid "Stock item has been installed in another item"
msgstr ""
-#: templates/js/stock.js:541
+#: templates/js/stock.js:542
msgid "Stock item has been rejected"
msgstr ""
-#: templates/js/stock.js:545
+#: templates/js/stock.js:546
msgid "Stock item is lost"
msgstr ""
-#: templates/js/stock.js:549 templates/js/table_filters.js:106
+#: templates/js/stock.js:549
+msgid "Stock item is destroyed"
+msgstr ""
+
+#: templates/js/stock.js:553 templates/js/table_filters.js:106
msgid "Depleted"
msgstr ""
-#: templates/js/stock.js:743
+#: templates/js/stock.js:747
msgid "No user information"
msgstr ""
-#: templates/js/stock.js:852
+#: templates/js/stock.js:856
msgid "Create New Location"
msgstr ""
-#: templates/js/stock.js:951
+#: templates/js/stock.js:955
msgid "Serial"
msgstr ""
-#: templates/js/stock.js:1044 templates/js/table_filters.js:121
+#: templates/js/stock.js:1048 templates/js/table_filters.js:121
msgid "Installed"
msgstr ""
-#: templates/js/stock.js:1069
+#: templates/js/stock.js:1073
msgid "Install item"
msgstr ""
@@ -5071,7 +5109,7 @@ msgstr ""
msgid "Batch code"
msgstr ""
-#: templates/js/table_filters.js:91 templates/js/table_filters.js:223
+#: templates/js/table_filters.js:91 templates/js/table_filters.js:227
msgid "Active parts"
msgstr ""
@@ -5131,43 +5169,43 @@ msgstr ""
msgid "Build status"
msgstr ""
-#: templates/js/table_filters.js:196 templates/js/table_filters.js:209
+#: templates/js/table_filters.js:200 templates/js/table_filters.js:213
msgid "Order status"
msgstr ""
-#: templates/js/table_filters.js:201 templates/js/table_filters.js:214
+#: templates/js/table_filters.js:205 templates/js/table_filters.js:218
msgid "Outstanding"
msgstr ""
-#: templates/js/table_filters.js:233
+#: templates/js/table_filters.js:237
msgid "Include subcategories"
msgstr ""
-#: templates/js/table_filters.js:234
+#: templates/js/table_filters.js:238
msgid "Include parts in subcategories"
msgstr ""
-#: templates/js/table_filters.js:238
+#: templates/js/table_filters.js:242
msgid "Has IPN"
msgstr ""
-#: templates/js/table_filters.js:239
+#: templates/js/table_filters.js:243
msgid "Part has internal part number"
msgstr ""
-#: templates/js/table_filters.js:244
+#: templates/js/table_filters.js:248
msgid "Show active parts"
msgstr ""
-#: templates/js/table_filters.js:252
+#: templates/js/table_filters.js:256
msgid "Stock available"
msgstr ""
-#: templates/js/table_filters.js:268
+#: templates/js/table_filters.js:272
msgid "Starred"
msgstr ""
-#: templates/js/table_filters.js:280
+#: templates/js/table_filters.js:284
msgid "Purchasable"
msgstr ""
@@ -5195,30 +5233,50 @@ msgstr ""
msgid "Scan Barcode"
msgstr ""
-#: templates/navbar.html:59 users/models.py:27
+#: templates/navbar.html:57
+msgid "InvenTree server issues detected"
+msgstr ""
+
+#: templates/navbar.html:63 users/models.py:27
msgid "Admin"
msgstr ""
-#: templates/navbar.html:63
+#: templates/navbar.html:67
msgid "Logout"
msgstr ""
-#: templates/navbar.html:65
+#: templates/navbar.html:69
msgid "Login"
msgstr ""
-#: templates/navbar.html:68
+#: templates/navbar.html:80
msgid "About InvenTree"
msgstr ""
-#: templates/navbar.html:69
-msgid "Statistics"
-msgstr ""
-
#: templates/search_form.html:6 templates/search_form.html:8
msgid "Search"
msgstr ""
+#: templates/stats.html:9
+msgid "Server"
+msgstr ""
+
+#: templates/stats.html:13
+msgid "Instance Name"
+msgstr ""
+
+#: templates/stats.html:18
+msgid "Server status"
+msgstr ""
+
+#: templates/stats.html:21
+msgid "Healthy"
+msgstr ""
+
+#: templates/stats.html:23
+msgid "Issues detected"
+msgstr ""
+
#: templates/stock_table.html:6
msgid "Export Stock Information"
msgstr ""
@@ -5263,19 +5321,19 @@ msgstr ""
msgid "Select which users are assigned to this group"
msgstr ""
-#: users/admin.py:120
+#: users/admin.py:178
msgid "The following users are members of multiple groups:"
msgstr ""
-#: users/admin.py:143
+#: users/admin.py:201
msgid "Personal info"
msgstr ""
-#: users/admin.py:144
+#: users/admin.py:202
msgid "Permissions"
msgstr ""
-#: users/admin.py:147
+#: users/admin.py:205
msgid "Important dates"
msgstr ""
diff --git a/InvenTree/locale/es/LC_MESSAGES/django.po b/InvenTree/locale/es/LC_MESSAGES/django.po
index f6cb0f4604..6f60f8ed93 100644
--- a/InvenTree/locale/es/LC_MESSAGES/django.po
+++ b/InvenTree/locale/es/LC_MESSAGES/django.po
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2020-11-12 22:05+1100\n"
+"POT-Creation-Date: 2020-12-16 19:08+1100\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME \n"
"Language-Team: LANGUAGE \n"
@@ -18,39 +18,40 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-#: InvenTree/api.py:85
+#: InvenTree/api.py:90
msgid "No action specified"
msgstr ""
-#: InvenTree/api.py:99
+#: InvenTree/api.py:104
msgid "No matching action found"
msgstr ""
-#: InvenTree/forms.py:108 build/forms.py:82 build/forms.py:170
+#: InvenTree/forms.py:110 build/forms.py:91 build/forms.py:179
msgid "Confirm"
msgstr ""
-#: InvenTree/forms.py:124
+#: InvenTree/forms.py:126
msgid "Confirm item deletion"
msgstr ""
-#: InvenTree/forms.py:156
+#: InvenTree/forms.py:158
msgid "Enter new password"
msgstr ""
-#: InvenTree/forms.py:163
+#: InvenTree/forms.py:165
msgid "Confirm new password"
msgstr ""
-#: InvenTree/forms.py:198
+#: InvenTree/forms.py:200
msgid "Apply Theme"
msgstr ""
-#: InvenTree/forms.py:228
+#: InvenTree/forms.py:230
msgid "Select Category"
msgstr ""
#: InvenTree/helpers.py:361 order/models.py:189 order/models.py:271
+#: stock/views.py:1646
msgid "Invalid quantity provided"
msgstr ""
@@ -90,7 +91,7 @@ msgstr ""
msgid "File comment"
msgstr ""
-#: InvenTree/models.py:68 templates/js/stock.js:734
+#: InvenTree/models.py:68 templates/js/stock.js:738
msgid "User"
msgstr ""
@@ -103,24 +104,32 @@ msgstr ""
msgid "Description (optional)"
msgstr ""
-#: InvenTree/settings.py:354
+#: InvenTree/settings.py:422
msgid "English"
msgstr ""
-#: InvenTree/settings.py:355
+#: InvenTree/settings.py:423
msgid "German"
msgstr ""
-#: InvenTree/settings.py:356
+#: InvenTree/settings.py:424
msgid "French"
msgstr ""
-#: InvenTree/settings.py:357
+#: InvenTree/settings.py:425
msgid "Polish"
msgstr ""
+#: InvenTree/status.py:24
+msgid "Celery worker check failed"
+msgstr ""
+
+#: InvenTree/status.py:27
+msgid "InvenTree system health checks failed"
+msgstr ""
+
#: InvenTree/status_codes.py:94 InvenTree/status_codes.py:135
-#: InvenTree/status_codes.py:222
+#: InvenTree/status_codes.py:223
msgid "Pending"
msgstr ""
@@ -128,12 +137,12 @@ msgstr ""
msgid "Placed"
msgstr ""
-#: InvenTree/status_codes.py:96 InvenTree/status_codes.py:225
+#: InvenTree/status_codes.py:96 InvenTree/status_codes.py:226
msgid "Complete"
msgstr ""
#: InvenTree/status_codes.py:97 InvenTree/status_codes.py:137
-#: InvenTree/status_codes.py:224
+#: InvenTree/status_codes.py:225
msgid "Cancelled"
msgstr ""
@@ -172,7 +181,7 @@ msgstr ""
msgid "Rejected"
msgstr ""
-#: InvenTree/status_codes.py:223
+#: InvenTree/status_codes.py:224
msgid "Production"
msgstr ""
@@ -210,28 +219,28 @@ msgstr ""
msgid "Overage must be an integer value or a percentage"
msgstr ""
-#: InvenTree/views.py:494
+#: InvenTree/views.py:495
msgid "Delete Item"
msgstr ""
-#: InvenTree/views.py:543
+#: InvenTree/views.py:544
msgid "Check box to confirm item deletion"
msgstr ""
-#: InvenTree/views.py:558 templates/InvenTree/settings/user.html:18
+#: InvenTree/views.py:559 templates/InvenTree/settings/user.html:18
msgid "Edit User Information"
msgstr ""
-#: InvenTree/views.py:569 templates/InvenTree/settings/user.html:22
+#: InvenTree/views.py:570 templates/InvenTree/settings/user.html:22
msgid "Set Password"
msgstr ""
-#: InvenTree/views.py:588
+#: InvenTree/views.py:589
msgid "Password fields must match"
msgstr ""
-#: InvenTree/views.py:794
-msgid "Database Statistics"
+#: InvenTree/views.py:795 templates/navbar.html:78
+msgid "System Information"
msgstr ""
#: barcode/api.py:53 barcode/api.py:150
@@ -278,9 +287,9 @@ msgstr ""
msgid "Build Order reference"
msgstr ""
-#: build/forms.py:70 build/templates/build/auto_allocate.html:17
-#: build/templates/build/build_base.html:78
-#: build/templates/build/detail.html:29 common/models.py:488
+#: build/forms.py:79 build/templates/build/auto_allocate.html:17
+#: build/templates/build/build_base.html:83
+#: build/templates/build/detail.html:29 common/models.py:494
#: company/forms.py:112 company/templates/company/supplier_part_pricing.html:75
#: order/templates/order/order_wizard/select_parts.html:32
#: order/templates/order/purchase_order_detail.html:179
@@ -293,190 +302,199 @@ msgstr ""
#: stock/templates/stock/item_base.html:46
#: stock/templates/stock/item_base.html:197
#: stock/templates/stock/stock_adjust.html:18 templates/js/barcode.js:338
-#: templates/js/bom.js:189 templates/js/build.js:404 templates/js/stock.js:725
-#: templates/js/stock.js:953
+#: templates/js/bom.js:195 templates/js/build.js:420 templates/js/stock.js:729
+#: templates/js/stock.js:957
msgid "Quantity"
msgstr ""
-#: build/forms.py:71
+#: build/forms.py:80
msgid "Enter quantity for build output"
msgstr ""
-#: build/forms.py:75 stock/forms.py:111
+#: build/forms.py:84 stock/forms.py:111
msgid "Serial numbers"
msgstr ""
-#: build/forms.py:77
+#: build/forms.py:86
msgid "Enter serial numbers for build outputs"
msgstr ""
-#: build/forms.py:83
+#: build/forms.py:92
msgid "Confirm creation of build outut"
msgstr ""
-#: build/forms.py:103
+#: build/forms.py:112
msgid "Confirm deletion of build output"
msgstr ""
-#: build/forms.py:124
+#: build/forms.py:133
msgid "Confirm unallocation of stock"
msgstr ""
-#: build/forms.py:148
+#: build/forms.py:157
msgid "Confirm stock allocation"
msgstr ""
-#: build/forms.py:171
+#: build/forms.py:180
msgid "Mark build as complete"
msgstr ""
-#: build/forms.py:195
+#: build/forms.py:204
msgid "Location of completed parts"
msgstr ""
-#: build/forms.py:200
+#: build/forms.py:209
msgid "Confirm completion with incomplete stock allocation"
msgstr ""
-#: build/forms.py:203
+#: build/forms.py:212
msgid "Confirm build completion"
msgstr ""
-#: build/forms.py:223 build/views.py:68
+#: build/forms.py:232 build/views.py:68
msgid "Confirm build cancellation"
msgstr ""
-#: build/forms.py:237
+#: build/forms.py:246
msgid "Select quantity of stock to allocate"
msgstr ""
-#: build/models.py:56 build/templates/build/build_base.html:8
+#: build/models.py:59 build/templates/build/build_base.html:8
#: build/templates/build/build_base.html:35
#: part/templates/part/allocation.html:20
msgid "Build Order"
msgstr ""
-#: build/models.py:57 build/templates/build/index.html:6
+#: build/models.py:60 build/templates/build/index.html:6
#: build/templates/build/index.html:14 order/templates/order/so_builds.html:11
#: order/templates/order/so_tabs.html:9 part/templates/part/tabs.html:31
#: templates/InvenTree/settings/tabs.html:28 users/models.py:30
msgid "Build Orders"
msgstr ""
-#: build/models.py:72
+#: build/models.py:75
msgid "Build Order Reference"
msgstr ""
-#: build/models.py:73 order/templates/order/purchase_order_detail.html:174
-#: templates/js/bom.js:181 templates/js/build.js:493
+#: build/models.py:76 order/templates/order/purchase_order_detail.html:174
+#: templates/js/bom.js:187 templates/js/build.js:509
msgid "Reference"
msgstr ""
-#: build/models.py:80 build/templates/build/detail.html:19
+#: build/models.py:83 build/templates/build/detail.html:19
#: company/templates/company/detail.html:23
#: company/templates/company/supplier_part_base.html:61
#: company/templates/company/supplier_part_detail.html:27
#: order/templates/order/purchase_order_detail.html:161
#: part/templates/part/detail.html:51 part/templates/part/set_category.html:14
-#: templates/InvenTree/search.html:147 templates/js/bom.js:174
-#: templates/js/bom.js:499 templates/js/build.js:642 templates/js/company.js:56
-#: templates/js/order.js:168 templates/js/order.js:250 templates/js/part.js:188
+#: templates/InvenTree/search.html:147 templates/js/bom.js:180
+#: templates/js/bom.js:517 templates/js/build.js:664 templates/js/company.js:56
+#: templates/js/order.js:175 templates/js/order.js:257 templates/js/part.js:188
#: templates/js/part.js:271 templates/js/part.js:391 templates/js/part.js:572
-#: templates/js/stock.js:494 templates/js/stock.js:706
+#: templates/js/stock.js:494 templates/js/stock.js:710
msgid "Description"
msgstr ""
-#: build/models.py:83
+#: build/models.py:86
msgid "Brief description of the build"
msgstr ""
-#: build/models.py:91 build/templates/build/build_base.html:94
+#: build/models.py:95 build/templates/build/build_base.html:104
#: build/templates/build/detail.html:75
msgid "Parent Build"
msgstr ""
-#: build/models.py:92
+#: build/models.py:96
msgid "BuildOrder to which this build is allocated"
msgstr ""
-#: build/models.py:97 build/templates/build/auto_allocate.html:16
-#: build/templates/build/build_base.html:73
+#: build/models.py:101 build/templates/build/auto_allocate.html:16
+#: build/templates/build/build_base.html:78
#: build/templates/build/detail.html:24 order/models.py:530
#: order/templates/order/order_wizard/select_parts.html:30
#: order/templates/order/purchase_order_detail.html:148
#: order/templates/order/receive_parts.html:19 part/models.py:315
#: part/templates/part/part_app_base.html:7 part/templates/part/related.html:26
#: part/templates/part/set_category.html:13 templates/InvenTree/search.html:133
-#: templates/js/barcode.js:336 templates/js/bom.js:147 templates/js/bom.js:484
-#: templates/js/build.js:647 templates/js/company.js:138
+#: templates/js/barcode.js:336 templates/js/bom.js:153 templates/js/bom.js:502
+#: templates/js/build.js:669 templates/js/company.js:138
#: templates/js/part.js:252 templates/js/part.js:357 templates/js/stock.js:468
-#: templates/js/stock.js:1025
+#: templates/js/stock.js:1029
msgid "Part"
msgstr ""
-#: build/models.py:105
+#: build/models.py:109
msgid "Select part to build"
msgstr ""
-#: build/models.py:110
+#: build/models.py:114
msgid "Sales Order Reference"
msgstr ""
-#: build/models.py:114
+#: build/models.py:118
msgid "SalesOrder to which this build is allocated"
msgstr ""
-#: build/models.py:119
+#: build/models.py:123
msgid "Source Location"
msgstr ""
-#: build/models.py:123
+#: build/models.py:127
msgid ""
"Select location to take stock from for this build (leave blank to take from "
"any stock location)"
msgstr ""
-#: build/models.py:128
+#: build/models.py:132
msgid "Destination Location"
msgstr ""
-#: build/models.py:132
+#: build/models.py:136
msgid "Select location where the completed items will be stored"
msgstr ""
-#: build/models.py:136
+#: build/models.py:140
msgid "Build Quantity"
msgstr ""
-#: build/models.py:139
+#: build/models.py:143
msgid "Number of stock items to build"
msgstr ""
-#: build/models.py:143
+#: build/models.py:147
msgid "Completed items"
msgstr ""
-#: build/models.py:145
+#: build/models.py:149
msgid "Number of stock items which have been completed"
msgstr ""
-#: build/models.py:149 part/templates/part/part_base.html:155
+#: build/models.py:153 part/templates/part/part_base.html:155
msgid "Build Status"
msgstr ""
-#: build/models.py:153
+#: build/models.py:157
msgid "Build status code"
msgstr ""
-#: build/models.py:157 stock/models.py:390
+#: build/models.py:161 stock/models.py:390
msgid "Batch Code"
msgstr ""
-#: build/models.py:161
+#: build/models.py:165
msgid "Batch code for this build output"
msgstr ""
-#: build/models.py:176 build/templates/build/detail.html:89
+#: build/models.py:172
+msgid "Target completion date"
+msgstr ""
+
+#: build/models.py:173
+msgid ""
+"Target date for build completion. Build will be overdue after this date."
+msgstr ""
+
+#: build/models.py:186 build/templates/build/detail.html:89
#: company/templates/company/supplier_part_base.html:68
#: company/templates/company/supplier_part_detail.html:24
#: part/templates/part/detail.html:80 part/templates/part/part_base.html:102
@@ -484,84 +502,84 @@ msgstr ""
msgid "External Link"
msgstr ""
-#: build/models.py:177 part/models.py:672 stock/models.py:386
+#: build/models.py:187 part/models.py:672 stock/models.py:386
msgid "Link to external URL"
msgstr ""
-#: build/models.py:181 build/templates/build/tabs.html:23 company/models.py:344
+#: build/models.py:191 build/templates/build/tabs.html:23 company/models.py:344
#: company/templates/company/tabs.html:33 order/templates/order/po_tabs.html:18
#: order/templates/order/purchase_order_detail.html:213
#: order/templates/order/so_tabs.html:23 part/templates/part/tabs.html:73
#: stock/forms.py:307 stock/forms.py:339 stock/forms.py:367 stock/models.py:448
-#: stock/models.py:1432 stock/templates/stock/tabs.html:26
-#: templates/js/barcode.js:391 templates/js/bom.js:250
-#: templates/js/stock.js:116 templates/js/stock.js:578
+#: stock/models.py:1433 stock/templates/stock/tabs.html:26
+#: templates/js/barcode.js:391 templates/js/bom.js:263
+#: templates/js/stock.js:116 templates/js/stock.js:582
msgid "Notes"
msgstr ""
-#: build/models.py:182
+#: build/models.py:192
msgid "Extra build notes"
msgstr ""
-#: build/models.py:551
+#: build/models.py:577
msgid "No build output specified"
msgstr ""
-#: build/models.py:554
+#: build/models.py:580
msgid "Build output is already completed"
msgstr ""
-#: build/models.py:557
+#: build/models.py:583
msgid "Build output does not match Build Order"
msgstr ""
-#: build/models.py:632
+#: build/models.py:658
msgid "Completed build output"
msgstr ""
-#: build/models.py:870
+#: build/models.py:896
msgid "BuildItem must be unique for build, stock_item and install_into"
msgstr ""
-#: build/models.py:892
+#: build/models.py:918
msgid "Build item must specify a build output"
msgstr ""
-#: build/models.py:897
+#: build/models.py:923
#, python-brace-format
msgid "Selected stock item not found in BOM for part '{p}'"
msgstr ""
-#: build/models.py:901
+#: build/models.py:927
#, python-brace-format
msgid "Allocated quantity ({n}) must not exceed available quantity ({q})"
msgstr ""
-#: build/models.py:908 order/models.py:614
+#: build/models.py:934 order/models.py:614
msgid "StockItem is over-allocated"
msgstr ""
-#: build/models.py:912 order/models.py:617
+#: build/models.py:938 order/models.py:617
msgid "Allocation quantity must be greater than zero"
msgstr ""
-#: build/models.py:916
+#: build/models.py:942
msgid "Quantity must be 1 for serialized stock"
msgstr ""
-#: build/models.py:956
+#: build/models.py:982
msgid "Build to allocate parts"
msgstr ""
-#: build/models.py:963
+#: build/models.py:989
msgid "Source stock item"
msgstr ""
-#: build/models.py:975
+#: build/models.py:1001
msgid "Stock quantity to allocate to build"
msgstr ""
-#: build/models.py:983
+#: build/models.py:1009
msgid "Destination stock item"
msgstr ""
@@ -591,7 +609,7 @@ msgstr ""
msgid "Order Parts"
msgstr ""
-#: build/templates/build/allocate.html:33 templates/js/build.js:574
+#: build/templates/build/allocate.html:33 templates/js/build.js:590
msgid "Unallocate stock"
msgstr ""
@@ -630,7 +648,7 @@ msgstr ""
#: stock/templates/stock/item_base.html:227
#: stock/templates/stock/stock_adjust.html:17
#: templates/InvenTree/search.html:183 templates/js/barcode.js:337
-#: templates/js/build.js:418 templates/js/stock.js:570
+#: templates/js/build.js:434 templates/js/stock.js:574
msgid "Location"
msgstr ""
@@ -660,49 +678,58 @@ msgstr ""
msgid "Admin view"
msgstr ""
-#: build/templates/build/build_base.html:46
+#: build/templates/build/build_base.html:43
+#: build/templates/build/build_base.html:92 templates/js/table_filters.js:190
+msgid "Overdue"
+msgstr ""
+
+#: build/templates/build/build_base.html:51
msgid "Edit Build"
msgstr ""
-#: build/templates/build/build_base.html:50
+#: build/templates/build/build_base.html:55
msgid "Complete Build"
msgstr ""
-#: build/templates/build/build_base.html:53 build/views.py:58
+#: build/templates/build/build_base.html:58 build/views.py:58
msgid "Cancel Build"
msgstr ""
-#: build/templates/build/build_base.html:59 build/views.py:767
+#: build/templates/build/build_base.html:64
msgid "Delete Build"
msgstr ""
-#: build/templates/build/build_base.html:69 build/templates/build/detail.html:9
+#: build/templates/build/build_base.html:74 build/templates/build/detail.html:9
msgid "Build Details"
msgstr ""
-#: build/templates/build/build_base.html:83
+#: build/templates/build/build_base.html:88
#: build/templates/build/detail.html:57
#: order/templates/order/receive_parts.html:24
#: stock/templates/stock/item_base.html:312 templates/InvenTree/search.html:175
-#: templates/js/barcode.js:42 templates/js/build.js:675
-#: templates/js/order.js:173 templates/js/order.js:255
-#: templates/js/stock.js:557 templates/js/stock.js:961
+#: templates/js/barcode.js:42 templates/js/build.js:697
+#: templates/js/order.js:180 templates/js/order.js:262
+#: templates/js/stock.js:561 templates/js/stock.js:965
msgid "Status"
msgstr ""
-#: build/templates/build/build_base.html:88
+#: build/templates/build/build_base.html:92
+msgid "This build was due on"
+msgstr ""
+
+#: build/templates/build/build_base.html:98
#: build/templates/build/detail.html:62
msgid "Progress"
msgstr ""
-#: build/templates/build/build_base.html:101
+#: build/templates/build/build_base.html:111
#: build/templates/build/detail.html:82 order/models.py:528
#: order/templates/order/sales_order_base.html:9
#: order/templates/order/sales_order_base.html:33
#: order/templates/order/sales_order_notes.html:10
#: order/templates/order/sales_order_ship.html:25
#: part/templates/part/allocation.html:27
-#: stock/templates/stock/item_base.html:221 templates/js/order.js:222
+#: stock/templates/stock/item_base.html:221 templates/js/order.js:229
msgid "Sales Order"
msgstr ""
@@ -803,35 +830,35 @@ msgid "Destination location not specified"
msgstr ""
#: build/templates/build/detail.html:68
-#: stock/templates/stock/item_base.html:245 templates/js/stock.js:565
-#: templates/js/stock.js:968 templates/js/table_filters.js:80
+#: stock/templates/stock/item_base.html:245 templates/js/stock.js:569
+#: templates/js/stock.js:972 templates/js/table_filters.js:80
#: templates/js/table_filters.js:151
msgid "Batch"
msgstr ""
#: build/templates/build/detail.html:95
#: order/templates/order/order_base.html:98
-#: order/templates/order/sales_order_base.html:100 templates/js/build.js:683
+#: order/templates/order/sales_order_base.html:100 templates/js/build.js:705
msgid "Created"
msgstr ""
-#: build/templates/build/detail.html:105
-msgid "BOM Price"
+#: build/templates/build/detail.html:100 templates/js/build.js:710
+msgid "Target Date"
msgstr ""
-#: build/templates/build/detail.html:110
-msgid "BOM pricing is incomplete"
+#: build/templates/build/detail.html:106
+msgid "No target date set"
msgstr ""
-#: build/templates/build/detail.html:113
-msgid "No pricing information"
-msgstr ""
-
-#: build/templates/build/detail.html:120 templates/js/build.js:661
-#: templates/js/build.js:688
+#: build/templates/build/detail.html:111 templates/js/build.js:683
+#: templates/js/build.js:715
msgid "Completed"
msgstr ""
+#: build/templates/build/detail.html:115
+msgid "Build not complete"
+msgstr ""
+
#: build/templates/build/edit_build_item.html:7
msgid "Alter the quantity of stock allocated to the build output"
msgstr ""
@@ -895,7 +922,7 @@ msgstr ""
msgid "Create Build Output"
msgstr ""
-#: build/views.py:207 stock/models.py:827 stock/views.py:1660
+#: build/views.py:207 stock/models.py:828 stock/views.py:1667
msgid "Serial numbers already exist"
msgstr ""
@@ -956,13 +983,17 @@ msgid "Created new build"
msgstr ""
#: build/views.py:724
-msgid "Edit Build Details"
+msgid "Edit Build Order Details"
msgstr ""
#: build/views.py:758
msgid "Edited build"
msgstr ""
+#: build/views.py:767
+msgid "Delete Build Order"
+msgstr ""
+
#: build/views.py:784
msgid "Removed parts from build allocation"
msgstr ""
@@ -979,8 +1010,8 @@ msgstr ""
msgid "Stock item is over-allocated"
msgstr ""
-#: build/views.py:847 templates/js/bom.js:215 templates/js/build.js:503
-#: templates/js/build.js:731
+#: build/views.py:847 templates/js/bom.js:221 templates/js/build.js:519
+#: templates/js/build.js:758
msgid "Available"
msgstr ""
@@ -1094,7 +1125,7 @@ msgid "Copy category parameter templates when creating a part"
msgstr ""
#: common/models.py:115 part/models.py:743 part/templates/part/detail.html:168
-#: templates/js/table_filters.js:264
+#: templates/js/table_filters.js:268
msgid "Component"
msgstr ""
@@ -1111,7 +1142,7 @@ msgid "Parts are purchaseable by default"
msgstr ""
#: common/models.py:129 part/models.py:759 part/templates/part/detail.html:198
-#: templates/js/table_filters.js:272
+#: templates/js/table_filters.js:276
msgid "Salable"
msgstr ""
@@ -1120,7 +1151,7 @@ msgid "Parts are salable by default"
msgstr ""
#: common/models.py:136 part/models.py:749 part/templates/part/detail.html:178
-#: templates/js/table_filters.js:31 templates/js/table_filters.js:276
+#: templates/js/table_filters.js:31 templates/js/table_filters.js:280
msgid "Trackable"
msgstr ""
@@ -1160,36 +1191,36 @@ msgstr ""
msgid "Prefix value for purchase order reference"
msgstr ""
-#: common/models.py:373
+#: common/models.py:376
msgid "Settings key (must be unique - case insensitive"
msgstr ""
-#: common/models.py:375
+#: common/models.py:378
msgid "Settings value"
msgstr ""
-#: common/models.py:431
+#: common/models.py:437
msgid "Value must be a boolean value"
msgstr ""
-#: common/models.py:445
+#: common/models.py:451
msgid "Key string must be unique"
msgstr ""
-#: common/models.py:489 company/forms.py:113
+#: common/models.py:495 company/forms.py:113
msgid "Price break quantity"
msgstr ""
-#: common/models.py:497 company/templates/company/supplier_part_pricing.html:80
-#: part/templates/part/sale_prices.html:87 templates/js/bom.js:234
+#: common/models.py:503 company/templates/company/supplier_part_pricing.html:80
+#: part/templates/part/sale_prices.html:87 templates/js/bom.js:246
msgid "Price"
msgstr ""
-#: common/models.py:498
+#: common/models.py:504
msgid "Unit price at specified quantity"
msgstr ""
-#: common/models.py:521
+#: common/models.py:527
msgid "Default"
msgstr ""
@@ -1201,6 +1232,14 @@ msgstr ""
msgid "Change Setting"
msgstr ""
+#: common/views.py:94
+msgid "Supplied value is not allowed"
+msgstr ""
+
+#: common/views.py:103
+msgid "Supplied value must be a boolean"
+msgstr ""
+
#: company/forms.py:37 company/models.py:139
msgid "Default currency used for this company"
msgstr ""
@@ -1324,7 +1363,7 @@ msgid "Part packaging"
msgstr ""
#: company/templates/company/assigned_stock.html:9
-#: company/templates/company/tabs.html:25 templates/js/build.js:395
+#: company/templates/company/tabs.html:25 templates/js/build.js:411
msgid "Assigned Stock"
msgstr ""
@@ -1367,14 +1406,14 @@ msgstr ""
#: order/templates/order/order_base.html:79
#: order/templates/order/order_wizard/select_pos.html:30 part/bom.py:170
#: stock/templates/stock/item_base.html:287 templates/js/company.js:48
-#: templates/js/company.js:164 templates/js/order.js:155
+#: templates/js/company.js:164 templates/js/order.js:162
msgid "Supplier"
msgstr ""
#: company/templates/company/detail.html:62
#: order/templates/order/sales_order_base.html:81 stock/models.py:373
#: stock/models.py:374 stock/templates/stock/item_base.html:204
-#: templates/js/company.js:40 templates/js/order.js:237
+#: templates/js/company.js:40 templates/js/order.js:244
msgid "Customer"
msgstr ""
@@ -1389,7 +1428,7 @@ msgstr ""
#: company/templates/company/detail_part.html:18
#: order/templates/order/purchase_order_detail.html:68
-#: part/templates/part/supplier.html:14 templates/js/stock.js:845
+#: part/templates/part/supplier.html:14 templates/js/stock.js:849
msgid "New Supplier Part"
msgstr ""
@@ -1413,7 +1452,7 @@ msgid "Delete Parts"
msgstr ""
#: company/templates/company/detail_part.html:63
-#: part/templates/part/category.html:116 templates/js/stock.js:839
+#: part/templates/part/category.html:116 templates/js/stock.js:843
msgid "New Part"
msgstr ""
@@ -1562,8 +1601,8 @@ msgstr ""
msgid "Pricing Information"
msgstr ""
-#: company/templates/company/supplier_part_pricing.html:17 company/views.py:459
-#: part/templates/part/sale_prices.html:14 part/views.py:2546
+#: company/templates/company/supplier_part_pricing.html:17 company/views.py:486
+#: part/templates/part/sale_prices.html:14 part/views.py:2555
msgid "Add Price Break"
msgstr ""
@@ -1608,7 +1647,7 @@ msgstr ""
#: part/templates/part/cat_link.html:7 part/templates/part/category.html:94
#: part/templates/part/category_tabs.html:6
#: templates/InvenTree/settings/tabs.html:22 templates/navbar.html:19
-#: templates/stats.html:8 templates/stats.html:17 users/models.py:28
+#: templates/stats.html:35 templates/stats.html:44 users/models.py:28
msgid "Parts"
msgstr ""
@@ -1677,23 +1716,23 @@ msgstr ""
msgid "Edit Supplier Part"
msgstr ""
-#: company/views.py:289 templates/js/stock.js:846
+#: company/views.py:295 templates/js/stock.js:850
msgid "Create new Supplier Part"
msgstr ""
-#: company/views.py:388
+#: company/views.py:415
msgid "Delete Supplier Part"
msgstr ""
-#: company/views.py:465 part/views.py:2552
+#: company/views.py:492 part/views.py:2561
msgid "Added new price break"
msgstr ""
-#: company/views.py:521 part/views.py:2596
+#: company/views.py:548 part/views.py:2605
msgid "Edit Price Break"
msgstr ""
-#: company/views.py:537 part/views.py:2612
+#: company/views.py:564 part/views.py:2621
msgid "Delete Price Break"
msgstr ""
@@ -1786,8 +1825,8 @@ msgstr ""
msgid "Date order was completed"
msgstr ""
-#: order/models.py:187 order/models.py:269 part/views.py:1496
-#: stock/models.py:244 stock/models.py:811
+#: order/models.py:187 order/models.py:269 part/views.py:1494
+#: stock/models.py:244 stock/models.py:812
msgid "Quantity must be greater than zero"
msgstr ""
@@ -1825,7 +1864,7 @@ msgstr ""
#: order/models.py:486 order/templates/order/order_base.html:9
#: order/templates/order/order_base.html:24
-#: stock/templates/stock/item_base.html:259 templates/js/order.js:139
+#: stock/templates/stock/item_base.html:259 templates/js/order.js:146
msgid "Purchase Order"
msgstr ""
@@ -1837,7 +1876,7 @@ msgstr ""
msgid "Number of items received"
msgstr ""
-#: order/models.py:509 stock/models.py:457
+#: order/models.py:509 stock/models.py:458
#: stock/templates/stock/item_base.html:266
msgid "Purchase Price"
msgstr ""
@@ -1902,7 +1941,7 @@ msgstr ""
msgid "Order Status"
msgstr ""
-#: order/templates/order/order_base.html:85 templates/js/order.js:162
+#: order/templates/order/order_base.html:85 templates/js/order.js:169
msgid "Supplier Reference"
msgstr ""
@@ -1934,11 +1973,11 @@ msgid "Step 1 of 2 - Select Part Suppliers"
msgstr ""
#: order/templates/order/order_wizard/select_parts.html:14
-msgid "Select suppliers."
+msgid "Select suppliers"
msgstr ""
#: order/templates/order/order_wizard/select_parts.html:18
-msgid "No purchaseable parts selected."
+msgid "No purchaseable parts selected"
msgstr ""
#: order/templates/order/order_wizard/select_parts.html:31
@@ -1958,7 +1997,7 @@ msgid "Select existing purchase orders, or create new orders."
msgstr ""
#: order/templates/order/order_wizard/select_pos.html:31
-#: templates/js/order.js:186 templates/js/order.js:273
+#: templates/js/order.js:193 templates/js/order.js:280
msgid "Items"
msgstr ""
@@ -1996,7 +2035,7 @@ msgstr ""
#: order/templates/order/purchase_order_detail.html:39
#: order/templates/order/purchase_order_detail.html:119
#: part/templates/part/category.html:173 part/templates/part/category.html:215
-#: templates/js/stock.js:851
+#: templates/js/stock.js:855
msgid "New Location"
msgstr ""
@@ -2065,7 +2104,7 @@ msgstr ""
msgid "Sales Order Details"
msgstr ""
-#: order/templates/order/sales_order_base.html:87 templates/js/order.js:244
+#: order/templates/order/sales_order_base.html:87 templates/js/order.js:251
msgid "Customer Reference"
msgstr ""
@@ -2082,23 +2121,23 @@ msgstr ""
#: order/templates/order/sales_order_detail.html:72
#: order/templates/order/sales_order_detail.html:154 stock/models.py:378
-#: stock/templates/stock/item_base.html:191 templates/js/build.js:402
+#: stock/templates/stock/item_base.html:191 templates/js/build.js:418
msgid "Serial Number"
msgstr ""
-#: order/templates/order/sales_order_detail.html:96 templates/js/build.js:443
-#: templates/js/build.js:742
+#: order/templates/order/sales_order_detail.html:96 templates/js/build.js:459
+#: templates/js/build.js:769
msgid "Edit stock allocation"
msgstr ""
-#: order/templates/order/sales_order_detail.html:97 templates/js/build.js:445
-#: templates/js/build.js:743
+#: order/templates/order/sales_order_detail.html:97 templates/js/build.js:461
+#: templates/js/build.js:770
msgid "Delete stock allocation"
msgstr ""
#: order/templates/order/sales_order_detail.html:225
-#: part/templates/part/tabs.html:23 templates/js/build.js:507
-#: templates/js/build.js:738
+#: part/templates/part/tabs.html:23 templates/js/build.js:523
+#: templates/js/build.js:765
msgid "Allocated"
msgstr ""
@@ -2366,7 +2405,7 @@ msgstr ""
msgid "Include part supplier data in exported BOM"
msgstr ""
-#: part/forms.py:92 part/models.py:1715
+#: part/forms.py:92 part/models.py:1717
msgid "Parent Part"
msgstr ""
@@ -2446,13 +2485,13 @@ msgstr ""
msgid "Default keywords for parts in this category"
msgstr ""
-#: part/models.py:77 part/models.py:1760
+#: part/models.py:77 part/models.py:1762
#: part/templates/part/part_app_base.html:9
msgid "Part Category"
msgstr ""
#: part/models.py:78 part/templates/part/category.html:18
-#: part/templates/part/category.html:89 templates/stats.html:12
+#: part/templates/part/category.html:89 templates/stats.html:39
msgid "Part Categories"
msgstr ""
@@ -2530,7 +2569,7 @@ msgid "Stock keeping units for this part"
msgstr ""
#: part/models.py:737 part/templates/part/detail.html:158
-#: templates/js/table_filters.js:260
+#: templates/js/table_filters.js:264
msgid "Assembly"
msgstr ""
@@ -2556,7 +2595,7 @@ msgstr ""
#: part/models.py:764 part/templates/part/detail.html:215
#: templates/js/table_filters.js:19 templates/js/table_filters.js:55
-#: templates/js/table_filters.js:186 templates/js/table_filters.js:243
+#: templates/js/table_filters.js:186 templates/js/table_filters.js:247
msgid "Active"
msgstr ""
@@ -2581,126 +2620,130 @@ msgstr ""
msgid "Stored BOM checksum"
msgstr ""
-#: part/models.py:1588
+#: part/models.py:1590
msgid "Test templates can only be created for trackable parts"
msgstr ""
-#: part/models.py:1605
+#: part/models.py:1607
msgid "Test with this name already exists for this part"
msgstr ""
-#: part/models.py:1624 templates/js/part.js:567 templates/js/stock.js:92
+#: part/models.py:1626 templates/js/part.js:567 templates/js/stock.js:92
msgid "Test Name"
msgstr ""
-#: part/models.py:1625
+#: part/models.py:1627
msgid "Enter a name for the test"
msgstr ""
-#: part/models.py:1630
+#: part/models.py:1632
msgid "Test Description"
msgstr ""
-#: part/models.py:1631
+#: part/models.py:1633
msgid "Enter description for this test"
msgstr ""
-#: part/models.py:1636 templates/js/part.js:576
+#: part/models.py:1638 templates/js/part.js:576
#: templates/js/table_filters.js:172
msgid "Required"
msgstr ""
-#: part/models.py:1637
+#: part/models.py:1639
msgid "Is this test required to pass?"
msgstr ""
-#: part/models.py:1642 templates/js/part.js:584
+#: part/models.py:1644 templates/js/part.js:584
msgid "Requires Value"
msgstr ""
-#: part/models.py:1643
+#: part/models.py:1645
msgid "Does this test require a value when adding a test result?"
msgstr ""
-#: part/models.py:1648 templates/js/part.js:591
+#: part/models.py:1650 templates/js/part.js:591
msgid "Requires Attachment"
msgstr ""
-#: part/models.py:1649
+#: part/models.py:1651
msgid "Does this test require a file attachment when adding a test result?"
msgstr ""
-#: part/models.py:1682
+#: part/models.py:1684
msgid "Parameter template name must be unique"
msgstr ""
-#: part/models.py:1687
+#: part/models.py:1689
msgid "Parameter Name"
msgstr ""
-#: part/models.py:1689
+#: part/models.py:1691
msgid "Parameter Units"
msgstr ""
-#: part/models.py:1717 part/models.py:1765
+#: part/models.py:1719 part/models.py:1767
#: templates/InvenTree/settings/category.html:62
msgid "Parameter Template"
msgstr ""
-#: part/models.py:1719
+#: part/models.py:1721
msgid "Parameter Value"
msgstr ""
-#: part/models.py:1769
+#: part/models.py:1771
msgid "Default Parameter Value"
msgstr ""
-#: part/models.py:1799
+#: part/models.py:1801
msgid "Select parent part"
msgstr ""
-#: part/models.py:1807
+#: part/models.py:1809
msgid "Select part to be used in BOM"
msgstr ""
-#: part/models.py:1813
+#: part/models.py:1815
msgid "BOM quantity for this BOM item"
msgstr ""
-#: part/models.py:1815
+#: part/models.py:1817
msgid "This BOM item is optional"
msgstr ""
-#: part/models.py:1818
+#: part/models.py:1820
msgid "Estimated build wastage quantity (absolute or percentage)"
msgstr ""
-#: part/models.py:1821
+#: part/models.py:1823
msgid "BOM item reference"
msgstr ""
-#: part/models.py:1824
+#: part/models.py:1826
msgid "BOM item notes"
msgstr ""
-#: part/models.py:1826
+#: part/models.py:1828
msgid "BOM line checksum"
msgstr ""
-#: part/models.py:1893 part/views.py:1502 part/views.py:1554
+#: part/models.py:1899 part/views.py:1500 part/views.py:1552
#: stock/models.py:234
msgid "Quantity must be integer value for trackable parts"
msgstr ""
-#: part/models.py:1909
+#: part/models.py:1908 part/models.py:1910
+msgid "Sub part must be specified"
+msgstr ""
+
+#: part/models.py:1913
msgid "BOM Item"
msgstr ""
-#: part/models.py:2024
+#: part/models.py:2028
msgid "Select Related Part"
msgstr ""
-#: part/models.py:2056
+#: part/models.py:2060
msgid ""
"Error creating relationship: check that the part is not related to itself "
"and that the relationship is unique"
@@ -2722,8 +2765,8 @@ msgstr ""
#: stock/templates/stock/item_base.html:8
#: stock/templates/stock/item_base.html:72
#: stock/templates/stock/item_base.html:274
-#: stock/templates/stock/stock_adjust.html:16 templates/js/build.js:724
-#: templates/js/stock.js:695 templates/js/stock.js:944
+#: stock/templates/stock/stock_adjust.html:16 templates/js/build.js:751
+#: templates/js/stock.js:699 templates/js/stock.js:948
msgid "Stock Item"
msgstr ""
@@ -2788,7 +2831,7 @@ msgstr ""
msgid "Validate"
msgstr ""
-#: part/templates/part/bom.html:62 part/views.py:1793
+#: part/templates/part/bom.html:62 part/views.py:1791
msgid "Export Bill of Materials"
msgstr ""
@@ -2830,6 +2873,10 @@ msgstr ""
msgid "Match Fields"
msgstr ""
+#: part/templates/part/bom_upload/select_fields.html:62
+msgid "Duplicate column selection"
+msgstr ""
+
#: part/templates/part/bom_upload/select_parts.html:10
msgid "Step 3 - Select Parts"
msgstr ""
@@ -2884,7 +2931,7 @@ msgstr ""
msgid "All parts"
msgstr ""
-#: part/templates/part/category.html:24 part/views.py:2184
+#: part/templates/part/category.html:24 part/views.py:2182
msgid "Create new part category"
msgstr ""
@@ -2956,7 +3003,7 @@ msgstr ""
msgid "Create new Part Category"
msgstr ""
-#: part/templates/part/category.html:216 stock/views.py:1342
+#: part/templates/part/category.html:216 stock/views.py:1358
msgid "Create new Stock Location"
msgstr ""
@@ -3018,7 +3065,7 @@ msgstr ""
msgid "Minimum Stock"
msgstr ""
-#: part/templates/part/detail.html:114 templates/js/order.js:263
+#: part/templates/part/detail.html:114 templates/js/order.js:270
msgid "Creation Date"
msgstr ""
@@ -3039,7 +3086,7 @@ msgid "Part is not a virtual part"
msgstr ""
#: part/templates/part/detail.html:148 stock/forms.py:249
-#: templates/js/table_filters.js:23 templates/js/table_filters.js:248
+#: templates/js/table_filters.js:23 templates/js/table_filters.js:252
msgid "Template"
msgstr ""
@@ -3113,7 +3160,7 @@ msgstr ""
msgid "New Parameter"
msgstr ""
-#: part/templates/part/params.html:25 stock/models.py:1419
+#: part/templates/part/params.html:25 stock/models.py:1420
#: templates/js/stock.js:112
msgid "Value"
msgstr ""
@@ -3258,7 +3305,7 @@ msgstr ""
msgid "Part Stock"
msgstr ""
-#: part/templates/part/stock_count.html:7 templates/js/bom.js:224
+#: part/templates/part/stock_count.html:7 templates/js/bom.js:230
#: templates/js/part.js:442
msgid "No Stock"
msgstr ""
@@ -3392,7 +3439,7 @@ msgstr ""
msgid "Possible matches exist - confirm creation of new part"
msgstr ""
-#: part/views.py:592 templates/js/stock.js:840
+#: part/views.py:592 templates/js/stock.js:844
msgid "Create New Part"
msgstr ""
@@ -3448,99 +3495,99 @@ msgstr ""
msgid "No BOM file provided"
msgstr ""
-#: part/views.py:1505
+#: part/views.py:1503
msgid "Enter a valid quantity"
msgstr ""
-#: part/views.py:1530 part/views.py:1533
+#: part/views.py:1528 part/views.py:1531
msgid "Select valid part"
msgstr ""
-#: part/views.py:1539
+#: part/views.py:1537
msgid "Duplicate part selected"
msgstr ""
-#: part/views.py:1577
+#: part/views.py:1575
msgid "Select a part"
msgstr ""
-#: part/views.py:1583
+#: part/views.py:1581
msgid "Selected part creates a circular BOM"
msgstr ""
-#: part/views.py:1587
+#: part/views.py:1585
msgid "Specify quantity"
msgstr ""
-#: part/views.py:1843
+#: part/views.py:1841
msgid "Confirm Part Deletion"
msgstr ""
-#: part/views.py:1852
+#: part/views.py:1850
msgid "Part was deleted"
msgstr ""
-#: part/views.py:1861
+#: part/views.py:1859
msgid "Part Pricing"
msgstr ""
-#: part/views.py:1975
+#: part/views.py:1973
msgid "Create Part Parameter Template"
msgstr ""
-#: part/views.py:1985
+#: part/views.py:1983
msgid "Edit Part Parameter Template"
msgstr ""
-#: part/views.py:1994
+#: part/views.py:1992
msgid "Delete Part Parameter Template"
msgstr ""
-#: part/views.py:2004
+#: part/views.py:2002
msgid "Create Part Parameter"
msgstr ""
-#: part/views.py:2056
+#: part/views.py:2054
msgid "Edit Part Parameter"
msgstr ""
-#: part/views.py:2072
+#: part/views.py:2070
msgid "Delete Part Parameter"
msgstr ""
-#: part/views.py:2131
+#: part/views.py:2129
msgid "Edit Part Category"
msgstr ""
-#: part/views.py:2168
+#: part/views.py:2166
msgid "Delete Part Category"
msgstr ""
-#: part/views.py:2176
+#: part/views.py:2174
msgid "Part category was deleted"
msgstr ""
-#: part/views.py:2232
+#: part/views.py:2230
msgid "Create Category Parameter Template"
msgstr ""
-#: part/views.py:2335
+#: part/views.py:2333
msgid "Edit Category Parameter Template"
msgstr ""
-#: part/views.py:2393
+#: part/views.py:2391
msgid "Delete Category Parameter Template"
msgstr ""
-#: part/views.py:2418
+#: part/views.py:2416
msgid "Create BOM Item"
msgstr ""
-#: part/views.py:2486
+#: part/views.py:2488
msgid "Edit BOM item"
msgstr ""
-#: part/views.py:2536
+#: part/views.py:2545
msgid "Confim BOM item deletion"
msgstr ""
@@ -3564,11 +3611,11 @@ msgstr ""
msgid "Part query filters (comma-separated list of key=value pairs)"
msgstr ""
-#: report/models.py:227
+#: report/models.py:230
msgid "Report asset file"
msgstr ""
-#: report/models.py:230
+#: report/models.py:233
msgid "Asset file description"
msgstr ""
@@ -3624,7 +3671,7 @@ msgstr ""
msgid "Add note (required)"
msgstr ""
-#: stock/forms.py:371 stock/views.py:920 stock/views.py:1118
+#: stock/forms.py:371 stock/views.py:935 stock/views.py:1133
msgid "Confirm stock adjustment"
msgstr ""
@@ -3742,125 +3789,125 @@ msgstr ""
msgid "Stock Item Notes"
msgstr ""
-#: stock/models.py:458
+#: stock/models.py:459
msgid "Single unit purchase price at time of purchase"
msgstr ""
-#: stock/models.py:509
+#: stock/models.py:510
msgid "Assigned to Customer"
msgstr ""
-#: stock/models.py:511
+#: stock/models.py:512
msgid "Manually assigned to customer"
msgstr ""
-#: stock/models.py:524
+#: stock/models.py:525
msgid "Returned from customer"
msgstr ""
-#: stock/models.py:526
+#: stock/models.py:527
msgid "Returned to location"
msgstr ""
-#: stock/models.py:651
+#: stock/models.py:652
msgid "Installed into stock item"
msgstr ""
-#: stock/models.py:659
+#: stock/models.py:660
msgid "Installed stock item"
msgstr ""
-#: stock/models.py:683
+#: stock/models.py:684
msgid "Uninstalled stock item"
msgstr ""
-#: stock/models.py:702
+#: stock/models.py:703
msgid "Uninstalled into location"
msgstr ""
-#: stock/models.py:802
+#: stock/models.py:803
msgid "Part is not set as trackable"
msgstr ""
-#: stock/models.py:808
+#: stock/models.py:809
msgid "Quantity must be integer"
msgstr ""
-#: stock/models.py:814
+#: stock/models.py:815
#, python-brace-format
msgid "Quantity must not exceed available stock quantity ({n})"
msgstr ""
-#: stock/models.py:817
+#: stock/models.py:818
msgid "Serial numbers must be a list of integers"
msgstr ""
-#: stock/models.py:820
+#: stock/models.py:821
msgid "Quantity does not match serial numbers"
msgstr ""
-#: stock/models.py:852
+#: stock/models.py:853
msgid "Add serial number"
msgstr ""
-#: stock/models.py:855
+#: stock/models.py:856
#, python-brace-format
msgid "Serialized {n} items"
msgstr ""
-#: stock/models.py:966
+#: stock/models.py:967
msgid "StockItem cannot be moved as it is not in stock"
msgstr ""
-#: stock/models.py:1320
+#: stock/models.py:1321
msgid "Tracking entry title"
msgstr ""
-#: stock/models.py:1322
+#: stock/models.py:1323
msgid "Entry notes"
msgstr ""
-#: stock/models.py:1324
+#: stock/models.py:1325
msgid "Link to external page for further information"
msgstr ""
-#: stock/models.py:1384
+#: stock/models.py:1385
msgid "Value must be provided for this test"
msgstr ""
-#: stock/models.py:1390
+#: stock/models.py:1391
msgid "Attachment must be uploaded for this test"
msgstr ""
-#: stock/models.py:1407
+#: stock/models.py:1408
msgid "Test"
msgstr ""
-#: stock/models.py:1408
+#: stock/models.py:1409
msgid "Test name"
msgstr ""
-#: stock/models.py:1413
+#: stock/models.py:1414
msgid "Result"
msgstr ""
-#: stock/models.py:1414 templates/js/table_filters.js:162
+#: stock/models.py:1415 templates/js/table_filters.js:162
msgid "Test result"
msgstr ""
-#: stock/models.py:1420
+#: stock/models.py:1421
msgid "Test output value"
msgstr ""
-#: stock/models.py:1426
+#: stock/models.py:1427
msgid "Attachment"
msgstr ""
-#: stock/models.py:1427
+#: stock/models.py:1428
msgid "Test result attachment"
msgstr ""
-#: stock/models.py:1433
+#: stock/models.py:1434
msgid "Test notes"
msgstr ""
@@ -3953,7 +4000,7 @@ msgstr ""
msgid "Return to stock"
msgstr ""
-#: stock/templates/stock/item_base.html:138 templates/js/stock.js:981
+#: stock/templates/stock/item_base.html:138 templates/js/stock.js:985
msgid "Uninstall stock item"
msgstr ""
@@ -3990,7 +4037,7 @@ msgstr ""
msgid "Stock Item Details"
msgstr ""
-#: stock/templates/stock/item_base.html:231 templates/js/build.js:426
+#: stock/templates/stock/item_base.html:231 templates/js/build.js:442
msgid "No location set"
msgstr ""
@@ -3998,7 +4045,7 @@ msgstr ""
msgid "Barcode Identifier"
msgstr ""
-#: stock/templates/stock/item_base.html:252 templates/js/build.js:626
+#: stock/templates/stock/item_base.html:252 templates/js/build.js:642
#: templates/navbar.html:25
msgid "Build"
msgstr ""
@@ -4113,8 +4160,8 @@ msgstr ""
#: stock/templates/stock/location.html:79
#: stock/templates/stock/location.html:94
-#: templates/InvenTree/search_stock_items.html:6 templates/stats.html:21
-#: templates/stats.html:30
+#: templates/InvenTree/search_stock_items.html:6 templates/stats.html:48
+#: templates/stats.html:57
msgid "Stock Items"
msgstr ""
@@ -4123,7 +4170,7 @@ msgid "Stock Details"
msgstr ""
#: stock/templates/stock/location.html:89
-#: templates/InvenTree/search_stock_location.html:6 templates/stats.html:25
+#: templates/InvenTree/search_stock_location.html:6 templates/stats.html:52
msgid "Stock Locations"
msgstr ""
@@ -4135,7 +4182,7 @@ msgstr ""
msgid "The following stock items will be uninstalled"
msgstr ""
-#: stock/templates/stock/stockitem_convert.html:7 stock/views.py:1314
+#: stock/templates/stock/stockitem_convert.html:7 stock/views.py:1330
msgid "Convert Stock Item"
msgstr ""
@@ -4239,150 +4286,133 @@ msgstr ""
msgid "Select Test Report Template"
msgstr ""
-#: stock/views.py:522
+#: stock/views.py:537
msgid "Select valid template"
msgstr ""
-#: stock/views.py:575
+#: stock/views.py:590
msgid "Stock Export Options"
msgstr ""
-#: stock/views.py:697
+#: stock/views.py:712
msgid "Stock Item QR Code"
msgstr ""
-#: stock/views.py:723
+#: stock/views.py:738
msgid "Install Stock Item"
msgstr ""
-#: stock/views.py:823
+#: stock/views.py:838
msgid "Uninstall Stock Items"
msgstr ""
-#: stock/views.py:931
+#: stock/views.py:946
msgid "Uninstalled stock items"
msgstr ""
-#: stock/views.py:956
+#: stock/views.py:971
msgid "Adjust Stock"
msgstr ""
-#: stock/views.py:1066
+#: stock/views.py:1081
msgid "Move Stock Items"
msgstr ""
-#: stock/views.py:1067
+#: stock/views.py:1082
msgid "Count Stock Items"
msgstr ""
-#: stock/views.py:1068
+#: stock/views.py:1083
msgid "Remove From Stock"
msgstr ""
-#: stock/views.py:1069
+#: stock/views.py:1084
msgid "Add Stock Items"
msgstr ""
-#: stock/views.py:1070
+#: stock/views.py:1085
msgid "Delete Stock Items"
msgstr ""
-#: stock/views.py:1098
+#: stock/views.py:1113
msgid "Must enter integer value"
msgstr ""
-#: stock/views.py:1103
+#: stock/views.py:1118
msgid "Quantity must be positive"
msgstr ""
-#: stock/views.py:1110
+#: stock/views.py:1125
#, python-brace-format
msgid "Quantity must not exceed {x}"
msgstr ""
-#: stock/views.py:1189
+#: stock/views.py:1204
#, python-brace-format
msgid "Added stock to {n} items"
msgstr ""
-#: stock/views.py:1204
+#: stock/views.py:1219
#, python-brace-format
msgid "Removed stock from {n} items"
msgstr ""
-#: stock/views.py:1217
+#: stock/views.py:1232
#, python-brace-format
msgid "Counted stock for {n} items"
msgstr ""
-#: stock/views.py:1245
+#: stock/views.py:1260
msgid "No items were moved"
msgstr ""
-#: stock/views.py:1248
+#: stock/views.py:1263
#, python-brace-format
msgid "Moved {n} items to {dest}"
msgstr ""
-#: stock/views.py:1267
+#: stock/views.py:1282
#, python-brace-format
msgid "Deleted {n} stock items"
msgstr ""
-#: stock/views.py:1279
+#: stock/views.py:1294
msgid "Edit Stock Item"
msgstr ""
-#: stock/views.py:1364
+#: stock/views.py:1380
msgid "Serialize Stock"
msgstr ""
-#: stock/views.py:1458 templates/js/build.js:210
+#: stock/views.py:1474 templates/js/build.js:210
msgid "Create new Stock Item"
msgstr ""
-#: stock/views.py:1559
+#: stock/views.py:1578
msgid "Duplicate Stock Item"
msgstr ""
-#: stock/views.py:1634
-msgid "Invalid quantity"
+#: stock/views.py:1650
+msgid "Quantity cannot be negative"
msgstr ""
-#: stock/views.py:1637
-msgid "Quantity cannot be less than zero"
-msgstr ""
-
-#: stock/views.py:1641
-msgid "Invalid part selection"
-msgstr ""
-
-#: stock/views.py:1689
-#, python-brace-format
-msgid "Created {n} new stock items"
-msgstr ""
-
-#: stock/views.py:1708 stock/views.py:1724
-msgid "Created new stock item"
-msgstr ""
-
-#: stock/views.py:1743
+#: stock/views.py:1736
msgid "Delete Stock Location"
msgstr ""
-#: stock/views.py:1757
+#: stock/views.py:1750
msgid "Delete Stock Item"
msgstr ""
-#: stock/views.py:1769
+#: stock/views.py:1762
msgid "Delete Stock Tracking Entry"
msgstr ""
-#: stock/views.py:1788
+#: stock/views.py:1781
msgid "Edit Stock Tracking Entry"
msgstr ""
-#: stock/views.py:1798
+#: stock/views.py:1791
msgid "Add Stock Tracking Entry"
msgstr ""
@@ -4406,6 +4436,10 @@ msgstr ""
msgid "BOM Waiting Validation"
msgstr ""
+#: templates/InvenTree/build_overdue.html:7
+msgid "Overdue Builds"
+msgstr ""
+
#: templates/InvenTree/build_pending.html:7
msgid "Pending Builds"
msgstr ""
@@ -4513,7 +4547,7 @@ msgid "Edit setting"
msgstr ""
#: templates/InvenTree/settings/settings.html:7
-#: templates/InvenTree/settings/settings.html:13 templates/navbar.html:62
+#: templates/InvenTree/settings/settings.html:13 templates/navbar.html:66
msgid "Settings"
msgstr ""
@@ -4605,34 +4639,30 @@ msgid "InvenTree Version Information"
msgstr ""
#: templates/about.html:21
-msgid "Instance Name"
-msgstr ""
-
-#: templates/about.html:26
msgid "InvenTree Version"
msgstr ""
-#: templates/about.html:30
+#: templates/about.html:25
msgid "Django Version"
msgstr ""
-#: templates/about.html:34
+#: templates/about.html:29
msgid "Commit Hash"
msgstr ""
-#: templates/about.html:38
+#: templates/about.html:33
msgid "Commit Date"
msgstr ""
-#: templates/about.html:42
+#: templates/about.html:37
msgid "InvenTree Documentation"
msgstr ""
-#: templates/about.html:47
+#: templates/about.html:42
msgid "View Code on GitHub"
msgstr ""
-#: templates/about.html:51
+#: templates/about.html:46
msgid "Submit Bug Report"
msgstr ""
@@ -4733,51 +4763,51 @@ msgstr ""
msgid "Barcode does not match Stock Item"
msgstr ""
-#: templates/js/bom.js:159
+#: templates/js/bom.js:165
msgid "Open subassembly"
msgstr ""
-#: templates/js/bom.js:200
+#: templates/js/bom.js:206
msgid "Optional"
msgstr ""
-#: templates/js/bom.js:240
+#: templates/js/bom.js:252
msgid "No pricing available"
msgstr ""
-#: templates/js/bom.js:259 templates/js/build.js:555
+#: templates/js/bom.js:272 templates/js/build.js:571
msgid "Actions"
msgstr ""
-#: templates/js/bom.js:267
+#: templates/js/bom.js:280
msgid "Validate BOM Item"
msgstr ""
-#: templates/js/bom.js:269
+#: templates/js/bom.js:282
msgid "This line has been validated"
msgstr ""
-#: templates/js/bom.js:271
+#: templates/js/bom.js:284
msgid "Edit BOM Item"
msgstr ""
-#: templates/js/bom.js:273
+#: templates/js/bom.js:286
msgid "Delete BOM Item"
msgstr ""
-#: templates/js/bom.js:346 templates/js/build.js:289
+#: templates/js/bom.js:363 templates/js/build.js:305
msgid "No BOM items found"
msgstr ""
-#: templates/js/bom.js:491
+#: templates/js/bom.js:509
msgid "INACTIVE"
msgstr ""
-#: templates/js/bom.js:505
+#: templates/js/bom.js:523
msgid "Uses"
msgstr ""
-#: templates/js/bom.js:516
+#: templates/js/bom.js:534
msgid "No matching parts found"
msgstr ""
@@ -4801,31 +4831,35 @@ msgstr ""
msgid "New Stock Item"
msgstr ""
-#: templates/js/build.js:477
+#: templates/js/build.js:493
msgid "Required Part"
msgstr ""
-#: templates/js/build.js:498
+#: templates/js/build.js:514
msgid "Quantity Per"
msgstr ""
-#: templates/js/build.js:562
+#: templates/js/build.js:578
msgid "Build stock"
msgstr ""
-#: templates/js/build.js:566 templates/stock_table.html:25
+#: templates/js/build.js:582 templates/stock_table.html:25
msgid "Order stock"
msgstr ""
-#: templates/js/build.js:569
+#: templates/js/build.js:585
msgid "Allocate stock"
msgstr ""
-#: templates/js/build.js:610
+#: templates/js/build.js:626
msgid "No builds matching query"
msgstr ""
-#: templates/js/build.js:720
+#: templates/js/build.js:656
+msgid "Build order is overdue"
+msgstr ""
+
+#: templates/js/build.js:747
msgid "No parts allocated for"
msgstr ""
@@ -4857,19 +4891,19 @@ msgstr ""
msgid "Link"
msgstr ""
-#: templates/js/order.js:128
+#: templates/js/order.js:135
msgid "No purchase orders found"
msgstr ""
-#: templates/js/order.js:181 templates/js/stock.js:677
+#: templates/js/order.js:188 templates/js/stock.js:681
msgid "Date"
msgstr ""
-#: templates/js/order.js:211
+#: templates/js/order.js:218
msgid "No sales orders found"
msgstr ""
-#: templates/js/order.js:268
+#: templates/js/order.js:275
msgid "Shipment Date"
msgstr ""
@@ -4898,7 +4932,7 @@ msgid "No parts found"
msgstr ""
#: templates/js/part.js:343 templates/js/stock.js:456
-#: templates/js/stock.js:1013
+#: templates/js/stock.js:1017
msgid "Select"
msgstr ""
@@ -4906,7 +4940,7 @@ msgstr ""
msgid "No category"
msgstr ""
-#: templates/js/part.js:429 templates/js/table_filters.js:256
+#: templates/js/part.js:429 templates/js/table_filters.js:260
msgid "Low stock"
msgstr ""
@@ -5002,35 +5036,39 @@ msgstr ""
msgid "Stock item has been installed in another item"
msgstr ""
-#: templates/js/stock.js:541
+#: templates/js/stock.js:542
msgid "Stock item has been rejected"
msgstr ""
-#: templates/js/stock.js:545
+#: templates/js/stock.js:546
msgid "Stock item is lost"
msgstr ""
-#: templates/js/stock.js:549 templates/js/table_filters.js:106
+#: templates/js/stock.js:549
+msgid "Stock item is destroyed"
+msgstr ""
+
+#: templates/js/stock.js:553 templates/js/table_filters.js:106
msgid "Depleted"
msgstr ""
-#: templates/js/stock.js:743
+#: templates/js/stock.js:747
msgid "No user information"
msgstr ""
-#: templates/js/stock.js:852
+#: templates/js/stock.js:856
msgid "Create New Location"
msgstr ""
-#: templates/js/stock.js:951
+#: templates/js/stock.js:955
msgid "Serial"
msgstr ""
-#: templates/js/stock.js:1044 templates/js/table_filters.js:121
+#: templates/js/stock.js:1048 templates/js/table_filters.js:121
msgid "Installed"
msgstr ""
-#: templates/js/stock.js:1069
+#: templates/js/stock.js:1073
msgid "Install item"
msgstr ""
@@ -5071,7 +5109,7 @@ msgstr ""
msgid "Batch code"
msgstr ""
-#: templates/js/table_filters.js:91 templates/js/table_filters.js:223
+#: templates/js/table_filters.js:91 templates/js/table_filters.js:227
msgid "Active parts"
msgstr ""
@@ -5131,43 +5169,43 @@ msgstr ""
msgid "Build status"
msgstr ""
-#: templates/js/table_filters.js:196 templates/js/table_filters.js:209
+#: templates/js/table_filters.js:200 templates/js/table_filters.js:213
msgid "Order status"
msgstr ""
-#: templates/js/table_filters.js:201 templates/js/table_filters.js:214
+#: templates/js/table_filters.js:205 templates/js/table_filters.js:218
msgid "Outstanding"
msgstr ""
-#: templates/js/table_filters.js:233
+#: templates/js/table_filters.js:237
msgid "Include subcategories"
msgstr ""
-#: templates/js/table_filters.js:234
+#: templates/js/table_filters.js:238
msgid "Include parts in subcategories"
msgstr ""
-#: templates/js/table_filters.js:238
+#: templates/js/table_filters.js:242
msgid "Has IPN"
msgstr ""
-#: templates/js/table_filters.js:239
+#: templates/js/table_filters.js:243
msgid "Part has internal part number"
msgstr ""
-#: templates/js/table_filters.js:244
+#: templates/js/table_filters.js:248
msgid "Show active parts"
msgstr ""
-#: templates/js/table_filters.js:252
+#: templates/js/table_filters.js:256
msgid "Stock available"
msgstr ""
-#: templates/js/table_filters.js:268
+#: templates/js/table_filters.js:272
msgid "Starred"
msgstr ""
-#: templates/js/table_filters.js:280
+#: templates/js/table_filters.js:284
msgid "Purchasable"
msgstr ""
@@ -5195,30 +5233,50 @@ msgstr ""
msgid "Scan Barcode"
msgstr ""
-#: templates/navbar.html:59 users/models.py:27
+#: templates/navbar.html:57
+msgid "InvenTree server issues detected"
+msgstr ""
+
+#: templates/navbar.html:63 users/models.py:27
msgid "Admin"
msgstr ""
-#: templates/navbar.html:63
+#: templates/navbar.html:67
msgid "Logout"
msgstr ""
-#: templates/navbar.html:65
+#: templates/navbar.html:69
msgid "Login"
msgstr ""
-#: templates/navbar.html:68
+#: templates/navbar.html:80
msgid "About InvenTree"
msgstr ""
-#: templates/navbar.html:69
-msgid "Statistics"
-msgstr ""
-
#: templates/search_form.html:6 templates/search_form.html:8
msgid "Search"
msgstr ""
+#: templates/stats.html:9
+msgid "Server"
+msgstr ""
+
+#: templates/stats.html:13
+msgid "Instance Name"
+msgstr ""
+
+#: templates/stats.html:18
+msgid "Server status"
+msgstr ""
+
+#: templates/stats.html:21
+msgid "Healthy"
+msgstr ""
+
+#: templates/stats.html:23
+msgid "Issues detected"
+msgstr ""
+
#: templates/stock_table.html:6
msgid "Export Stock Information"
msgstr ""
@@ -5263,19 +5321,19 @@ msgstr ""
msgid "Select which users are assigned to this group"
msgstr ""
-#: users/admin.py:120
+#: users/admin.py:178
msgid "The following users are members of multiple groups:"
msgstr ""
-#: users/admin.py:143
+#: users/admin.py:201
msgid "Personal info"
msgstr ""
-#: users/admin.py:144
+#: users/admin.py:202
msgid "Permissions"
msgstr ""
-#: users/admin.py:147
+#: users/admin.py:205
msgid "Important dates"
msgstr ""
diff --git a/InvenTree/order/api.py b/InvenTree/order/api.py
index 4a9dbfa2ac..6b8a3c81e0 100644
--- a/InvenTree/order/api.py
+++ b/InvenTree/order/api.py
@@ -266,6 +266,17 @@ class SOList(generics.ListCreateAPIView):
else:
queryset = queryset.exclude(status__in=SalesOrderStatus.OPEN)
+ # Filter by 'overdue' status
+ overdue = params.get('overdue', None)
+
+ if overdue is not None:
+ overdue = str2bool(overdue)
+
+ if overdue:
+ queryset = queryset.filter(SalesOrder.OVERDUE_FILTER)
+ else:
+ queryset = queryset.exclude(SalesOrder.OVERDUE_FILTER)
+
status = params.get('status', None)
if status is not None:
diff --git a/InvenTree/order/forms.py b/InvenTree/order/forms.py
index aa0c897c8a..d797a4e42d 100644
--- a/InvenTree/order/forms.py
+++ b/InvenTree/order/forms.py
@@ -128,6 +128,13 @@ class EditSalesOrderForm(HelperForm):
super().__init__(*args, **kwargs)
+ # TODO: Improve this using a better date picker
+ target_date = forms.DateField(
+ widget=forms.DateInput(
+ attrs={'type': 'date'},
+ )
+ )
+
class Meta:
model = SalesOrder
fields = [
@@ -135,6 +142,7 @@ class EditSalesOrderForm(HelperForm):
'customer',
'customer_reference',
'description',
+ 'target_date',
'link'
]
diff --git a/InvenTree/order/migrations/0040_salesorder_target_date.py b/InvenTree/order/migrations/0040_salesorder_target_date.py
new file mode 100644
index 0000000000..29a90a6ad5
--- /dev/null
+++ b/InvenTree/order/migrations/0040_salesorder_target_date.py
@@ -0,0 +1,18 @@
+# Generated by Django 3.0.7 on 2020-12-18 01:16
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('order', '0039_auto_20201112_2203'),
+ ]
+
+ operations = [
+ migrations.AddField(
+ model_name='salesorder',
+ name='target_date',
+ field=models.DateField(blank=True, help_text='Target date for order completion. Order will be overdue after this date.', null=True, verbose_name='Target completion date'),
+ ),
+ ]
diff --git a/InvenTree/order/models.py b/InvenTree/order/models.py
index b2eb59c52e..9045ab86d7 100644
--- a/InvenTree/order/models.py
+++ b/InvenTree/order/models.py
@@ -9,7 +9,7 @@ from datetime import datetime
from decimal import Decimal
from django.db import models, transaction
-from django.db.models import F, Sum
+from django.db.models import Q, F, Sum
from django.db.models.functions import Coalesce
from django.core.validators import MinValueValidator
from django.core.exceptions import ValidationError
@@ -26,7 +26,7 @@ from stock import models as stock_models
from company.models import Company, SupplierPart
from InvenTree.fields import RoundingDecimalField
-from InvenTree.helpers import decimal2string, increment
+from InvenTree.helpers import decimal2string, increment, getSetting
from InvenTree.status_codes import PurchaseOrderStatus, SalesOrderStatus, StockStatus
from InvenTree.models import InvenTreeAttachment
@@ -49,8 +49,6 @@ class Order(models.Model):
"""
- ORDER_PREFIX = ""
-
@classmethod
def getNextOrderNumber(cls):
"""
@@ -88,16 +86,6 @@ class Order(models.Model):
return new_ref
- def __str__(self):
- el = []
-
- if self.ORDER_PREFIX:
- el.append(self.ORDER_PREFIX)
-
- el.append(self.reference)
-
- return " ".join(el)
-
def save(self, *args, **kwargs):
if not self.creation_date:
self.creation_date = datetime.now().date()
@@ -132,11 +120,12 @@ class PurchaseOrder(Order):
supplier_reference: Optional field for supplier order reference code
received_by: User that received the goods
"""
-
- ORDER_PREFIX = "PO"
def __str__(self):
- return "PO {ref} - {company}".format(ref=self.reference, company=self.supplier.name)
+
+ prefix = getSetting('PURCHASEORDER_REFERENCE_PREFIX')
+
+ return f"{prefix}{self.reference} - {self.supplier.name}"
status = models.PositiveIntegerField(default=PurchaseOrderStatus.PENDING, choices=PurchaseOrderStatus.items(),
help_text=_('Purchase order status'))
@@ -307,10 +296,16 @@ class SalesOrder(Order):
Attributes:
customer: Reference to the company receiving the goods in the order
customer_reference: Optional field for customer order reference code
+ target_date: Target date for SalesOrder completion (optional)
"""
+ OVERDUE_FILTER = Q(status__in=SalesOrderStatus.OPEN) & ~Q(target_date=None) & Q(target_date__lte=datetime.now().date())
+
def __str__(self):
- return "SO {ref} - {company}".format(ref=self.reference, company=self.customer.name)
+
+ prefix = getSetting('SALESORDER_REFERENCE_PREFIX')
+
+ return f"{prefix}{self.reference} - {self.customer.name}"
def get_absolute_url(self):
return reverse('so-detail', kwargs={'pk': self.id})
@@ -329,6 +324,12 @@ class SalesOrder(Order):
customer_reference = models.CharField(max_length=64, blank=True, help_text=_("Customer order reference code"))
+ target_date = models.DateField(
+ null=True, blank=True,
+ verbose_name=_('Target completion date'),
+ help_text=_('Target date for order completion. Order will be overdue after this date.')
+ )
+
shipment_date = models.DateField(blank=True, null=True)
shipped_by = models.ForeignKey(
@@ -338,6 +339,23 @@ class SalesOrder(Order):
related_name='+'
)
+ @property
+ def is_overdue(self):
+ """
+ Returns true if this SalesOrder is "overdue":
+
+ - Not completed
+ - Target date is "in the past"
+ """
+
+ # Order cannot be deemed overdue if target_date is not set
+ if self.target_date is None:
+ return False
+
+ today = datetime.now().date()
+
+ return self.is_pending and self.target_date < today
+
@property
def is_pending(self):
return self.status == SalesOrderStatus.PENDING
diff --git a/InvenTree/order/serializers.py b/InvenTree/order/serializers.py
index c91ec6e02d..f0505728f6 100644
--- a/InvenTree/order/serializers.py
+++ b/InvenTree/order/serializers.py
@@ -9,6 +9,9 @@ from rest_framework import serializers
from sql_util.utils import SubqueryCount
+from django.db.models import Case, When, Value
+from django.db.models import BooleanField
+
from InvenTree.serializers import InvenTreeModelSerializer
from InvenTree.serializers import InvenTreeAttachmentSerializerField
@@ -152,12 +155,24 @@ class SalesOrderSerializer(InvenTreeModelSerializer):
def annotate_queryset(queryset):
"""
Add extra information to the queryset
+
+ - Number of line items in the SalesOrder
+ - Overdue status of the SalesOrder
"""
queryset = queryset.annotate(
line_items=SubqueryCount('lines')
)
+ queryset = queryset.annotate(
+ overdue=Case(
+ When(
+ SalesOrder.OVERDUE_FILTER, then=Value(True, output_field=BooleanField()),
+ ),
+ default=Value(False, output_field=BooleanField())
+ )
+ )
+
return queryset
customer_detail = CompanyBriefSerializer(source='customer', many=False, read_only=True)
@@ -166,24 +181,27 @@ class SalesOrderSerializer(InvenTreeModelSerializer):
status_text = serializers.CharField(source='get_status_display', read_only=True)
+ overdue = serializers.BooleanField()
+
class Meta:
model = SalesOrder
fields = [
'pk',
- 'shipment_date',
'creation_date',
- 'description',
- 'line_items',
- 'link',
- 'reference',
'customer',
'customer_detail',
'customer_reference',
+ 'description',
+ 'line_items',
+ 'link',
+ 'notes',
+ 'overdue',
+ 'reference',
'status',
'status_text',
'shipment_date',
- 'notes',
+ 'target_date',
]
read_only_fields = [
diff --git a/InvenTree/order/templates/order/sales_order_base.html b/InvenTree/order/templates/order/sales_order_base.html
index 59ff0eeda8..378020850b 100644
--- a/InvenTree/order/templates/order/sales_order_base.html
+++ b/InvenTree/order/templates/order/sales_order_base.html
@@ -37,6 +37,9 @@ src="{% static 'img/blank_image.png' %}"
{% sales_order_status_label order.status large=True %}
+ {% if order.is_overdue %}
+ {% trans "Overdue" %}
+ {% endif %}
{{ order.description }}
@@ -74,7 +77,12 @@ src="{% static 'img/blank_image.png' %}"
{% trans "Order Status" %}
- {% sales_order_status_label order.status %}
+
+ {% sales_order_status_label order.status %}
+ {% if order.is_overdue %}
+ {% trans "Overdue" %}
+ {% endif %}
+
@@ -100,6 +108,13 @@ src="{% static 'img/blank_image.png' %}"
{% trans "Created" %}
{{ order.creation_date }}{{ order.created_by }}
+ {% if order.target_date %}
+
+
+ {% trans "Target Date" %}
+ {{ order.target_date }}
+
+ {% endif %}
{% if order.shipment_date %}
diff --git a/InvenTree/order/tests.py b/InvenTree/order/tests.py
index 7b118dc60e..47dfe63d0f 100644
--- a/InvenTree/order/tests.py
+++ b/InvenTree/order/tests.py
@@ -31,11 +31,11 @@ class OrderTest(TestCase):
self.assertEqual(order.get_absolute_url(), '/order/purchase-order/1/')
- self.assertEqual(str(order), 'PO 0001 - ACME')
+ self.assertEqual(str(order), 'PO0001 - ACME')
line = PurchaseOrderLineItem.objects.get(pk=1)
- self.assertEqual(str(line), "100 x ACME0001 from ACME (for PO 0001 - ACME)")
+ self.assertEqual(str(line), "100 x ACME0001 from ACME (for PO0001 - ACME)")
def test_increment(self):
diff --git a/InvenTree/part/api.py b/InvenTree/part/api.py
index 9bf7294335..b479575a35 100644
--- a/InvenTree/part/api.py
+++ b/InvenTree/part/api.py
@@ -130,7 +130,7 @@ class CategoryParameters(generics.ListAPIView):
"""
try:
- cat_id = int(self.request.query_params.get('category', None))
+ cat_id = int(self.kwargs.get('pk', None))
except TypeError:
cat_id = None
fetch_parent = str2bool(self.request.query_params.get('fetch_parent', 'true'))
@@ -910,8 +910,8 @@ part_api_urls = [
# Base URL for PartCategory API endpoints
url(r'^category/', include([
+ url(r'^(?P\d+)/parameters/?', CategoryParameters.as_view(), name='api-part-category-parameters'),
url(r'^(?P\d+)/?', CategoryDetail.as_view(), name='api-part-category-detail'),
- url(r'^parameters/?', CategoryParameters.as_view(), name='api-part-category-parameters'),
url(r'^$', CategoryList.as_view(), name='api-part-category-list'),
])),
diff --git a/InvenTree/part/models.py b/InvenTree/part/models.py
index ea26e5e5c7..cf0c92899a 100644
--- a/InvenTree/part/models.py
+++ b/InvenTree/part/models.py
@@ -594,7 +594,7 @@ class Part(MPTTModel):
# User can decide whether duplicate IPN (Internal Part Number) values are allowed
allow_duplicate_ipn = common.models.InvenTreeSetting.get_setting('PART_ALLOW_DUPLICATE_IPN')
- if not allow_duplicate_ipn:
+ if self.IPN is not None and not allow_duplicate_ipn:
parts = Part.objects.filter(IPN__iexact=self.IPN)
parts = parts.exclude(pk=self.pk)
diff --git a/InvenTree/report/models.py b/InvenTree/report/models.py
index 7b7f01f7a1..b3725cadc0 100644
--- a/InvenTree/report/models.py
+++ b/InvenTree/report/models.py
@@ -193,6 +193,9 @@ class TestReport(ReportTemplateBase):
items = StockItem.objects.filter(**filters)
+ # Ensure the provided StockItem object matches the filters
+ items = items.filter(pk=item.pk)
+
return items.exists()
def get_context_data(self, request):
diff --git a/InvenTree/stock/templates/stock/item_base.html b/InvenTree/stock/templates/stock/item_base.html
index e671c2d161..8cb1e254c4 100644
--- a/InvenTree/stock/templates/stock/item_base.html
+++ b/InvenTree/stock/templates/stock/item_base.html
@@ -127,7 +127,7 @@ InvenTree | {% trans "Stock Item" %} - {{ item }}
{% if owner_control.value == "False" or owner_control.value == "True" and item.owner == user or user.is_superuser %}
{% if roles.stock.change and not item.is_building %}
-
+
@@ -28,6 +29,7 @@ InvenTree | {% trans "Index" %}
{% endif %}
{% if roles.sales_order.view %}
{% include "InvenTree/so_outstanding.html" with collapse_id="so_outstanding" %}
+ {% include "InvenTree/so_overdue.html" with collapse_id="so_overdue" %}
{% endif %}
@@ -72,6 +74,15 @@ loadBuildTable("#build-pending-table", {
disableFilters: true,
});
+loadBuildTable("#build-overdue-table", {
+ url: "{% url 'api-build-list' %}",
+ params: {
+ part_detail: true,
+ overdue: true,
+ },
+ disableFilters: true,
+});
+
loadSimplePartTable("#low-stock-table", "{% url 'api-part-list' %}", {
params: {
low_stock: true,
@@ -102,6 +113,14 @@ loadSalesOrderTable("#so-outstanding-table", {
},
});
+loadSalesOrderTable("#so-overdue-table", {
+ url: "{% url 'api-so-list' %}",
+ params: {
+ overdue: true,
+ customer_detail: true,
+ }
+});
+
$("#latest-parts-table").on('load-success.bs.table', function() {
var count = $("#latest-parts-table").bootstrapTable('getData').length;
@@ -126,6 +145,12 @@ $("#build-pending-table").on('load-success.bs.table', function() {
$("#build-pending-count").html(count);
});
+$("#build-overdue-table").on('load-success.bs.table', function() {
+ var count = $("#build-overdue-table").bootstrapTable('getData').length;
+
+ $("#build-overdue-count").html(count);
+});
+
$("#low-stock-table").on('load-success.bs.table', function() {
var count = $("#low-stock-table").bootstrapTable('getData').length;
@@ -150,4 +175,10 @@ $("#so-outstanding-table").on('load-success.bs.table', function() {
$("#so-outstanding-count").html(count);
});
+$("#so-overdue-table").on('load-success.bs.table', function() {
+ var count = $("#so-overdue-table").bootstrapTable('getData').length;
+
+ $("#so-overdue-count").html(count);
+});
+
{% endblock %}
\ No newline at end of file
diff --git a/InvenTree/templates/InvenTree/settings/category.html b/InvenTree/templates/InvenTree/settings/category.html
index c84573e8b4..07dd0df342 100644
--- a/InvenTree/templates/InvenTree/settings/category.html
+++ b/InvenTree/templates/InvenTree/settings/category.html
@@ -45,7 +45,7 @@
{% if category %}
$("#param-table").inventreeTable({
- url: "{% url 'api-part-category-parameters' category.pk %}",
+ url: "{% url 'api-part-category-parameters' pk=category.pk %}",
queryParams: {
ordering: 'name',
},
@@ -58,7 +58,7 @@
switchable: false,
},
{
- field: 'parameter_template_detail.name',
+ field: 'parameter_template.name',
title: '{% trans "Parameter Template" %}',
sortable: 'true',
},
diff --git a/InvenTree/templates/InvenTree/so_overdue.html b/InvenTree/templates/InvenTree/so_overdue.html
new file mode 100644
index 0000000000..bf2b64a1e3
--- /dev/null
+++ b/InvenTree/templates/InvenTree/so_overdue.html
@@ -0,0 +1,15 @@
+{% extends "collapse_index.html" %}
+
+{% load i18n %}
+
+{% block collapse_title %}
+
+{% trans "Overdue Sales Orders" %}
+{% endblock %}
+
+{% block collapse_content %}
+
+
+
+{% endblock %}
\ No newline at end of file
diff --git a/InvenTree/templates/js/build.js b/InvenTree/templates/js/build.js
index a3c7bd5186..0455c8a6c4 100644
--- a/InvenTree/templates/js/build.js
+++ b/InvenTree/templates/js/build.js
@@ -650,7 +650,13 @@ function loadBuildTable(table, options) {
value = `${prefix}${value}`;
}
- return renderLink(value, '/build/' + row.pk + '/');
+ var html = renderLink(value, '/build/' + row.pk + '/');
+
+ if (row.overdue) {
+ html += makeIconBadge('fa-calendar-times icon-red', '{% trans "Build order is overdue" %}');
+ }
+
+ return html;
}
},
{
@@ -699,6 +705,11 @@ function loadBuildTable(table, options) {
title: '{% trans "Created" %}',
sortable: true,
},
+ {
+ field: 'target_date',
+ title: '{% trans "Target Date" %}',
+ sortable: true,
+ },
{
field: 'completion_date',
title: '{% trans "Completed" %}',
diff --git a/InvenTree/templates/js/order.js b/InvenTree/templates/js/order.js
index 69d4f584d9..18c315d17e 100644
--- a/InvenTree/templates/js/order.js
+++ b/InvenTree/templates/js/order.js
@@ -235,7 +235,13 @@ function loadSalesOrderTable(table, options) {
value = `${prefix}${value}`;
}
- return renderLink(value, `/order/sales-order/${row.pk}/`);
+ var html = renderLink(value, `/order/sales-order/${row.pk}/`);
+
+ if (row.overdue) {
+ html += makeIconBadge('fa-calendar-times icon-red', '{% trans "Order is overdue" %}');
+ }
+
+ return html;
},
},
{
@@ -269,6 +275,11 @@ function loadSalesOrderTable(table, options) {
field: 'creation_date',
title: '{% trans "Creation Date" %}',
},
+ {
+ sortable: true,
+ field: 'target_date',
+ title: '{% trans "Target Date" %}',
+ },
{
sortable: true,
field: 'shipment_date',
diff --git a/InvenTree/templates/js/part.js b/InvenTree/templates/js/part.js
index 8c00625dfc..e0f6a491f6 100644
--- a/InvenTree/templates/js/part.js
+++ b/InvenTree/templates/js/part.js
@@ -202,7 +202,7 @@ function loadPartVariantTable(table, partId, options={}) {
showColumns: true,
original: params,
queryParams: filters,
- formatNoMatches: function() { return "{% trans "No variants found" %}"; },
+ formatNoMatches: function() { return '{% trans "No variants found" %}'; },
columns: cols,
treeEnable: true,
rootParentId: partId,
@@ -249,7 +249,7 @@ function loadParametricPartTable(table, options={}) {
if (header === 'part') {
columns.push({
field: header,
- title: '{% trans 'Part' %}',
+ title: '{% trans "Part" %}',
sortable: true,
sortName: 'name',
formatter: function(value, row, index, field) {
@@ -268,7 +268,7 @@ function loadParametricPartTable(table, options={}) {
} else if (header === 'description') {
columns.push({
field: header,
- title: '{% trans 'Description' %}',
+ title: '{% trans "Description" %}',
sortable: true,
});
} else {
@@ -288,7 +288,7 @@ function loadParametricPartTable(table, options={}) {
queryParams: table_headers,
groupBy: false,
name: options.name || 'parametric',
- formatNoMatches: function() { return "{% trans "No parts found" %}"; },
+ formatNoMatches: function() { return '{% trans "No parts found" %}'; },
columns: columns,
showColumns: true,
data: table_data,
@@ -454,7 +454,7 @@ function loadPartTable(table, url, options={}) {
groupBy: false,
name: options.name || 'part',
original: params,
- formatNoMatches: function() { return "{% trans "No parts found" %}"; },
+ formatNoMatches: function() { return '{% trans "No parts found" %}'; },
columns: columns,
showColumns: true,
});
@@ -564,12 +564,12 @@ function loadPartTestTemplateTable(table, options) {
},
{
field: 'test_name',
- title: "{% trans "Test Name" %}",
+ title: '{% trans "Test Name" %}',
sortable: true,
},
{
field: 'description',
- title: "{% trans "Description" %}",
+ title: '{% trans "Description" %}',
},
{
field: 'required',
@@ -581,14 +581,14 @@ function loadPartTestTemplateTable(table, options) {
},
{
field: 'requires_value',
- title: "{% trans "Requires Value" %}",
+ title: '{% trans "Requires Value" %}',
formatter: function(value) {
return yesNoLabel(value);
}
},
{
field: 'requires_attachment',
- title: "{% trans "Requires Attachment" %}",
+ title: '{% trans "Requires Attachment" %}',
formatter: function(value) {
return yesNoLabel(value);
}
@@ -608,7 +608,9 @@ function loadPartTestTemplateTable(table, options) {
return html;
} else {
- return '{% trans "This test is defined for a parent part" %}';
+ var text = '{% trans "This test is defined for a parent part" %}';
+
+ return renderLink(text, `/part/${row.part}/tests/`);
}
}
}
diff --git a/InvenTree/templates/js/table_filters.js b/InvenTree/templates/js/table_filters.js
index 153411d4e9..d2ea26d8c3 100644
--- a/InvenTree/templates/js/table_filters.js
+++ b/InvenTree/templates/js/table_filters.js
@@ -184,7 +184,11 @@ function getAvailableTableFilters(tableKey) {
active: {
type: 'bool',
title: '{% trans "Active" %}',
- }
+ },
+ overdue: {
+ type: 'bool',
+ title: '{% trans "Overdue" %}',
+ },
};
}
@@ -213,6 +217,10 @@ function getAvailableTableFilters(tableKey) {
type: 'bool',
title: '{% trans "Outstanding" %}',
},
+ overdue: {
+ type: 'bool',
+ title: '{% trans "Overdue" %}',
+ },
};
}
diff --git a/InvenTree/templates/registration/login.html b/InvenTree/templates/registration/login.html
index ed0ef34719..6aab0bb801 100644
--- a/InvenTree/templates/registration/login.html
+++ b/InvenTree/templates/registration/login.html
@@ -1,4 +1,5 @@
{% load static %}
+{% load i18n %}
@@ -26,22 +27,25 @@
-
+
-
InvenTree
-
-
+
InvenTree
+
+
-
-
diff --git a/InvenTree/users/admin.py b/InvenTree/users/admin.py
index 4614e5bc4c..29496d02a7 100644
--- a/InvenTree/users/admin.py
+++ b/InvenTree/users/admin.py
@@ -87,6 +87,64 @@ class RoleGroupAdmin(admin.ModelAdmin):
RuleSetInline,
]
+ list_display = ('name', 'admin', 'part', 'stock', 'build', 'purchase_order', 'sales_order')
+
+ def get_rule_set(self, obj, rule_set_type):
+ ''' Return list of permissions for the given ruleset '''
+
+ # Get all rulesets associated to object
+ rule_sets = RuleSet.objects.filter(group=obj.pk)
+
+ # Select ruleset based on type
+ for rule_set in rule_sets:
+ if rule_set.name == rule_set_type:
+ break
+
+ def append_permission_level(permission_level, next_level):
+ if not permission_level:
+ return next_level
+
+ if permission_level[:-1].endswith('|'):
+ permission_level += next_level
+ else:
+ permission_level += ' | ' + next_level
+
+ return permission_level
+
+ permission_level = ''
+
+ if rule_set.can_view:
+ permission_level = append_permission_level(permission_level, 'V')
+
+ if rule_set.can_add:
+ permission_level = append_permission_level(permission_level, 'A')
+
+ if rule_set.can_change:
+ permission_level = append_permission_level(permission_level, 'C')
+
+ if rule_set.can_delete:
+ permission_level = append_permission_level(permission_level, 'D')
+
+ return permission_level
+
+ def admin(self, obj):
+ return self.get_rule_set(obj, 'admin')
+
+ def part(self, obj):
+ return self.get_rule_set(obj, 'part')
+
+ def stock(self, obj):
+ return self.get_rule_set(obj, 'stock')
+
+ def build(self, obj):
+ return self.get_rule_set(obj, 'build')
+
+ def purchase_order(self, obj):
+ return self.get_rule_set(obj, 'purchase_order')
+
+ def sales_order(self, obj):
+ return self.get_rule_set(obj, 'sales_order')
+
def get_formsets_with_inlines(self, request, obj=None):
for inline in self.get_inline_instances(request, obj):
# Hide RuleSetInline in the 'Add role' view