');
+ addedFilterControl = true;
+
+ if (column.searchable && that.options.filterTemplate[nameControl]) {
+ html.push(that.options.filterTemplate[nameControl](that, column.field, column.filterControlPlaceholder ? column.filterControlPlaceholder : '', column.filterDefault));
+ }
+ }
+
+ if (!column.filterControl && '' !== column.filterDefault && 'undefined' !== typeof column.filterDefault) {
+ if ($.isEmptyObject(that.filterColumnsPartial)) {
+ that.filterColumnsPartial = {};
+ }
+
+ that.filterColumnsPartial[column.field] = column.filterDefault;
+ }
+
+ $.each(header.find('th'), function (i, th) {
+ var $th = $(th);
+
+ if ($th.data('field') === column.field) {
+ $th.find('.fht-cell').append(html.join(''));
+ return false;
+ }
+ });
+
+ if (column.filterData && column.filterData.toLowerCase() !== 'column') {
+ var filterDataType = getFilterDataMethod(
+ /* eslint-disable no-use-before-define */
+ filterDataMethods, column.filterData.substring(0, column.filterData.indexOf(':')));
+ var filterDataSource;
+ var selectControl;
+
+ if (filterDataType) {
+ filterDataSource = column.filterData.substring(column.filterData.indexOf(':') + 1, column.filterData.length);
+ selectControl = header.find(".bootstrap-table-filter-control-".concat(escapeID(column.field)));
+ addOptionToSelectControl(selectControl, '', column.filterControlPlaceholder, column.filterDefault);
+ filterDataType(filterDataSource, selectControl, that.options.filterOrderBy, column.filterDefault);
+ } else {
+ throw new SyntaxError('Error. You should use any of these allowed filter data methods: var, obj, json, url, func.' + ' Use like this: var: {key: "value"}');
+ }
+ }
+ });
+
+ if (addedFilterControl) {
+ header.off('keyup', 'input').on('keyup', 'input', function (_ref4, obj) {
+ var currentTarget = _ref4.currentTarget,
+ keyCode = _ref4.keyCode;
+ syncControls(that); // Simulate enter key action from clear button
+
+ keyCode = obj ? obj.keyCode : keyCode;
+
+ if (that.options.searchOnEnterKey && keyCode !== 13) {
+ return;
+ }
+
+ if ($.inArray(keyCode, [37, 38, 39, 40]) > -1) {
+ return;
+ }
+
+ var $currentTarget = $(currentTarget);
+
+ if ($currentTarget.is(':checkbox') || $currentTarget.is(':radio')) {
+ return;
+ }
+
+ clearTimeout(currentTarget.timeoutId || 0);
+ currentTarget.timeoutId = setTimeout(function () {
+ that.onColumnSearch({
+ currentTarget: currentTarget,
+ keyCode: keyCode
+ });
+ }, that.options.searchTimeOut);
+ });
+ header.off('change', 'select:not(".ms-offscreen")').on('change', 'select:not(".ms-offscreen")', function (_ref5) {
+ var currentTarget = _ref5.currentTarget,
+ keyCode = _ref5.keyCode;
+ syncControls(that);
+ var $select = $(currentTarget);
+ var value = $select.val();
+
+ if (value && value.length > 0 && value.trim()) {
+ $select.find('option[selected]').removeAttr('selected');
+ $select.find('option[value="' + value + '"]').attr('selected', true);
+ } else {
+ $select.find('option[selected]').removeAttr('selected');
+ }
+
+ clearTimeout(currentTarget.timeoutId || 0);
+ currentTarget.timeoutId = setTimeout(function () {
+ that.onColumnSearch({
+ currentTarget: currentTarget,
+ keyCode: keyCode
+ });
+ }, that.options.searchTimeOut);
+ });
+ header.off('mouseup', 'input:not([type=radio])').on('mouseup', 'input:not([type=radio])', function (_ref6) {
+ var currentTarget = _ref6.currentTarget,
+ keyCode = _ref6.keyCode;
+ var $input = $(currentTarget);
+ var oldValue = $input.val();
+
+ if (oldValue === '') {
+ return;
+ }
+
+ setTimeout(function () {
+ syncControls(that);
+ var newValue = $input.val();
+
+ if (newValue === '') {
+ clearTimeout(currentTarget.timeoutId || 0);
+ currentTarget.timeoutId = setTimeout(function () {
+ that.onColumnSearch({
+ currentTarget: currentTarget,
+ keyCode: keyCode
+ });
+ }, that.options.searchTimeOut);
+ }
+ }, 1);
+ });
+ header.off('change', 'input[type=radio]').on('change', 'input[type=radio]', function (_ref7) {
+ var currentTarget = _ref7.currentTarget,
+ keyCode = _ref7.keyCode;
+ clearTimeout(currentTarget.timeoutId || 0);
+ currentTarget.timeoutId = setTimeout(function () {
+ syncControls(that);
+ that.onColumnSearch({
+ currentTarget: currentTarget,
+ keyCode: keyCode
+ });
+ }, that.options.searchTimeOut);
+ });
+
+ if (header.find('.date-filter-control').length > 0) {
+ $.each(that.columns, function (i, _ref8) {
+ var filterControl = _ref8.filterControl,
+ field = _ref8.field,
+ filterDatepickerOptions = _ref8.filterDatepickerOptions;
+
+ if (filterControl !== undefined && filterControl.toLowerCase() === 'datepicker') {
+ header.find(".date-filter-control.bootstrap-table-filter-control-".concat(field)).datepicker(filterDatepickerOptions).on('changeDate', function (_ref9) {
+ var currentTarget = _ref9.currentTarget,
+ keyCode = _ref9.keyCode;
+ clearTimeout(currentTarget.timeoutId || 0);
+ currentTarget.timeoutId = setTimeout(function () {
+ syncControls(that);
+ that.onColumnSearch({
+ currentTarget: currentTarget,
+ keyCode: keyCode
+ });
+ }, that.options.searchTimeOut);
+ });
+ }
+ });
+ }
+
+ if (that.options.sidePagination !== 'server' && !that.options.height) {
+ that.triggerSearch();
+ }
+
+ if (!that.options.filterControlVisible) {
+ header.find('.filter-control, .no-filter-control').hide();
+ }
+ } else {
+ header.find('.filter-control, .no-filter-control').hide();
+ }
+
+ that.trigger('created-controls');
+ }
+ function getDirectionOfSelectOptions(_alignment) {
+ var alignment = _alignment === undefined ? 'left' : _alignment.toLowerCase();
+
+ switch (alignment) {
+ case 'left':
+ return 'ltr';
+
+ case 'right':
+ return 'rtl';
+
+ case 'auto':
+ return 'auto';
+
+ default:
+ return 'ltr';
+ }
+ }
+ function syncControls(that) {
+ if (that.options.height) {
+ var controlsTableHeader = that.$tableHeader.find(searchControls);
+ that.$header.find(searchControls).each(function (_, control) {
+ var $control = $(control);
+ var controlClass = getElementClass($control);
+ var foundControl = controlsTableHeader.filter(function (_, ele) {
+ var eleClass = getElementClass($(ele));
+ return controlClass === eleClass;
+ });
+
+ if (foundControl.length === 0) {
+ return;
+ }
+
+ if ($control.is('select')) {
+ $control.find('option:selected').removeAttr('selected');
+ $control.find("option[value='".concat(foundControl.val(), "']")).attr('selected', true);
+ } else {
+ $control.val(foundControl.val());
+ }
+ });
+ }
+ }
+ var filterDataMethods = {
+ func: function func(filterDataSource, selectControl, filterOrderBy, selected) {
+ var variableValues = window[filterDataSource].apply();
+
+ for (var key in variableValues) {
+ addOptionToSelectControl(selectControl, key, variableValues[key], selected);
+ }
+
+ sortSelectControl(selectControl, filterOrderBy);
+ },
+ obj: function obj(filterDataSource, selectControl, filterOrderBy, selected) {
+ var objectKeys = filterDataSource.split('.');
+ var variableName = objectKeys.shift();
+ var variableValues = window[variableName];
+
+ if (objectKeys.length > 0) {
+ objectKeys.forEach(function (key) {
+ variableValues = variableValues[key];
+ });
+ }
+
+ for (var key in variableValues) {
+ addOptionToSelectControl(selectControl, key, variableValues[key], selected);
+ }
+
+ sortSelectControl(selectControl, filterOrderBy);
+ },
+ var: function _var(filterDataSource, selectControl, filterOrderBy, selected) {
+ var variableValues = window[filterDataSource];
+ var isArray = Array.isArray(variableValues);
+
+ for (var key in variableValues) {
+ if (isArray) {
+ addOptionToSelectControl(selectControl, variableValues[key], variableValues[key], selected);
+ } else {
+ addOptionToSelectControl(selectControl, key, variableValues[key], selected);
+ }
+ }
+
+ sortSelectControl(selectControl, filterOrderBy);
+ },
+ url: function url(filterDataSource, selectControl, filterOrderBy, selected) {
+ $.ajax({
+ url: filterDataSource,
+ dataType: 'json',
+ success: function success(data) {
+ for (var key in data) {
+ addOptionToSelectControl(selectControl, key, data[key], selected);
+ }
+
+ sortSelectControl(selectControl, filterOrderBy);
+ }
+ });
+ },
+ json: function json(filterDataSource, selectControl, filterOrderBy, selected) {
+ var variableValues = JSON.parse(filterDataSource);
+
+ for (var key in variableValues) {
+ addOptionToSelectControl(selectControl, key, variableValues[key], selected);
+ }
+
+ sortSelectControl(selectControl, filterOrderBy);
+ }
+ };
+
+ exports.addOptionToSelectControl = addOptionToSelectControl;
+ exports.collectBootstrapCookies = collectBootstrapCookies;
+ exports.copyValues = copyValues;
+ exports.createControls = createControls;
+ exports.escapeID = escapeID;
+ exports.existOptionInSelectControl = existOptionInSelectControl;
+ exports.fixHeaderCSS = fixHeaderCSS;
+ exports.getControlContainer = getControlContainer;
+ exports.getCursorPosition = getCursorPosition;
+ exports.getDirectionOfSelectOptions = getDirectionOfSelectOptions;
+ exports.getElementClass = getElementClass;
+ exports.getFilterDataMethod = getFilterDataMethod;
+ exports.getOptionsFromSelectControl = getOptionsFromSelectControl;
+ exports.getSearchControls = getSearchControls;
+ exports.hasSelectControlElement = hasSelectControlElement;
+ exports.hideUnusedSelectOptions = hideUnusedSelectOptions;
+ exports.initFilterSelectControls = initFilterSelectControls;
+ exports.isColumnSearchableViaSelect = isColumnSearchableViaSelect;
+ exports.isFilterDataNotGiven = isFilterDataNotGiven;
+ exports.setCursorPosition = setCursorPosition;
+ exports.setValues = setValues;
+ exports.sortSelectControl = sortSelectControl;
+ exports.syncControls = syncControls;
+
+ Object.defineProperty(exports, '__esModule', { value: true });
+
+})));
diff --git a/InvenTree/InvenTree/static/script/inventree/inventree.js b/InvenTree/InvenTree/static/script/inventree/inventree.js
index 45565f1d6a..263e28fc01 100644
--- a/InvenTree/InvenTree/static/script/inventree/inventree.js
+++ b/InvenTree/InvenTree/static/script/inventree/inventree.js
@@ -105,9 +105,14 @@ function makeProgressBar(value, maximum, opts) {
var options = opts || {};
value = parseFloat(value);
- maximum = parseFloat(maximum);
- var percent = parseInt(value / maximum * 100);
+ var percent = 100;
+
+ // Prevent div-by-zero or null value
+ if (maximum && maximum > 0) {
+ maximum = parseFloat(maximum);
+ percent = parseInt(value / maximum * 100);
+ }
if (percent > 100) {
percent = 100;
@@ -115,18 +120,28 @@ function makeProgressBar(value, maximum, opts) {
var extraclass = '';
- if (value > maximum) {
+ if (maximum) {
+ // TODO - Special color?
+ }
+ else if (value > maximum) {
extraclass='progress-bar-over';
} else if (value < maximum) {
extraclass = 'progress-bar-under';
}
+ var text = value;
+
+ if (maximum) {
+ text += ' / ';
+ text += maximum;
+ }
+
var id = options.id || 'progress-bar';
return `
-
${value} / ${maximum}
+
${text}
`;
}
diff --git a/InvenTree/InvenTree/static/script/inventree/tables.js b/InvenTree/InvenTree/static/script/inventree/tables.js
index cc4320307b..6d57240979 100644
--- a/InvenTree/InvenTree/static/script/inventree/tables.js
+++ b/InvenTree/InvenTree/static/script/inventree/tables.js
@@ -109,10 +109,20 @@ $.fn.inventreeTable = function(options) {
options.pagination = true;
options.pageSize = inventreeLoad(varName, 25);
options.pageList = [25, 50, 100, 250, 'all'];
+
options.rememberOrder = true;
- options.sortable = true;
- options.search = true;
- options.showColumns = true;
+
+ if (options.sortable == null) {
+ options.sortable = true;
+ }
+
+ if (options.search == null) {
+ options.search = true;
+ }
+
+ if (options.showColumns == null) {
+ options.showColumns = true;
+ }
// Callback to save pagination data
options.onPageChange = function(number, size) {
diff --git a/InvenTree/InvenTree/urls.py b/InvenTree/InvenTree/urls.py
index c433cef382..d718871851 100644
--- a/InvenTree/InvenTree/urls.py
+++ b/InvenTree/InvenTree/urls.py
@@ -117,6 +117,7 @@ urlpatterns = [
url(r'^edit-user/', EditUserView.as_view(), name='edit-user'),
url(r'^set-password/', SetPasswordView.as_view(), name='set-password'),
+ url(r'^admin/shell/', include('django_admin_shell.urls')),
url(r'^admin/', admin.site.urls, name='inventree-admin'),
url(r'^qr_code/', include(qr_code_urls, namespace='qr_code')),
diff --git a/InvenTree/company/apps.py b/InvenTree/company/apps.py
index 0afb18f616..5f84ce507f 100644
--- a/InvenTree/company/apps.py
+++ b/InvenTree/company/apps.py
@@ -38,4 +38,5 @@ class CompanyConfig(AppConfig):
company.image = None
company.save()
except (OperationalError, ProgrammingError):
- print("Could not generate Company thumbnails")
+ # Getting here probably meant the database was in test mode
+ pass
diff --git a/InvenTree/company/migrations/0019_auto_20200413_0642.py b/InvenTree/company/migrations/0019_auto_20200413_0642.py
index c81dfd795a..c3c2f58ea0 100644
--- a/InvenTree/company/migrations/0019_auto_20200413_0642.py
+++ b/InvenTree/company/migrations/0019_auto_20200413_0642.py
@@ -24,7 +24,6 @@ def reverse_association(apps, schema_editor):
# Exit if there are no SupplierPart objects
# This crucial otherwise the unit test suite fails!
if SupplierPart.objects.count() == 0:
- print("No SupplierPart objects - skipping")
return
print("Reversing migration for manufacturer association")
@@ -105,7 +104,6 @@ def associate_manufacturers(apps, schema_editor):
# Exit if there are no SupplierPart objects
# This crucial otherwise the unit test suite fails!
if SupplierPart.objects.count() == 0:
- print("No SupplierPart objects - skipping")
return
# Link a 'manufacturer_name' to a 'Company'
diff --git a/InvenTree/locale/de/LC_MESSAGES/django.mo b/InvenTree/locale/de/LC_MESSAGES/django.mo
index 6c5d41663c..6391f0ae5a 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 95c8b95fb6..493d4a8b06 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-09-28 12:03+0000\n"
+"POT-Creation-Date: 2020-10-04 14:02+0000\n"
"PO-Revision-Date: 2020-05-03 11:32+0200\n"
"Last-Translator: Christian Schlüter
\n"
"Language-Team: C \n"
@@ -92,7 +92,7 @@ msgstr "Datei zum Anhängen auswählen"
msgid "File comment"
msgstr "Datei-Kommentar"
-#: InvenTree/models.py:68 templates/js/stock.html:690
+#: InvenTree/models.py:68 templates/js/stock.html:699
msgid "User"
msgstr "Benutzer"
@@ -107,19 +107,19 @@ msgstr "Name"
msgid "Description (optional)"
msgstr "Firmenbeschreibung"
-#: InvenTree/settings.py:341
+#: InvenTree/settings.py:342
msgid "English"
msgstr "Englisch"
-#: InvenTree/settings.py:342
+#: InvenTree/settings.py:343
msgid "German"
msgstr "Deutsch"
-#: InvenTree/settings.py:343
+#: InvenTree/settings.py:344
msgid "French"
msgstr "Französisch"
-#: InvenTree/settings.py:344
+#: InvenTree/settings.py:345
msgid "Polish"
msgstr "Polnisch"
@@ -151,7 +151,8 @@ msgstr "Verloren"
msgid "Returned"
msgstr "Zurückgegeben"
-#: InvenTree/status_codes.py:136 order/templates/order/sales_order_base.html:98
+#: InvenTree/status_codes.py:136
+#: order/templates/order/sales_order_base.html:103
msgid "Shipped"
msgstr "Versendet"
@@ -206,7 +207,7 @@ 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:639
+#: InvenTree/views.py:661
msgid "Database Statistics"
msgstr "Datenbankstatistiken"
@@ -266,7 +267,7 @@ msgstr "Standort-Details"
msgid "Serial numbers"
msgstr "Seriennummer"
-#: build/forms.py:64 stock/forms.py:107
+#: build/forms.py:64 stock/forms.py:111
msgid "Enter unique serial numbers (or leave blank)"
msgstr "Eindeutige Seriennummern eingeben (oder leer lassen)"
@@ -280,7 +281,7 @@ msgstr "Bau-Fertigstellung bestätigen"
msgid "Build quantity must be integer value for trackable parts"
msgstr "Überschuss muss eine Ganzzahl oder ein Prozentwert sein"
-#: build/models.py:73 build/templates/build/build_base.html:65
+#: build/models.py:73 build/templates/build/build_base.html:70
msgid "Build Title"
msgstr "Bau-Titel"
@@ -288,7 +289,7 @@ msgstr "Bau-Titel"
msgid "Brief description of the build"
msgstr "Kurze Beschreibung des Baus"
-#: build/models.py:84 build/templates/build/build_base.html:86
+#: build/models.py:84 build/templates/build/build_base.html:91
msgid "Parent Build"
msgstr "Eltern-Bau"
@@ -298,18 +299,17 @@ msgstr "Eltern-Bau, dem dieser Bau zugewiesen ist"
#: build/models.py:90 build/templates/build/allocate.html:329
#: build/templates/build/auto_allocate.html:19
-#: build/templates/build/build_base.html:70
+#: build/templates/build/build_base.html:75
#: build/templates/build/detail.html:22 order/models.py:501
#: order/templates/order/order_wizard/select_parts.html:30
#: order/templates/order/purchase_order_detail.html:147
-#: order/templates/order/receive_parts.html:19 part/models.py:241
+#: order/templates/order/receive_parts.html:19 part/models.py:293
#: part/templates/part/part_app_base.html:7
-#: part/templates/part/set_category.html:13
-#: stock/templates/stock/item_installed.html:60
-#: templates/InvenTree/search.html:123 templates/js/barcode.html:336
-#: templates/js/bom.html:124 templates/js/build.html:47
-#: templates/js/company.html:137 templates/js/part.html:223
-#: templates/js/stock.html:421
+#: part/templates/part/set_category.html:13 templates/InvenTree/search.html:133
+#: templates/js/barcode.html:336 templates/js/bom.html:124
+#: templates/js/build.html:47 templates/js/company.html:137
+#: templates/js/part.html:184 templates/js/part.html:289
+#: templates/js/stock.html:421 templates/js/stock.html:977
msgid "Part"
msgstr "Teil"
@@ -345,7 +345,7 @@ msgstr "Bau-Anzahl"
msgid "Number of parts to build"
msgstr "Anzahl der zu bauenden Teile"
-#: build/models.py:128 part/templates/part/part_base.html:142
+#: build/models.py:128 part/templates/part/part_base.html:145
msgid "Build Status"
msgstr "Bau-Status"
@@ -353,7 +353,7 @@ msgstr "Bau-Status"
msgid "Build status code"
msgstr "Bau-Statuscode"
-#: build/models.py:136 stock/models.py:371
+#: build/models.py:136 stock/models.py:387
msgid "Batch Code"
msgstr "Losnummer"
@@ -364,12 +364,12 @@ msgstr "Chargennummer für diese Bau-Ausgabe"
#: build/models.py:155 build/templates/build/detail.html:55
#: company/templates/company/supplier_part_base.html:60
#: company/templates/company/supplier_part_detail.html:24
-#: part/templates/part/detail.html:80 part/templates/part/part_base.html:89
-#: stock/models.py:365 stock/templates/stock/item_base.html:232
+#: part/templates/part/detail.html:80 part/templates/part/part_base.html:92
+#: stock/models.py:381 stock/templates/stock/item_base.html:244
msgid "External Link"
msgstr "Externer Link"
-#: build/models.py:156 stock/models.py:367
+#: build/models.py:156 stock/models.py:383
msgid "Link to external URL"
msgstr "Link zu einer externen URL"
@@ -377,10 +377,10 @@ msgstr "Link zu einer externen URL"
#: company/templates/company/tabs.html:33 order/templates/order/po_tabs.html:15
#: order/templates/order/purchase_order_detail.html:202
#: order/templates/order/so_tabs.html:23 part/templates/part/tabs.html:67
-#: stock/forms.py:281 stock/forms.py:309 stock/models.py:433
-#: stock/models.py:1353 stock/templates/stock/tabs.html:26
-#: templates/js/barcode.html:391 templates/js/bom.html:219
-#: templates/js/stock.html:116 templates/js/stock.html:534
+#: stock/forms.py:306 stock/forms.py:338 stock/forms.py:366 stock/models.py:453
+#: stock/models.py:1404 stock/templates/stock/tabs.html:26
+#: templates/js/barcode.html:391 templates/js/bom.html:223
+#: templates/js/stock.html:116 templates/js/stock.html:543
msgid "Notes"
msgstr "Notizen"
@@ -425,7 +425,7 @@ msgstr "Lagerobjekt-Anzahl dem Bau zuweisen"
#: build/templates/build/allocate.html:17
#: company/templates/company/detail_part.html:18 order/views.py:779
-#: part/templates/part/category.html:107
+#: part/templates/part/category.html:112
msgid "Order Parts"
msgstr "Teile bestellen"
@@ -441,24 +441,24 @@ msgstr "Automatisches Zuweisen"
msgid "Unallocate"
msgstr "Zuweisung aufheben"
-#: build/templates/build/allocate.html:87 templates/stock_table.html:8
+#: build/templates/build/allocate.html:87 templates/stock_table.html:9
msgid "New Stock Item"
msgstr "Neues Lagerobjekt"
-#: build/templates/build/allocate.html:88 stock/views.py:1327
+#: build/templates/build/allocate.html:88 stock/views.py:1428
msgid "Create new Stock Item"
msgstr "Neues Lagerobjekt hinzufügen"
#: build/templates/build/allocate.html:170
#: order/templates/order/sales_order_detail.html:68
-#: order/templates/order/sales_order_detail.html:150 stock/models.py:359
-#: stock/templates/stock/item_base.html:148
+#: order/templates/order/sales_order_detail.html:150 stock/models.py:375
+#: stock/templates/stock/item_base.html:156
msgid "Serial Number"
msgstr "Seriennummer"
#: build/templates/build/allocate.html:172
#: build/templates/build/auto_allocate.html:20
-#: build/templates/build/build_base.html:75
+#: build/templates/build/build_base.html:80
#: build/templates/build/detail.html:27
#: company/templates/company/supplier_part_pricing.html:71
#: order/templates/order/order_wizard/select_parts.html:32
@@ -467,22 +467,22 @@ msgstr "Seriennummer"
#: order/templates/order/sales_order_detail.html:152
#: part/templates/part/allocation.html:16
#: part/templates/part/allocation.html:49
-#: part/templates/part/sale_prices.html:80
+#: part/templates/part/sale_prices.html:80 stock/forms.py:297
#: stock/templates/stock/item_base.html:26
#: stock/templates/stock/item_base.html:32
-#: stock/templates/stock/item_base.html:154
+#: stock/templates/stock/item_base.html:162
#: stock/templates/stock/stock_adjust.html:18 templates/js/barcode.html:338
#: templates/js/bom.html:162 templates/js/build.html:58
-#: templates/js/stock.html:681
+#: templates/js/stock.html:690 templates/js/stock.html:905
msgid "Quantity"
msgstr "Anzahl"
#: build/templates/build/allocate.html:186
-#: build/templates/build/auto_allocate.html:21 stock/forms.py:279
-#: stock/templates/stock/item_base.html:186
+#: build/templates/build/auto_allocate.html:21 stock/forms.py:336
+#: stock/templates/stock/item_base.html:198
#: stock/templates/stock/stock_adjust.html:17
-#: templates/InvenTree/search.html:173 templates/js/barcode.html:337
-#: templates/js/stock.html:512
+#: templates/InvenTree/search.html:183 templates/js/barcode.html:337
+#: templates/js/stock.html:518
msgid "Location"
msgstr "Standort"
@@ -496,7 +496,7 @@ msgstr "Lagerobjekt-Standort bearbeiten"
msgid "Delete stock allocation"
msgstr "Zuweisung löschen"
-#: build/templates/build/allocate.html:238 templates/js/bom.html:330
+#: build/templates/build/allocate.html:238 templates/js/bom.html:334
msgid "No BOM items found"
msgstr "Keine BOM-Einträge gefunden"
@@ -505,12 +505,12 @@ msgstr "Keine BOM-Einträge gefunden"
#: company/templates/company/supplier_part_detail.html:27
#: order/templates/order/purchase_order_detail.html:159
#: part/templates/part/detail.html:51 part/templates/part/set_category.html:14
-#: stock/templates/stock/item_installed.html:83
-#: templates/InvenTree/search.html:137 templates/js/bom.html:147
+#: templates/InvenTree/search.html:147 templates/js/bom.html:147
#: templates/js/company.html:56 templates/js/order.html:159
#: templates/js/order.html:234 templates/js/part.html:120
-#: templates/js/part.html:279 templates/js/part.html:460
-#: templates/js/stock.html:444 templates/js/stock.html:662
+#: templates/js/part.html:203 templates/js/part.html:345
+#: templates/js/part.html:526 templates/js/stock.html:444
+#: templates/js/stock.html:671
msgid "Description"
msgstr "Beschreibung"
@@ -520,8 +520,8 @@ msgstr "Beschreibung"
msgid "Reference"
msgstr "Referenz"
-#: build/templates/build/allocate.html:347 part/models.py:1348
-#: templates/js/part.html:464 templates/js/table_filters.html:121
+#: build/templates/build/allocate.html:347 part/models.py:1401
+#: templates/js/part.html:530 templates/js/table_filters.html:121
msgid "Required"
msgstr "benötigt"
@@ -573,7 +573,7 @@ msgstr "Lagerobjekt wurde zugewiesen"
#: build/templates/build/build_base.html:8
#: build/templates/build/build_base.html:34
#: build/templates/build/complete.html:6
-#: stock/templates/stock/item_base.html:211 templates/js/build.html:39
+#: stock/templates/stock/item_base.html:223 templates/js/build.html:39
#: templates/navbar.html:20
msgid "Build"
msgstr "Bau"
@@ -586,40 +586,51 @@ msgstr "Dieser Bau ist der Bestellung zugeordnet"
msgid "This build is a child of Build"
msgstr "Dieser Bau ist Kind von Bau"
-#: build/templates/build/build_base.html:61 build/templates/build/detail.html:9
+#: build/templates/build/build_base.html:39
+#: company/templates/company/company_base.html:27
+#: order/templates/order/order_base.html:28
+#: order/templates/order/sales_order_base.html:38
+#: part/templates/part/category.html:13 part/templates/part/part_base.html:32
+#: stock/templates/stock/item_base.html:69
+#: stock/templates/stock/location.html:12
+#, fuzzy
+#| msgid "Admin"
+msgid "Admin view"
+msgstr "Admin"
+
+#: build/templates/build/build_base.html:66 build/templates/build/detail.html:9
msgid "Build Details"
msgstr "Bau-Status"
-#: build/templates/build/build_base.html:80
+#: build/templates/build/build_base.html:85
#: build/templates/build/detail.html:42
#: order/templates/order/receive_parts.html:24
-#: stock/templates/stock/item_base.html:264
-#: stock/templates/stock/item_installed.html:111
-#: templates/InvenTree/search.html:165 templates/js/barcode.html:42
-#: templates/js/build.html:63 templates/js/order.html:164
-#: templates/js/order.html:239 templates/js/stock.html:499
+#: stock/templates/stock/item_base.html:276 templates/InvenTree/search.html:175
+#: templates/js/barcode.html:42 templates/js/build.html:63
+#: templates/js/order.html:164 templates/js/order.html:239
+#: templates/js/stock.html:505 templates/js/stock.html:913
msgid "Status"
msgstr "Status"
-#: build/templates/build/build_base.html:93 order/models.py:499
+#: build/templates/build/build_base.html:98 order/models.py:499
#: 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:174 templates/js/order.html:213
+#: stock/templates/stock/item_base.html:186 templates/js/order.html:213
msgid "Sales Order"
msgstr "Bestellung"
-#: build/templates/build/build_base.html:99
+#: build/templates/build/build_base.html:104
msgid "BOM Price"
msgstr "Stücklistenpreis"
-#: build/templates/build/build_base.html:104
+#: build/templates/build/build_base.html:109
msgid "BOM pricing is incomplete"
msgstr "Stücklistenbepreisung ist unvollständig"
-#: build/templates/build/build_base.html:107
+#: build/templates/build/build_base.html:112
msgid "No pricing information"
msgstr "Keine Preisinformation"
@@ -676,15 +687,15 @@ msgid "Stock can be taken from any available location."
msgstr "Bestand kann jedem verfügbaren Lagerort entnommen werden."
#: build/templates/build/detail.html:48
-#: stock/templates/stock/item_base.html:204
-#: stock/templates/stock/item_installed.html:119 templates/js/stock.html:507
-#: templates/js/table_filters.html:34 templates/js/table_filters.html:100
+#: stock/templates/stock/item_base.html:216 templates/js/stock.html:513
+#: templates/js/stock.html:920 templates/js/table_filters.html:34
+#: templates/js/table_filters.html:100
msgid "Batch"
msgstr "Los"
#: build/templates/build/detail.html:61
-#: order/templates/order/order_base.html:93
-#: order/templates/order/sales_order_base.html:92 templates/js/build.html:71
+#: order/templates/order/order_base.html:98
+#: order/templates/order/sales_order_base.html:97 templates/js/build.html:71
msgid "Created"
msgstr "Erstellt"
@@ -798,7 +809,7 @@ msgstr "Baufertigstellung bestätigen"
msgid "Invalid location selected"
msgstr "Ungültige Ortsauswahl"
-#: build/views.py:296 stock/views.py:1520
+#: build/views.py:296 stock/views.py:1621
#, python-brace-format
msgid "The following serial numbers already exist: ({sn})"
msgstr "Die folgende Seriennummer existiert bereits: ({sn})"
@@ -913,7 +924,7 @@ msgstr "Beschreibung des Teils"
msgid "Description of the company"
msgstr "Firmenbeschreibung"
-#: company/models.py:91 company/templates/company/company_base.html:48
+#: company/models.py:91 company/templates/company/company_base.html:53
#: templates/js/company.html:61
msgid "Website"
msgstr "Website"
@@ -922,7 +933,7 @@ msgstr "Website"
msgid "Company website URL"
msgstr "Firmenwebsite"
-#: company/models.py:94 company/templates/company/company_base.html:55
+#: company/models.py:94 company/templates/company/company_base.html:60
msgid "Address"
msgstr "Adresse"
@@ -940,7 +951,7 @@ msgstr "Kontakt-Tel."
msgid "Contact phone number"
msgstr "Kontakt-Tel."
-#: company/models.py:101 company/templates/company/company_base.html:69
+#: company/models.py:101 company/templates/company/company_base.html:74
msgid "Email"
msgstr "Email"
@@ -948,7 +959,7 @@ msgstr "Email"
msgid "Contact email address"
msgstr "Kontakt-Email"
-#: company/models.py:104 company/templates/company/company_base.html:76
+#: company/models.py:104 company/templates/company/company_base.html:81
msgid "Contact"
msgstr "Kontakt"
@@ -972,8 +983,8 @@ msgstr "Kaufen Sie Teile von dieser Firma?"
msgid "Does this company manufacture parts?"
msgstr "Produziert diese Firma Teile?"
-#: company/models.py:279 stock/models.py:319
-#: stock/templates/stock/item_base.html:140
+#: company/models.py:279 stock/models.py:335
+#: stock/templates/stock/item_base.html:148
msgid "Base Part"
msgstr "Basisteil"
@@ -1025,12 +1036,12 @@ msgstr "Zugewiesen"
msgid "Company"
msgstr "Firma"
-#: company/templates/company/company_base.html:42
+#: company/templates/company/company_base.html:47
#: company/templates/company/detail.html:8
msgid "Company Details"
msgstr "Firmendetails"
-#: company/templates/company/company_base.html:62
+#: company/templates/company/company_base.html:67
msgid "Phone"
msgstr "Telefon"
@@ -1044,16 +1055,16 @@ msgstr "Hersteller"
#: company/templates/company/detail.html:21
#: company/templates/company/supplier_part_base.html:66
#: company/templates/company/supplier_part_detail.html:21
-#: order/templates/order/order_base.html:74
+#: 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:239 templates/js/company.html:48
+#: stock/templates/stock/item_base.html:251 templates/js/company.html:48
#: templates/js/company.html:162 templates/js/order.html:146
msgid "Supplier"
msgstr "Zulieferer"
#: company/templates/company/detail.html:26
-#: order/templates/order/sales_order_base.html:73 stock/models.py:354
-#: stock/models.py:355 stock/templates/stock/item_base.html:161
+#: order/templates/order/sales_order_base.html:78 stock/models.py:370
+#: stock/models.py:371 stock/templates/stock/item_base.html:169
#: templates/js/company.html:40 templates/js/order.html:221
msgid "Customer"
msgstr "Kunde"
@@ -1069,18 +1080,18 @@ msgstr "Neues Zuliefererteil anlegen"
#: company/templates/company/detail_part.html:13
#: order/templates/order/purchase_order_detail.html:67
-#: part/templates/part/supplier.html:13 templates/js/stock.html:788
+#: part/templates/part/supplier.html:13 templates/js/stock.html:797
msgid "New Supplier Part"
msgstr "Neues Zulieferer-Teil"
#: company/templates/company/detail_part.html:15
-#: part/templates/part/category.html:104 part/templates/part/supplier.html:15
-#: stock/templates/stock/item_installed.html:16 templates/stock_table.html:10
+#: part/templates/part/category.html:109 part/templates/part/supplier.html:15
+#: templates/stock_table.html:11
msgid "Options"
msgstr "Optionen"
#: company/templates/company/detail_part.html:18
-#: part/templates/part/category.html:107
+#: part/templates/part/category.html:112
#, fuzzy
#| msgid "Order part"
msgid "Order parts"
@@ -1097,7 +1108,7 @@ msgid "Delete Parts"
msgstr "Teile löschen"
#: company/templates/company/detail_part.html:43
-#: part/templates/part/category.html:102 templates/js/stock.html:782
+#: part/templates/part/category.html:107 templates/js/stock.html:791
msgid "New Part"
msgstr "Neues Teil"
@@ -1129,8 +1140,8 @@ msgstr "Zuliefererbestand"
#: company/templates/company/detail_stock.html:35
#: company/templates/company/supplier_part_stock.html:33
-#: part/templates/part/category.html:101 part/templates/part/category.html:108
-#: part/templates/part/stock.html:51 templates/stock_table.html:5
+#: part/templates/part/category.html:106 part/templates/part/category.html:113
+#: part/templates/part/stock.html:51 templates/stock_table.html:6
msgid "Export"
msgstr "Exportieren"
@@ -1187,8 +1198,8 @@ msgid "New Sales Order"
msgstr "Neuer Auftrag"
#: company/templates/company/supplier_part_base.html:6
-#: company/templates/company/supplier_part_base.html:19 stock/models.py:328
-#: stock/templates/stock/item_base.html:244 templates/js/company.html:178
+#: company/templates/company/supplier_part_base.html:19 stock/models.py:344
+#: stock/templates/stock/item_base.html:256 templates/js/company.html:178
msgid "Supplier Part"
msgstr "Zulieferer-Teil"
@@ -1240,7 +1251,7 @@ msgid "Pricing Information"
msgstr "Preisinformationen ansehen"
#: company/templates/company/supplier_part_pricing.html:15 company/views.py:399
-#: part/templates/part/sale_prices.html:13 part/views.py:2108
+#: part/templates/part/sale_prices.html:13 part/views.py:2149
msgid "Add Price Break"
msgstr "Preisstaffel hinzufügen"
@@ -1252,7 +1263,7 @@ msgid "No price break information found"
msgstr "Keine Firmeninformation gefunden"
#: company/templates/company/supplier_part_pricing.html:76
-#: part/templates/part/sale_prices.html:85 templates/js/bom.html:203
+#: part/templates/part/sale_prices.html:85 templates/js/bom.html:207
msgid "Price"
msgstr "Preis"
@@ -1280,9 +1291,8 @@ msgstr "Bepreisung"
#: company/templates/company/supplier_part_tabs.html:8
#: company/templates/company/tabs.html:12 part/templates/part/tabs.html:18
-#: stock/templates/stock/item_installed.html:91
-#: stock/templates/stock/location.html:12 templates/InvenTree/search.html:145
-#: templates/js/part.html:124 templates/js/part.html:306
+#: stock/templates/stock/location.html:17 templates/InvenTree/search.html:155
+#: templates/js/part.html:124 templates/js/part.html:372
#: templates/js/stock.html:452 templates/navbar.html:19
msgid "Stock"
msgstr "Lagerbestand"
@@ -1292,9 +1302,10 @@ msgid "Orders"
msgstr "Bestellungen"
#: company/templates/company/tabs.html:9
-#: order/templates/order/receive_parts.html:14 part/models.py:242
-#: part/templates/part/cat_link.html:7 part/templates/part/category.html:83
-#: templates/navbar.html:18 templates/stats.html:8 templates/stats.html:17
+#: order/templates/order/receive_parts.html:14 part/models.py:294
+#: part/templates/part/cat_link.html:7 part/templates/part/category.html:88
+#: part/templates/part/category_tabs.html:6 templates/navbar.html:18
+#: templates/stats.html:8 templates/stats.html:17
msgid "Parts"
msgstr "Teile"
@@ -1363,7 +1374,7 @@ msgstr "Firma gelöscht"
msgid "Edit Supplier Part"
msgstr "Zuliefererteil bearbeiten"
-#: company/views.py:269 templates/js/stock.html:789
+#: company/views.py:269 templates/js/stock.html:798
msgid "Create new Supplier Part"
msgstr "Neues Zuliefererteil anlegen"
@@ -1371,17 +1382,17 @@ msgstr "Neues Zuliefererteil anlegen"
msgid "Delete Supplier Part"
msgstr "Zuliefererteil entfernen"
-#: company/views.py:404 part/views.py:2112
+#: company/views.py:404 part/views.py:2153
#, fuzzy
#| msgid "Add Price Break"
msgid "Added new price break"
msgstr "Preisstaffel hinzufügen"
-#: company/views.py:441 part/views.py:2157
+#: company/views.py:441 part/views.py:2198
msgid "Edit Price Break"
msgstr "Preisstaffel bearbeiten"
-#: company/views.py:456 part/views.py:2171
+#: company/views.py:456 part/views.py:2212
msgid "Delete Price Break"
msgstr "Preisstaffel löschen"
@@ -1422,11 +1433,11 @@ msgid "Mark order as complete"
msgstr "Bestellung als vollständig markieren"
#: order/forms.py:46 order/forms.py:57
-#: order/templates/order/sales_order_base.html:49
+#: order/templates/order/sales_order_base.html:54
msgid "Cancel order"
msgstr "Bestellung stornieren"
-#: order/forms.py:68 order/templates/order/sales_order_base.html:46
+#: order/forms.py:68 order/templates/order/sales_order_base.html:51
msgid "Ship order"
msgstr "Bestellung versenden"
@@ -1487,7 +1498,7 @@ msgid "Date order was completed"
msgstr "Bestellung als vollständig markieren"
#: order/models.py:185 order/models.py:259 part/views.py:1304
-#: stock/models.py:239 stock/models.py:754
+#: stock/models.py:241 stock/models.py:805
msgid "Quantity must be greater than zero"
msgstr "Anzahl muss größer Null sein"
@@ -1525,7 +1536,7 @@ msgstr "Position - Notizen"
#: order/models.py:466 order/templates/order/order_base.html:9
#: order/templates/order/order_base.html:23
-#: stock/templates/stock/item_base.html:218 templates/js/order.html:138
+#: stock/templates/stock/item_base.html:230 templates/js/order.html:138
msgid "Purchase Order"
msgstr "Kaufvertrag"
@@ -1567,32 +1578,32 @@ msgstr "Zuordnungsanzahl eingeben"
msgid "Are you sure you want to delete this attachment?"
msgstr "Sind Sie sicher, dass Sie diesen Anhang löschen wollen?"
-#: order/templates/order/order_base.html:59
+#: order/templates/order/order_base.html:64
msgid "Purchase Order Details"
msgstr "Bestelldetails"
-#: order/templates/order/order_base.html:64
-#: order/templates/order/sales_order_base.html:63
+#: order/templates/order/order_base.html:69
+#: order/templates/order/sales_order_base.html:68
msgid "Order Reference"
msgstr "Bestellreferenz"
-#: order/templates/order/order_base.html:69
-#: order/templates/order/sales_order_base.html:68
+#: order/templates/order/order_base.html:74
+#: order/templates/order/sales_order_base.html:73
msgid "Order Status"
msgstr "Bestellstatus"
-#: order/templates/order/order_base.html:80 templates/js/order.html:153
+#: order/templates/order/order_base.html:85 templates/js/order.html:153
msgid "Supplier Reference"
msgstr "Zuliefererreferenz"
-#: order/templates/order/order_base.html:99
+#: order/templates/order/order_base.html:104
msgid "Issued"
msgstr "Aufgegeben"
-#: order/templates/order/order_base.html:106
+#: order/templates/order/order_base.html:111
#: order/templates/order/purchase_order_detail.html:182
#: order/templates/order/receive_parts.html:22
-#: order/templates/order/sales_order_base.html:105
+#: order/templates/order/sales_order_base.html:110
msgid "Received"
msgstr "Empfangen"
@@ -1672,14 +1683,14 @@ msgstr "Bestellpositionen"
#: order/templates/order/purchase_order_detail.html:38
#: order/templates/order/purchase_order_detail.html:118
-#: part/templates/part/category.html:153 part/templates/part/category.html:194
-#: templates/js/stock.html:794
+#: part/templates/part/category.html:161 part/templates/part/category.html:202
+#: templates/js/stock.html:803
msgid "New Location"
msgstr "Neuer Standort"
#: order/templates/order/purchase_order_detail.html:39
#: order/templates/order/purchase_order_detail.html:119
-#: stock/templates/stock/location.html:16
+#: stock/templates/stock/location.html:21
msgid "Create new stock location"
msgstr "Neuen Lagerort anlegen"
@@ -1714,7 +1725,7 @@ msgid "Select parts to receive against this order"
msgstr ""
#: order/templates/order/receive_parts.html:21
-#: part/templates/part/part_base.html:132 templates/js/part.html:322
+#: part/templates/part/part_base.html:135 templates/js/part.html:388
msgid "On Order"
msgstr "bestellt"
@@ -1732,15 +1743,15 @@ msgstr ""
msgid "This SalesOrder has not been fully allocated"
msgstr "Dieser Auftrag ist nicht vollständig zugeordnet"
-#: order/templates/order/sales_order_base.html:42
+#: order/templates/order/sales_order_base.html:47
msgid "Packing List"
msgstr "Packliste"
-#: order/templates/order/sales_order_base.html:58
+#: order/templates/order/sales_order_base.html:63
msgid "Sales Order Details"
msgstr "Auftragsdetails"
-#: order/templates/order/sales_order_base.html:79 templates/js/order.html:228
+#: order/templates/order/sales_order_base.html:84 templates/js/order.html:228
msgid "Customer Reference"
msgstr "Kundenreferenz"
@@ -1952,12 +1963,12 @@ msgstr "Zuordnung bearbeiten"
msgid "Remove allocation"
msgstr "Zuordnung entfernen"
-#: part/bom.py:138 part/templates/part/category.html:50
+#: part/bom.py:138 part/templates/part/category.html:55
#: part/templates/part/detail.html:87
msgid "Default Location"
msgstr "Standard-Lagerort"
-#: part/bom.py:139 part/templates/part/part_base.html:105
+#: part/bom.py:139 part/templates/part/part_base.html:108
msgid "Available Stock"
msgstr "Verfügbarer Lagerbestand"
@@ -1974,11 +1985,11 @@ msgstr "Fehler beim Lesen der Stückliste (ungültige Daten)"
msgid "Error reading BOM file (incorrect row size)"
msgstr "Fehler beim Lesen der Stückliste (ungültige Zeilengröße)"
-#: part/forms.py:57 stock/forms.py:250
+#: part/forms.py:57 stock/forms.py:254
msgid "File Format"
msgstr "Dateiformat"
-#: part/forms.py:57 stock/forms.py:250
+#: part/forms.py:57 stock/forms.py:254
msgid "Select output file format"
msgstr "Ausgabe-Dateiformat auswählen"
@@ -2068,11 +2079,11 @@ msgstr "Parameter"
msgid "Confirm part creation"
msgstr "Erstellen des Teils bestätigen"
-#: part/forms.py:247
+#: part/forms.py:248
msgid "Input quantity for price calculation"
msgstr "Eintragsmenge zur Preisberechnung"
-#: part/forms.py:250
+#: part/forms.py:251
msgid "Select currency for price calculation"
msgstr "Währung zur Preisberechnung wählen"
@@ -2088,131 +2099,131 @@ msgstr "Standard-Stichworte für Teile dieser Kategorie"
msgid "Part Category"
msgstr "Teilkategorie"
-#: part/models.py:76 part/templates/part/category.html:13
-#: part/templates/part/category.html:78 templates/stats.html:12
+#: part/models.py:76 part/templates/part/category.html:18
+#: part/templates/part/category.html:83 templates/stats.html:12
msgid "Part Categories"
msgstr "Teile-Kategorien"
-#: part/models.py:293 part/models.py:303
+#: part/models.py:345 part/models.py:355
#, python-brace-format
msgid "Part '{p1}' is used in BOM for '{p2}' (recursive)"
msgstr "Teil '{p1}' wird in Stückliste für Teil '{p2}' benutzt (rekursiv)"
-#: part/models.py:383
+#: part/models.py:435
#, fuzzy
#| msgid "No serial numbers found"
msgid "Next available serial numbers are"
msgstr "Keine Seriennummern gefunden"
-#: part/models.py:387
+#: part/models.py:439
msgid "Next available serial number is"
msgstr ""
-#: part/models.py:392
+#: part/models.py:444
#, fuzzy
#| msgid "Empty serial number string"
msgid "Most recent serial number is"
msgstr "Keine Seriennummer angegeben"
-#: part/models.py:470
+#: part/models.py:522
msgid "Part must be unique for name, IPN and revision"
msgstr "Namen, Teile- und Revisionsnummern müssen eindeutig sein"
-#: part/models.py:485 part/templates/part/detail.html:19
+#: part/models.py:537 part/templates/part/detail.html:19
msgid "Part name"
msgstr "Name des Teils"
-#: part/models.py:489
+#: part/models.py:541
msgid "Is this part a template part?"
msgstr "Ist dieses Teil eine Vorlage?"
-#: part/models.py:498
+#: part/models.py:550
msgid "Is this part a variant of another part?"
msgstr "Ist dieses Teil eine Variante eines anderen Teils?"
-#: part/models.py:500
+#: part/models.py:552
msgid "Part description"
msgstr "Beschreibung des Teils"
-#: part/models.py:502
+#: part/models.py:554
msgid "Part keywords to improve visibility in search results"
msgstr "Schlüsselworte um die Sichtbarkeit in Suchergebnissen zu verbessern"
-#: part/models.py:507
+#: part/models.py:559
msgid "Part category"
msgstr "Teile-Kategorie"
-#: part/models.py:509
+#: part/models.py:561
msgid "Internal Part Number"
msgstr "Interne Teilenummer"
-#: part/models.py:511
+#: part/models.py:563
msgid "Part revision or version number"
msgstr "Revisions- oder Versionsnummer"
-#: part/models.py:513
+#: part/models.py:565
msgid "Link to extenal URL"
msgstr "Link zu einer Externen URL"
-#: part/models.py:525
+#: part/models.py:577
msgid "Where is this item normally stored?"
msgstr "Wo wird dieses Teil normalerweise gelagert?"
-#: part/models.py:569
+#: part/models.py:621
msgid "Default supplier part"
msgstr "Standard-Zulieferer?"
-#: part/models.py:572
+#: part/models.py:624
msgid "Minimum allowed stock level"
msgstr "Minimal zulässiger Lagerbestand"
-#: part/models.py:574
+#: part/models.py:626
msgid "Stock keeping units for this part"
msgstr "Stock Keeping Units (SKU) für dieses Teil"
-#: part/models.py:576
+#: part/models.py:628
msgid "Can this part be built from other parts?"
msgstr "Kann dieses Teil aus anderen Teilen angefertigt werden?"
-#: part/models.py:578
+#: part/models.py:630
msgid "Can this part be used to build other parts?"
msgstr "Kann dieses Teil zum Bau von anderen genutzt werden?"
-#: part/models.py:580
+#: part/models.py:632
msgid "Does this part have tracking for unique items?"
msgstr "Hat dieses Teil Tracking für einzelne Objekte?"
-#: part/models.py:582
+#: part/models.py:634
msgid "Can this part be purchased from external suppliers?"
msgstr "Kann dieses Teil von externen Zulieferern gekauft werden?"
-#: part/models.py:584
+#: part/models.py:636
msgid "Can this part be sold to customers?"
msgstr "Kann dieses Teil an Kunden verkauft werden?"
-#: part/models.py:586
+#: part/models.py:638
msgid "Is this part active?"
msgstr "Ist dieses Teil aktiv?"
-#: part/models.py:588
+#: part/models.py:640
msgid "Is this a virtual part, such as a software product or license?"
msgstr "Ist dieses Teil virtuell, wie zum Beispiel eine Software oder Lizenz?"
-#: part/models.py:590
+#: part/models.py:642
msgid "Part notes - supports Markdown formatting"
msgstr "Bemerkungen - unterstüzt Markdown-Formatierung"
-#: part/models.py:592
+#: part/models.py:644
msgid "Stored BOM checksum"
msgstr "Prüfsumme der Stückliste gespeichert"
-#: part/models.py:1300
+#: part/models.py:1353
#, 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:1317
+#: part/models.py:1370
#, fuzzy
#| msgid ""
#| "A stock item with this serial number already exists for template part "
@@ -2222,114 +2233,120 @@ msgstr ""
"Ein Teil mit dieser Seriennummer existiert bereits für die Teilevorlage "
"{part}"
-#: part/models.py:1336 templates/js/part.html:455 templates/js/stock.html:92
+#: part/models.py:1389 templates/js/part.html:521 templates/js/stock.html:92
#, fuzzy
#| msgid "Instance Name"
msgid "Test Name"
msgstr "Instanzname"
-#: part/models.py:1337
+#: part/models.py:1390
#, fuzzy
#| msgid "Serial number for this item"
msgid "Enter a name for the test"
msgstr "Seriennummer für dieses Teil"
-#: part/models.py:1342
+#: part/models.py:1395
#, fuzzy
#| msgid "Description"
msgid "Test Description"
msgstr "Beschreibung"
-#: part/models.py:1343
+#: part/models.py:1396
#, fuzzy
#| msgid "Brief description of the build"
msgid "Enter description for this test"
msgstr "Kurze Beschreibung des Baus"
-#: part/models.py:1349
+#: part/models.py:1402
msgid "Is this test required to pass?"
msgstr ""
-#: part/models.py:1354 templates/js/part.html:472
+#: part/models.py:1407 templates/js/part.html:538
#, fuzzy
#| msgid "Required Parts"
msgid "Requires Value"
msgstr "benötigte Teile"
-#: part/models.py:1355
+#: part/models.py:1408
msgid "Does this test require a value when adding a test result?"
msgstr ""
-#: part/models.py:1360 templates/js/part.html:479
+#: part/models.py:1413 templates/js/part.html:545
#, fuzzy
#| msgid "Delete Attachment"
msgid "Requires Attachment"
msgstr "Anhang löschen"
-#: part/models.py:1361
+#: part/models.py:1414
msgid "Does this test require a file attachment when adding a test result?"
msgstr ""
-#: part/models.py:1394
+#: part/models.py:1447
msgid "Parameter template name must be unique"
msgstr "Vorlagen-Name des Parameters muss eindeutig sein"
-#: part/models.py:1399
+#: part/models.py:1452
msgid "Parameter Name"
msgstr "Name des Parameters"
-#: part/models.py:1401
+#: part/models.py:1454
msgid "Parameter Units"
msgstr "Parameter Einheit"
-#: part/models.py:1427
+#: part/models.py:1480
msgid "Parent Part"
msgstr "Ausgangsteil"
-#: part/models.py:1429
+#: part/models.py:1482
msgid "Parameter Template"
msgstr "Parameter Vorlage"
-#: part/models.py:1431
+#: part/models.py:1484
msgid "Parameter Value"
msgstr "Parameter Wert"
-#: part/models.py:1467
+#: part/models.py:1521
msgid "Select parent part"
msgstr "Ausgangsteil auswählen"
-#: part/models.py:1475
+#: part/models.py:1529
msgid "Select part to be used in BOM"
msgstr "Teil für die Nutzung in der Stückliste auswählen"
-#: part/models.py:1481
+#: part/models.py:1535
msgid "BOM quantity for this BOM item"
msgstr "Stücklisten-Anzahl für dieses Stücklisten-Teil"
-#: part/models.py:1484
+#: part/models.py:1537
+#, fuzzy
+#| msgid "Confim BOM item deletion"
+msgid "This BOM item is optional"
+msgstr "Löschung von BOM-Position bestätigen"
+
+#: part/models.py:1540
msgid "Estimated build wastage quantity (absolute or percentage)"
msgstr "Geschätzter Ausschuss (absolut oder prozentual)"
-#: part/models.py:1487
+#: part/models.py:1543
msgid "BOM item reference"
msgstr "Referenz des Objekts auf der Stückliste"
-#: part/models.py:1490
+#: part/models.py:1546
msgid "BOM item notes"
msgstr "Notizen zum Stücklisten-Objekt"
-#: part/models.py:1492
+#: part/models.py:1548
msgid "BOM line checksum"
msgstr "Prüfsumme der Stückliste"
-#: part/models.py:1556 part/views.py:1310 part/views.py:1362
-#: stock/models.py:229
+#: part/models.py:1612 part/views.py:1310 part/views.py:1362
+#: stock/models.py:231
#, 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:1565
+#: part/models.py:1621
#, fuzzy
#| msgid "New BOM Item"
msgid "BOM Item"
@@ -2350,14 +2367,14 @@ msgstr "Bestellung"
#: part/templates/part/allocation.html:45
#: stock/templates/stock/item_base.html:8
#: stock/templates/stock/item_base.html:58
-#: stock/templates/stock/item_base.html:226
+#: stock/templates/stock/item_base.html:238
#: stock/templates/stock/stock_adjust.html:16 templates/js/build.html:112
-#: templates/js/stock.html:651
+#: templates/js/stock.html:660 templates/js/stock.html:896
msgid "Stock Item"
msgstr "Lagerobjekt"
#: part/templates/part/allocation.html:20
-#: stock/templates/stock/item_base.html:180
+#: stock/templates/stock/item_base.html:192
msgid "Build Order"
msgstr "Bauauftrag"
@@ -2493,109 +2510,115 @@ msgstr "Neues Bild hochladen"
msgid "Each part must already exist in the database"
msgstr ""
-#: part/templates/part/category.html:14
+#: part/templates/part/category.html:19
msgid "All parts"
msgstr "Alle Teile"
-#: part/templates/part/category.html:18 part/views.py:1935
+#: part/templates/part/category.html:23 part/views.py:1976
msgid "Create new part category"
msgstr "Teilkategorie anlegen"
-#: part/templates/part/category.html:22
+#: part/templates/part/category.html:27
#, fuzzy
#| msgid "Edit Part Category"
msgid "Edit part category"
msgstr "Teilkategorie bearbeiten"
-#: part/templates/part/category.html:25
+#: part/templates/part/category.html:30
#, fuzzy
#| msgid "Select part category"
msgid "Delete part category"
msgstr "Teilekategorie wählen"
-#: part/templates/part/category.html:34 part/templates/part/category.html:73
+#: part/templates/part/category.html:39 part/templates/part/category.html:78
msgid "Category Details"
msgstr "Kategorie-Details"
-#: part/templates/part/category.html:39
+#: part/templates/part/category.html:44
msgid "Category Path"
msgstr "Pfad zur Kategorie"
-#: part/templates/part/category.html:44
+#: part/templates/part/category.html:49
msgid "Category Description"
msgstr "Kategorie-Beschreibung"
-#: part/templates/part/category.html:57 part/templates/part/detail.html:64
+#: part/templates/part/category.html:62 part/templates/part/detail.html:64
msgid "Keywords"
msgstr "Schlüsselwörter"
-#: part/templates/part/category.html:63
+#: part/templates/part/category.html:68
msgid "Subcategories"
msgstr "Unter-Kategorien"
-#: part/templates/part/category.html:68
+#: part/templates/part/category.html:73
msgid "Parts (Including subcategories)"
msgstr "Teile (inklusive Unter-Kategorien)"
-#: part/templates/part/category.html:101
+#: part/templates/part/category.html:106
msgid "Export Part Data"
msgstr ""
-#: part/templates/part/category.html:102 part/views.py:491
+#: part/templates/part/category.html:107 part/views.py:491
msgid "Create new part"
msgstr "Neues Teil anlegen"
-#: part/templates/part/category.html:106
+#: part/templates/part/category.html:111
#, fuzzy
#| msgid "Part category"
msgid "Set category"
msgstr "Teile-Kategorie"
-#: part/templates/part/category.html:106
+#: part/templates/part/category.html:111
#, fuzzy
#| msgid "Set Part Category"
msgid "Set Category"
msgstr "Teilkategorie auswählen"
-#: part/templates/part/category.html:108
+#: part/templates/part/category.html:113
#, fuzzy
#| msgid "Export"
msgid "Export Data"
msgstr "Exportieren"
-#: part/templates/part/category.html:154
+#: part/templates/part/category.html:162
#, fuzzy
#| msgid "Create New Location"
msgid "Create new location"
msgstr "Neuen Standort anlegen"
-#: part/templates/part/category.html:159 part/templates/part/category.html:188
+#: part/templates/part/category.html:167 part/templates/part/category.html:196
#, fuzzy
#| msgid "Category"
msgid "New Category"
msgstr "Kategorie"
-#: part/templates/part/category.html:160
+#: part/templates/part/category.html:168
#, fuzzy
#| msgid "Create new part category"
msgid "Create new category"
msgstr "Teilkategorie anlegen"
-#: part/templates/part/category.html:189
+#: part/templates/part/category.html:197
#, fuzzy
#| msgid "Create new part category"
msgid "Create new Part Category"
msgstr "Teilkategorie anlegen"
-#: part/templates/part/category.html:195 stock/views.py:1213
+#: part/templates/part/category.html:203 stock/views.py:1314
msgid "Create new Stock Location"
msgstr "Neuen Lager-Standort erstellen"
+#: part/templates/part/category_tabs.html:9
+#, fuzzy
+#| msgid "Parameter Value"
+msgid "Parametric Table"
+msgstr "Parameter Wert"
+
#: part/templates/part/detail.html:9
msgid "Part Details"
msgstr "Teile-Details"
-#: part/templates/part/detail.html:25 part/templates/part/part_base.html:82
+#: part/templates/part/detail.html:25 part/templates/part/part_base.html:85
#: templates/js/part.html:112
msgid "IPN"
msgstr "IPN (Interne Produktnummer)"
@@ -2621,7 +2644,7 @@ msgid "Variant Of"
msgstr "Variante von"
#: part/templates/part/detail.html:70 part/templates/part/set_category.html:15
-#: templates/js/part.html:293
+#: templates/js/part.html:359
msgid "Category"
msgstr "Kategorie"
@@ -2661,8 +2684,8 @@ msgstr "Teil ist virtuell (kein physisches Teil)"
msgid "Part is not a virtual part"
msgstr "Teil ist nicht virtuell"
-#: part/templates/part/detail.html:145 stock/forms.py:244
-#: templates/js/table_filters.html:183
+#: part/templates/part/detail.html:145 stock/forms.py:248
+#: templates/js/table_filters.html:188
msgid "Template"
msgstr "Vorlage"
@@ -2678,7 +2701,7 @@ msgstr "Teil kann keine Vorlage sein wenn es Variante eines anderen Teils ist"
msgid "Part is not a template part"
msgstr "Teil ist nicht virtuell"
-#: part/templates/part/detail.html:154 templates/js/table_filters.html:195
+#: part/templates/part/detail.html:154 templates/js/table_filters.html:200
msgid "Assembly"
msgstr "Baugruppe"
@@ -2690,7 +2713,7 @@ msgstr "Teil kann aus anderen Teilen angefertigt werden"
msgid "Part cannot be assembled from other parts"
msgstr "Teil kann nicht aus anderen Teilen angefertigt werden"
-#: part/templates/part/detail.html:163 templates/js/table_filters.html:199
+#: part/templates/part/detail.html:163 templates/js/table_filters.html:204
msgid "Component"
msgstr "Komponente"
@@ -2702,7 +2725,7 @@ msgstr "Teil kann in Baugruppen benutzt werden"
msgid "Part cannot be used in assemblies"
msgstr "Teil kann nicht in Baugruppen benutzt werden"
-#: part/templates/part/detail.html:172 templates/js/table_filters.html:211
+#: part/templates/part/detail.html:172 templates/js/table_filters.html:216
msgid "Trackable"
msgstr "nachverfolgbar"
@@ -2722,7 +2745,7 @@ msgstr "Kaufbar"
msgid "Part can be purchased from external suppliers"
msgstr "Teil kann von externen Zulieferern gekauft werden"
-#: part/templates/part/detail.html:190 templates/js/table_filters.html:207
+#: part/templates/part/detail.html:190 templates/js/table_filters.html:212
msgid "Salable"
msgstr "Verkäuflich"
@@ -2734,7 +2757,7 @@ msgstr "Teil kann an Kunden verkauft werden"
msgid "Part cannot be sold to customers"
msgstr "Teil kann nicht an Kunden verkauft werden"
-#: part/templates/part/detail.html:199 templates/js/table_filters.html:178
+#: part/templates/part/detail.html:199 templates/js/table_filters.html:183
msgid "Active"
msgstr "Aktiv"
@@ -2770,7 +2793,7 @@ msgstr "Parameter hinzufügen"
msgid "New Parameter"
msgstr "Neuer Parameter"
-#: part/templates/part/params.html:21 stock/models.py:1340
+#: part/templates/part/params.html:21 stock/models.py:1391
#: templates/js/stock.html:112
msgid "Value"
msgstr "Wert"
@@ -2801,82 +2824,82 @@ msgstr "Dieses Teil ist eine Vorlage."
msgid "This part is a variant of"
msgstr "Dieses Teil ist eine Variante von"
-#: part/templates/part/part_base.html:33 templates/js/company.html:153
-#: templates/js/part.html:270
+#: part/templates/part/part_base.html:36 templates/js/company.html:153
+#: templates/js/part.html:336
msgid "Inactive"
msgstr "Inaktiv"
-#: part/templates/part/part_base.html:40
+#: part/templates/part/part_base.html:43
msgid "Star this part"
msgstr "Teil favorisieren"
-#: part/templates/part/part_base.html:46
-#: stock/templates/stock/item_base.html:78
-#: stock/templates/stock/location.html:22
+#: part/templates/part/part_base.html:49
+#: stock/templates/stock/item_base.html:81
+#: stock/templates/stock/location.html:27
#, fuzzy
#| msgid "Source Location"
msgid "Barcode actions"
msgstr "Quell-Standort"
-#: part/templates/part/part_base.html:48
-#: stock/templates/stock/item_base.html:80
-#: stock/templates/stock/location.html:24
+#: part/templates/part/part_base.html:51
+#: stock/templates/stock/item_base.html:83
+#: stock/templates/stock/location.html:29
#, fuzzy
#| msgid "Part QR Code"
msgid "Show QR Code"
msgstr "Teil-QR-Code"
-#: part/templates/part/part_base.html:49
-#: stock/templates/stock/item_base.html:81
-#: stock/templates/stock/location.html:25
+#: part/templates/part/part_base.html:52
+#: stock/templates/stock/item_base.html:84
+#: stock/templates/stock/location.html:30
msgid "Print Label"
msgstr ""
-#: part/templates/part/part_base.html:53
+#: part/templates/part/part_base.html:56
msgid "Show pricing information"
msgstr "Kosteninformationen ansehen"
-#: part/templates/part/part_base.html:67
+#: part/templates/part/part_base.html:70
#, fuzzy
#| msgid "Source Location"
msgid "Part actions"
msgstr "Quell-Standort"
-#: part/templates/part/part_base.html:69
+#: part/templates/part/part_base.html:72
#, fuzzy
#| msgid "Duplicate Part"
msgid "Duplicate part"
msgstr "Teil duplizieren"
-#: part/templates/part/part_base.html:70
+#: part/templates/part/part_base.html:73
#, fuzzy
#| msgid "Edit Template"
msgid "Edit part"
msgstr "Vorlage bearbeiten"
-#: part/templates/part/part_base.html:72
+#: part/templates/part/part_base.html:75
#, fuzzy
#| msgid "Delete Parts"
msgid "Delete part"
msgstr "Teile löschen"
-#: part/templates/part/part_base.html:111 templates/js/table_filters.html:65
+#: part/templates/part/part_base.html:114 templates/js/table_filters.html:65
msgid "In Stock"
msgstr "Auf Lager"
-#: part/templates/part/part_base.html:118
+#: part/templates/part/part_base.html:121
msgid "Allocated to Build Orders"
msgstr "Zu Bauaufträgen zugeordnet"
-#: part/templates/part/part_base.html:125
+#: part/templates/part/part_base.html:128
msgid "Allocated to Sales Orders"
msgstr "Zu Aufträgen zugeordnet"
-#: part/templates/part/part_base.html:147
+#: part/templates/part/part_base.html:150
msgid "Can Build"
msgstr "Herstellbar?"
-#: part/templates/part/part_base.html:153
+#: part/templates/part/part_base.html:156
msgid "Underway"
msgstr "unterwegs"
@@ -2926,8 +2949,8 @@ msgstr "Teil entfernen"
msgid "Part Stock"
msgstr "Teilbestand"
-#: part/templates/part/stock_count.html:7 templates/js/bom.html:193
-#: templates/js/part.html:330
+#: part/templates/part/stock_count.html:7 templates/js/bom.html:197
+#: templates/js/part.html:396
msgid "No Stock"
msgstr "Kein Bestand"
@@ -2975,7 +2998,7 @@ msgstr "Stückliste"
msgid "Used In"
msgstr "Benutzt in"
-#: part/templates/part/tabs.html:58 stock/templates/stock/item_base.html:270
+#: part/templates/part/tabs.html:58 stock/templates/stock/item_base.html:282
msgid "Tests"
msgstr ""
@@ -3166,27 +3189,27 @@ msgstr "Teilparameter bearbeiten"
msgid "Delete Part Parameter"
msgstr "Teilparameter löschen"
-#: part/views.py:1886
+#: part/views.py:1927
msgid "Edit Part Category"
msgstr "Teilkategorie bearbeiten"
-#: part/views.py:1921
+#: part/views.py:1962
msgid "Delete Part Category"
msgstr "Teilkategorie löschen"
-#: part/views.py:1927
+#: part/views.py:1968
msgid "Part category was deleted"
msgstr "Teilekategorie wurde gelöscht"
-#: part/views.py:1986
+#: part/views.py:2027
msgid "Create BOM item"
msgstr "BOM-Position anlegen"
-#: part/views.py:2052
+#: part/views.py:2093
msgid "Edit BOM item"
msgstr "BOM-Position beaarbeiten"
-#: part/views.py:2100
+#: part/views.py:2141
msgid "Confim BOM item deletion"
msgstr "Löschung von BOM-Position bestätigen"
@@ -3226,308 +3249,346 @@ msgstr ""
msgid "Asset file description"
msgstr "Einstellungs-Beschreibung"
-#: stock/forms.py:187
+#: stock/forms.py:191
msgid "Label"
msgstr ""
-#: stock/forms.py:188 stock/forms.py:244
+#: stock/forms.py:192 stock/forms.py:248
#, fuzzy
#| msgid "Select stock item to allocate"
msgid "Select test report template"
msgstr "Lagerobjekt für Zuordnung auswählen"
-#: stock/forms.py:252
+#: stock/forms.py:256
msgid "Include stock items in sub locations"
msgstr "Lagerobjekte in untergeordneten Lagerorten einschließen"
-#: stock/forms.py:279
+#: stock/forms.py:291
+#, fuzzy
+#| msgid "No stock items matching query"
+msgid "Stock item to install"
+msgstr "Keine zur Anfrage passenden Lagerobjekte"
+
+#: stock/forms.py:298
+#, fuzzy
+#| msgid "Stock Quantity"
+msgid "Stock quantity to assign"
+msgstr "Bestand"
+
+#: stock/forms.py:326
+#, fuzzy
+#| msgid "Quantity must not exceed available stock quantity ({n})"
+msgid "Must not exceed available quantity"
+msgstr "Anzahl darf nicht die verfügbare Anzahl überschreiten ({n})"
+
+#: stock/forms.py:336
#, fuzzy
#| msgid "Does this part have tracking for unique items?"
msgid "Destination location for uninstalled items"
msgstr "Hat dieses Teil Tracking für einzelne Objekte?"
-#: stock/forms.py:281
+#: stock/forms.py:338
#, fuzzy
#| msgid "Description of the company"
msgid "Add transaction note (optional)"
msgstr "Firmenbeschreibung"
-#: stock/forms.py:283
+#: stock/forms.py:340
#, fuzzy
#| msgid "Confirm stock allocation"
msgid "Confirm uninstall"
msgstr "Lagerbestandszuordnung bestätigen"
-#: stock/forms.py:283
+#: stock/forms.py:340
#, fuzzy
#| msgid "Confirm movement of stock items"
msgid "Confirm removal of installed stock items"
msgstr "Bewegung der Lagerobjekte bestätigen"
-#: stock/forms.py:307
+#: stock/forms.py:364
#, fuzzy
#| msgid "Description"
msgid "Destination"
msgstr "Beschreibung"
-#: stock/forms.py:307
+#: stock/forms.py:364
msgid "Destination stock location"
msgstr "Ziel-Lagerbestand"
-#: stock/forms.py:309
+#: stock/forms.py:366
msgid "Add note (required)"
msgstr ""
-#: stock/forms.py:313 stock/views.py:795 stock/views.py:992
+#: stock/forms.py:370 stock/views.py:895 stock/views.py:1092
msgid "Confirm stock adjustment"
msgstr "Bestands-Anpassung bestätigen"
-#: stock/forms.py:313
+#: stock/forms.py:370
msgid "Confirm movement of stock items"
msgstr "Bewegung der Lagerobjekte bestätigen"
-#: stock/forms.py:315
+#: stock/forms.py:372
#, fuzzy
#| msgid "Default Location"
msgid "Set Default Location"
msgstr "Standard-Lagerort"
-#: stock/forms.py:315
+#: stock/forms.py:372
msgid "Set the destination as the default location for selected parts"
msgstr "Setze das Ziel als Standard-Ziel für ausgewählte Teile"
-#: stock/models.py:210
+#: stock/models.py:212
#, fuzzy
#| msgid "A stock item with this serial number already exists"
msgid "StockItem with this serial number already exists"
msgstr "Ein Teil mit dieser Seriennummer existiert bereits"
-#: stock/models.py:246
+#: stock/models.py:248
#, python-brace-format
msgid "Part type ('{pf}') must be {pe}"
msgstr "Teile-Typ ('{pf}') muss {pe} sein"
-#: stock/models.py:256 stock/models.py:265
+#: stock/models.py:258 stock/models.py:267
msgid "Quantity must be 1 for item with a serial number"
msgstr "Anzahl muss für Objekte mit Seriennummer \"1\" sein"
-#: stock/models.py:257
+#: stock/models.py:259
msgid "Serial number cannot be set if quantity greater than 1"
msgstr ""
"Seriennummer kann nicht gesetzt werden wenn die Anzahl größer als \"1\" ist"
-#: stock/models.py:278
+#: stock/models.py:281
msgid "Item cannot belong to itself"
msgstr "Teil kann nicht zu sich selbst gehören"
-#: stock/models.py:311
+#: stock/models.py:287
+msgid "Item must have a build reference if is_building=True"
+msgstr ""
+
+#: stock/models.py:294
+msgid "Build reference does not point to the same part object"
+msgstr ""
+
+#: stock/models.py:327
msgid "Parent Stock Item"
msgstr "Eltern-Lagerobjekt"
-#: stock/models.py:320
+#: stock/models.py:336
msgid "Base part"
msgstr "Basis-Teil"
-#: stock/models.py:329
+#: stock/models.py:345
msgid "Select a matching supplier part for this stock item"
msgstr "Passenden Zulieferer für dieses Lagerobjekt auswählen"
-#: stock/models.py:334 stock/templates/stock/stock_app_base.html:7
+#: stock/models.py:350 stock/templates/stock/stock_app_base.html:7
msgid "Stock Location"
msgstr "Lagerort"
-#: stock/models.py:337
+#: stock/models.py:353
msgid "Where is this stock item located?"
msgstr "Wo wird dieses Teil normalerweise gelagert?"
-#: stock/models.py:342
+#: stock/models.py:358 stock/templates/stock/item_base.html:177
msgid "Installed In"
msgstr "Installiert in"
-#: stock/models.py:345
+#: stock/models.py:361
msgid "Is this item installed in another item?"
msgstr "Ist dieses Teil in einem anderen verbaut?"
-#: stock/models.py:361
+#: stock/models.py:377
msgid "Serial number for this item"
msgstr "Seriennummer für dieses Teil"
-#: stock/models.py:373
+#: stock/models.py:389
msgid "Batch code for this stock item"
msgstr "Losnummer für dieses Lagerobjekt"
-#: stock/models.py:377
+#: stock/models.py:393
msgid "Stock Quantity"
msgstr "Bestand"
-#: stock/models.py:386
+#: stock/models.py:402
msgid "Source Build"
msgstr "Quellbau"
-#: stock/models.py:388
+#: stock/models.py:404
msgid "Build for this stock item"
msgstr "Bau für dieses Lagerobjekt"
-#: stock/models.py:395
+#: stock/models.py:415
msgid "Source Purchase Order"
msgstr "Quellbestellung"
-#: stock/models.py:398
+#: stock/models.py:418
msgid "Purchase order for this stock item"
msgstr "Bestellung für dieses Teil"
-#: stock/models.py:404
+#: stock/models.py:424
msgid "Destination Sales Order"
msgstr "Zielauftrag"
-#: stock/models.py:411
+#: stock/models.py:431
msgid "Destination Build Order"
msgstr "Zielbauauftrag"
-#: stock/models.py:424
+#: stock/models.py:444
msgid "Delete this Stock Item when stock is depleted"
msgstr "Objekt löschen wenn Lagerbestand aufgebraucht"
-#: stock/models.py:434 stock/templates/stock/item_notes.html:14
+#: stock/models.py:454 stock/templates/stock/item_notes.html:14
#: stock/templates/stock/item_notes.html:30
msgid "Stock Item Notes"
msgstr "Lagerobjekt-Notizen"
-#: stock/models.py:485
+#: stock/models.py:505
#, fuzzy
#| msgid "Item assigned to customer?"
msgid "Assigned to Customer"
msgstr "Ist dieses Objekt einem Kunden zugeteilt?"
-#: stock/models.py:487
+#: stock/models.py:507
#, fuzzy
#| msgid "Item assigned to customer?"
msgid "Manually assigned to customer"
msgstr "Ist dieses Objekt einem Kunden zugeteilt?"
-#: stock/models.py:500
+#: stock/models.py:520
#, fuzzy
#| msgid "Item assigned to customer?"
msgid "Returned from customer"
msgstr "Ist dieses Objekt einem Kunden zugeteilt?"
-#: stock/models.py:502
+#: stock/models.py:522
#, fuzzy
#| msgid "Create new stock location"
msgid "Returned to location"
msgstr "Neuen Lagerort anlegen"
-#: stock/models.py:626
+#: stock/models.py:650
#, fuzzy
#| msgid "Installed in Stock Item"
-msgid "Installed in stock item"
+msgid "Installed into stock item"
msgstr "In Lagerobjekt installiert"
-#: stock/models.py:655
+#: stock/models.py:658
+#, fuzzy
+#| msgid "Installed in Stock Item"
+msgid "Installed stock item"
+msgstr "In Lagerobjekt installiert"
+
+#: stock/models.py:682
+#, fuzzy
+#| msgid "Installed in Stock Item"
+msgid "Uninstalled stock item"
+msgstr "In Lagerobjekt installiert"
+
+#: stock/models.py:701
#, fuzzy
#| msgid "Include sublocations"
msgid "Uninstalled into location"
msgstr "Unterlagerorte einschließen"
-#: stock/models.py:745
+#: stock/models.py:796
#, fuzzy
#| msgid "Part is not a virtual part"
msgid "Part is not set as trackable"
msgstr "Teil ist nicht virtuell"
-#: stock/models.py:751
+#: stock/models.py:802
msgid "Quantity must be integer"
msgstr "Anzahl muss eine Ganzzahl sein"
-#: stock/models.py:757
+#: stock/models.py:808
#, 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:760
+#: stock/models.py:811
msgid "Serial numbers must be a list of integers"
msgstr "Seriennummern muss eine Liste von Ganzzahlen sein"
-#: stock/models.py:763
+#: stock/models.py:814
msgid "Quantity does not match serial numbers"
msgstr "Anzahl stimmt nicht mit den Seriennummern überein"
-#: stock/models.py:773
+#: stock/models.py:824
msgid "Serial numbers already exist: "
msgstr "Seriennummern existieren bereits:"
-#: stock/models.py:798
+#: stock/models.py:849
msgid "Add serial number"
msgstr "Seriennummer hinzufügen"
-#: stock/models.py:801
+#: stock/models.py:852
#, python-brace-format
msgid "Serialized {n} items"
msgstr "{n} Teile serialisiert"
-#: stock/models.py:912
+#: stock/models.py:963
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:1241
+#: stock/models.py:1292
msgid "Tracking entry title"
msgstr "Name des Eintrags-Trackings"
-#: stock/models.py:1243
+#: stock/models.py:1294
msgid "Entry notes"
msgstr "Eintrags-Notizen"
-#: stock/models.py:1245
+#: stock/models.py:1296
msgid "Link to external page for further information"
msgstr "Link auf externe Seite für weitere Informationen"
-#: stock/models.py:1305
+#: stock/models.py:1356
#, fuzzy
#| msgid "Serial number for this item"
msgid "Value must be provided for this test"
msgstr "Seriennummer für dieses Teil"
-#: stock/models.py:1311
+#: stock/models.py:1362
msgid "Attachment must be uploaded for this test"
msgstr ""
-#: stock/models.py:1328
+#: stock/models.py:1379
msgid "Test"
msgstr ""
-#: stock/models.py:1329
+#: stock/models.py:1380
#, fuzzy
#| msgid "Part name"
msgid "Test name"
msgstr "Name des Teils"
-#: stock/models.py:1334
+#: stock/models.py:1385
#, fuzzy
#| msgid "Search Results"
msgid "Result"
msgstr "Suchergebnisse"
-#: stock/models.py:1335 templates/js/table_filters.html:111
+#: stock/models.py:1386 templates/js/table_filters.html:111
msgid "Test result"
msgstr ""
-#: stock/models.py:1341
+#: stock/models.py:1392
msgid "Test output value"
msgstr ""
-#: stock/models.py:1347
+#: stock/models.py:1398
#, fuzzy
#| msgid "Attachments"
msgid "Attachment"
msgstr "Anhänge"
-#: stock/models.py:1348
+#: stock/models.py:1399
#, fuzzy
#| msgid "Delete attachment"
msgid "Test result attachment"
msgstr "Anhang löschen"
-#: stock/models.py:1354
+#: stock/models.py:1405
#, fuzzy
#| msgid "Edit notes"
msgid "Test notes"
@@ -3576,124 +3637,130 @@ msgstr ""
"Dieses Lagerobjekt wird automatisch gelöscht wenn der Lagerbestand "
"aufgebraucht ist."
-#: stock/templates/stock/item_base.html:83 templates/js/barcode.html:283
+#: stock/templates/stock/item_base.html:86 templates/js/barcode.html:283
#: templates/js/barcode.html:288
msgid "Unlink Barcode"
msgstr ""
-#: stock/templates/stock/item_base.html:85
+#: stock/templates/stock/item_base.html:88
msgid "Link Barcode"
msgstr ""
-#: stock/templates/stock/item_base.html:91
+#: stock/templates/stock/item_base.html:94
#, fuzzy
#| msgid "Confirm stock adjustment"
msgid "Stock adjustment actions"
msgstr "Bestands-Anpassung bestätigen"
-#: stock/templates/stock/item_base.html:95
-#: stock/templates/stock/location.html:33 templates/stock_table.html:14
+#: stock/templates/stock/item_base.html:98
+#: stock/templates/stock/location.html:38 templates/stock_table.html:15
msgid "Count stock"
msgstr "Bestand zählen"
-#: stock/templates/stock/item_base.html:96 templates/stock_table.html:12
+#: stock/templates/stock/item_base.html:99 templates/stock_table.html:13
msgid "Add stock"
msgstr "Bestand hinzufügen"
-#: stock/templates/stock/item_base.html:97 templates/stock_table.html:13
+#: stock/templates/stock/item_base.html:100 templates/stock_table.html:14
msgid "Remove stock"
msgstr "Bestand entfernen"
-#: stock/templates/stock/item_base.html:99
+#: stock/templates/stock/item_base.html:102
#, fuzzy
#| msgid "Order stock"
msgid "Transfer stock"
msgstr "Bestand bestellen"
-#: stock/templates/stock/item_base.html:101
+#: stock/templates/stock/item_base.html:104
#, fuzzy
#| msgid "Serialize Stock"
msgid "Serialize stock"
msgstr "Lagerbestand erfassen"
-#: stock/templates/stock/item_base.html:105
+#: stock/templates/stock/item_base.html:108
#, fuzzy
#| msgid "Item assigned to customer?"
msgid "Assign to customer"
msgstr "Ist dieses Objekt einem Kunden zugeteilt?"
-#: stock/templates/stock/item_base.html:108
+#: stock/templates/stock/item_base.html:111
#, fuzzy
#| msgid "Count stock"
msgid "Return to stock"
msgstr "Bestand zählen"
-#: stock/templates/stock/item_base.html:114
-#: stock/templates/stock/location.html:30
+#: stock/templates/stock/item_base.html:115 templates/js/stock.html:933
+#, fuzzy
+#| msgid "Installed in Stock Item"
+msgid "Uninstall stock item"
+msgstr "In Lagerobjekt installiert"
+
+#: stock/templates/stock/item_base.html:115
+msgid "Uninstall"
+msgstr ""
+
+#: stock/templates/stock/item_base.html:122
+#: stock/templates/stock/location.html:35
#, fuzzy
#| msgid "Stock Locations"
msgid "Stock actions"
msgstr "Lagerobjekt-Standorte"
-#: stock/templates/stock/item_base.html:118
+#: stock/templates/stock/item_base.html:126
#, fuzzy
#| msgid "Count stock items"
msgid "Convert to variant"
msgstr "Lagerobjekte zählen"
-#: stock/templates/stock/item_base.html:120
+#: stock/templates/stock/item_base.html:128
#, fuzzy
#| msgid "Count stock items"
msgid "Duplicate stock item"
msgstr "Lagerobjekte zählen"
-#: stock/templates/stock/item_base.html:121
+#: stock/templates/stock/item_base.html:129
#, fuzzy
#| msgid "Edit Stock Item"
msgid "Edit stock item"
msgstr "Lagerobjekt bearbeiten"
-#: stock/templates/stock/item_base.html:123
+#: stock/templates/stock/item_base.html:131
#, fuzzy
#| msgid "Delete Stock Item"
msgid "Delete stock item"
msgstr "Lagerobjekt löschen"
-#: stock/templates/stock/item_base.html:127
+#: stock/templates/stock/item_base.html:135
msgid "Generate test report"
msgstr ""
-#: stock/templates/stock/item_base.html:135
+#: stock/templates/stock/item_base.html:143
msgid "Stock Item Details"
msgstr "Lagerbestands-Details"
-#: stock/templates/stock/item_base.html:168
-msgid "Belongs To"
-msgstr "Gehört zu"
-
-#: stock/templates/stock/item_base.html:190
+#: stock/templates/stock/item_base.html:202
#, fuzzy
#| msgid "No stock location set"
msgid "No location set"
msgstr "Kein Lagerort gesetzt"
-#: stock/templates/stock/item_base.html:197
+#: stock/templates/stock/item_base.html:209
msgid "Unique Identifier"
msgstr "Eindeutiger Bezeichner"
-#: stock/templates/stock/item_base.html:225
+#: stock/templates/stock/item_base.html:237
msgid "Parent Item"
msgstr "Elternposition"
-#: stock/templates/stock/item_base.html:250
+#: stock/templates/stock/item_base.html:262
msgid "Last Updated"
msgstr "Zuletzt aktualisiert"
-#: stock/templates/stock/item_base.html:255
+#: stock/templates/stock/item_base.html:267
msgid "Last Stocktake"
msgstr "Letzte Inventur"
-#: stock/templates/stock/item_base.html:259
+#: stock/templates/stock/item_base.html:271
msgid "No stocktake performed"
msgstr "Keine Inventur ausgeführt"
@@ -3711,35 +3778,40 @@ msgstr "Dieses Lagerobjekt hat keine Kinder"
msgid "Are you sure you want to delete this stock item?"
msgstr "Sind Sie sicher, dass Sie diesen Anhang löschen wollen?"
+#: stock/templates/stock/item_install.html:7
+#, fuzzy
+#| msgid "Installed in Stock Item"
+msgid "Install another StockItem into this item."
+msgstr "In Lagerobjekt installiert"
+
+#: stock/templates/stock/item_install.html:10
+msgid "Stock items can only be installed if they meet the following criteria"
+msgstr ""
+
+#: stock/templates/stock/item_install.html:13
+msgid "The StockItem links to a Part which is in the BOM for this StockItem"
+msgstr ""
+
+#: stock/templates/stock/item_install.html:14
+#, fuzzy
+#| msgid "This stock item is allocated to Build"
+msgid "The StockItem is currently in stock"
+msgstr "Dieses Lagerobjekt ist dem Bau zugewiesen"
+
#: stock/templates/stock/item_installed.html:10
#, fuzzy
#| msgid "Installed in Stock Item"
msgid "Installed Stock Items"
msgstr "In Lagerobjekt installiert"
-#: stock/templates/stock/item_installed.html:18
+#: stock/templates/stock/item_serialize.html:5
#, fuzzy
-#| msgid "Added stock to {n} items"
-msgid "Uninstall selected stock items"
-msgstr "Vorrat zu {n} Lagerobjekten hinzugefügt"
+#| msgid "Purchase order for this stock item"
+msgid "Create serialized items from this stock item."
+msgstr "Bestellung für dieses Teil"
-#: stock/templates/stock/item_installed.html:18
-msgid "Uninstall"
-msgstr ""
-
-#: stock/templates/stock/item_installed.html:35
-#, fuzzy
-#| msgid "No stock items matching query"
-msgid "No stock items installed"
-msgstr "Keine zur Anfrage passenden Lagerobjekte"
-
-#: stock/templates/stock/item_installed.html:48 templates/js/part.html:209
-#: templates/js/stock.html:409
-msgid "Select"
-msgstr "Auswählen"
-
-#: stock/templates/stock/item_installed.html:131
-msgid "Uninstall item"
+#: stock/templates/stock/item_serialize.html:7
+msgid "Select quantity to serialize, and unique serial numbers."
msgstr ""
#: stock/templates/stock/item_tests.html:10 stock/templates/stock/tabs.html:13
@@ -3760,62 +3832,62 @@ msgstr ""
msgid "Test Report"
msgstr ""
-#: stock/templates/stock/location.html:13
+#: stock/templates/stock/location.html:18
msgid "All stock items"
msgstr "Alle Lagerobjekte"
-#: stock/templates/stock/location.html:26
+#: stock/templates/stock/location.html:31
#, fuzzy
#| msgid "Child Stock Items"
msgid "Check-in Items"
msgstr "Kind-Lagerobjekte"
-#: stock/templates/stock/location.html:37
+#: stock/templates/stock/location.html:42
#, fuzzy
#| msgid "Location Description"
msgid "Location actions"
msgstr "Standort-Beschreibung"
-#: stock/templates/stock/location.html:39
+#: stock/templates/stock/location.html:44
#, fuzzy
#| msgid "Edit stock location"
msgid "Edit location"
msgstr "Lagerort bearbeiten"
-#: stock/templates/stock/location.html:40
+#: stock/templates/stock/location.html:45
#, fuzzy
#| msgid "Delete stock location"
msgid "Delete location"
msgstr "Lagerort löschen"
-#: stock/templates/stock/location.html:48
+#: stock/templates/stock/location.html:53
msgid "Location Details"
msgstr "Standort-Details"
-#: stock/templates/stock/location.html:53
+#: stock/templates/stock/location.html:58
msgid "Location Path"
msgstr "Standord-Pfad"
-#: stock/templates/stock/location.html:58
+#: stock/templates/stock/location.html:63
msgid "Location Description"
msgstr "Standort-Beschreibung"
-#: stock/templates/stock/location.html:63
+#: stock/templates/stock/location.html:68
msgid "Sublocations"
msgstr "Sub-Standorte"
-#: stock/templates/stock/location.html:68
-#: stock/templates/stock/location.html:83
+#: stock/templates/stock/location.html:73
+#: stock/templates/stock/location.html:88
#: templates/InvenTree/search_stock_items.html:6 templates/stats.html:21
#: templates/stats.html:30
msgid "Stock Items"
msgstr "Lagerobjekte"
-#: stock/templates/stock/location.html:73
+#: stock/templates/stock/location.html:78
msgid "Stock Details"
msgstr "Objekt-Details"
-#: stock/templates/stock/location.html:78
+#: stock/templates/stock/location.html:83
#: templates/InvenTree/search_stock_location.html:6 templates/stats.html:25
msgid "Stock Locations"
msgstr "Lagerobjekt-Standorte"
@@ -3832,7 +3904,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:1186
+#: stock/templates/stock/stockitem_convert.html:7 stock/views.py:1287
#, fuzzy
#| msgid "Count Stock Items"
msgid "Convert Stock Item"
@@ -3978,138 +4050,144 @@ msgstr "Lagerbestandsexportoptionen"
msgid "Stock Item QR Code"
msgstr "Lagerobjekt-QR-Code"
-#: stock/views.py:699
+#: stock/views.py:700
+#, fuzzy
+#| msgid "Installed in Stock Item"
+msgid "Install Stock Item"
+msgstr "In Lagerobjekt installiert"
+
+#: stock/views.py:799
#, fuzzy
#| msgid "Installed in Stock Item"
msgid "Uninstall Stock Items"
msgstr "In Lagerobjekt installiert"
-#: stock/views.py:806
+#: stock/views.py:906
#, fuzzy
#| msgid "Installed in Stock Item"
msgid "Uninstalled stock items"
msgstr "In Lagerobjekt installiert"
-#: stock/views.py:831
+#: stock/views.py:931
msgid "Adjust Stock"
msgstr "Lagerbestand anpassen"
-#: stock/views.py:940
+#: stock/views.py:1040
msgid "Move Stock Items"
msgstr "Lagerobjekte bewegen"
-#: stock/views.py:941
+#: stock/views.py:1041
msgid "Count Stock Items"
msgstr "Lagerobjekte zählen"
-#: stock/views.py:942
+#: stock/views.py:1042
msgid "Remove From Stock"
msgstr "Aus Lagerbestand entfernen"
-#: stock/views.py:943
+#: stock/views.py:1043
msgid "Add Stock Items"
msgstr "Lagerobjekte hinzufügen"
-#: stock/views.py:944
+#: stock/views.py:1044
msgid "Delete Stock Items"
msgstr "Lagerobjekte löschen"
-#: stock/views.py:972
+#: stock/views.py:1072
msgid "Must enter integer value"
msgstr "Nur Ganzzahl eingeben"
-#: stock/views.py:977
+#: stock/views.py:1077
msgid "Quantity must be positive"
msgstr "Anzahl muss positiv sein"
-#: stock/views.py:984
+#: stock/views.py:1084
#, python-brace-format
msgid "Quantity must not exceed {x}"
msgstr "Anzahl darf {x} nicht überschreiten"
-#: stock/views.py:1063
+#: stock/views.py:1163
#, python-brace-format
msgid "Added stock to {n} items"
msgstr "Vorrat zu {n} Lagerobjekten hinzugefügt"
-#: stock/views.py:1078
+#: stock/views.py:1178
#, python-brace-format
msgid "Removed stock from {n} items"
msgstr "Vorrat von {n} Lagerobjekten entfernt"
-#: stock/views.py:1091
+#: stock/views.py:1191
#, python-brace-format
msgid "Counted stock for {n} items"
msgstr "Bestand für {n} Objekte erfasst"
-#: stock/views.py:1119
+#: stock/views.py:1219
msgid "No items were moved"
msgstr "Keine Lagerobjekte wurden bewegt"
-#: stock/views.py:1122
+#: stock/views.py:1222
#, python-brace-format
msgid "Moved {n} items to {dest}"
msgstr "{n} Teile nach {dest} bewegt"
-#: stock/views.py:1141
+#: stock/views.py:1241
#, python-brace-format
msgid "Deleted {n} stock items"
msgstr "{n} Teile im Lager gelöscht"
-#: stock/views.py:1153
+#: stock/views.py:1253
msgid "Edit Stock Item"
msgstr "Lagerobjekt bearbeiten"
-#: stock/views.py:1234
+#: stock/views.py:1335
msgid "Serialize Stock"
msgstr "Lagerbestand erfassen"
-#: stock/views.py:1426
+#: stock/views.py:1527
#, fuzzy
#| msgid "Count stock items"
msgid "Duplicate Stock Item"
msgstr "Lagerobjekte zählen"
-#: stock/views.py:1492
+#: stock/views.py:1593
msgid "Invalid quantity"
msgstr "Ungültige Menge"
-#: stock/views.py:1495
+#: stock/views.py:1596
#, fuzzy
#| msgid "Quantity must be greater than zero"
msgid "Quantity cannot be less than zero"
msgstr "Anzahl muss größer Null sein"
-#: stock/views.py:1499
+#: stock/views.py:1600
msgid "Invalid part selection"
msgstr "Ungültige Teileauswahl"
-#: stock/views.py:1548
+#: stock/views.py:1649
#, python-brace-format
msgid "Created {n} new stock items"
msgstr "{n} neue Lagerobjekte erstellt"
-#: stock/views.py:1567 stock/views.py:1583
+#: stock/views.py:1668 stock/views.py:1684
msgid "Created new stock item"
msgstr "Neues Lagerobjekt erstellt"
-#: stock/views.py:1602
+#: stock/views.py:1703
msgid "Delete Stock Location"
msgstr "Standort löschen"
-#: stock/views.py:1615
+#: stock/views.py:1716
msgid "Delete Stock Item"
msgstr "Lagerobjekt löschen"
-#: stock/views.py:1626
+#: stock/views.py:1727
msgid "Delete Stock Tracking Entry"
msgstr "Lagerbestands-Tracking-Eintrag löschen"
-#: stock/views.py:1643
+#: stock/views.py:1744
msgid "Edit Stock Tracking Entry"
msgstr "Lagerbestands-Tracking-Eintrag bearbeiten"
-#: stock/views.py:1652
+#: stock/views.py:1753
msgid "Add Stock Tracking Entry"
msgstr "Lagerbestands-Tracking-Eintrag hinzufügen"
@@ -4145,17 +4223,25 @@ msgstr "Bau fertigstellen"
msgid "Search Results"
msgstr "Suchergebnisse"
-#: templates/InvenTree/search.html:22
-msgid "No results found"
+#: templates/InvenTree/search.html:24
+#, fuzzy
+#| msgid "No results found"
+msgid "No results found for "
msgstr "Keine Ergebnisse gefunden"
-#: templates/InvenTree/search.html:181 templates/js/stock.html:521
+#: templates/InvenTree/search.html:42
+#, fuzzy
+#| msgid "Cancel sales order"
+msgid "Enter a search query"
+msgstr "Auftrag stornieren"
+
+#: templates/InvenTree/search.html:191 templates/js/stock.html:527
#, fuzzy
#| msgid "Item assigned to customer?"
msgid "Shipped to customer"
msgstr "Ist dieses Objekt einem Kunden zugeteilt?"
-#: templates/InvenTree/search.html:184 templates/js/stock.html:528
+#: templates/InvenTree/search.html:194 templates/js/stock.html:537
msgid "No stock location set"
msgstr "Kein Lagerort gesetzt"
@@ -4366,33 +4452,39 @@ msgstr "Neues Lagerobjekt hinzufügen"
msgid "Open subassembly"
msgstr "Unterbaugruppe öffnen"
-#: templates/js/bom.html:184 templates/js/build.html:119
+#: templates/js/bom.html:173
+#, fuzzy
+#| msgid "Options"
+msgid "Optional"
+msgstr "Optionen"
+
+#: templates/js/bom.html:188 templates/js/build.html:119
msgid "Available"
msgstr "verfügbar"
-#: templates/js/bom.html:209
+#: templates/js/bom.html:213
msgid "No pricing available"
msgstr "Keine Preisinformation verfügbar"
-#: templates/js/bom.html:228
+#: templates/js/bom.html:232
#, fuzzy
#| msgid "Options"
msgid "Actions"
msgstr "Optionen"
-#: templates/js/bom.html:236
+#: templates/js/bom.html:240
msgid "Validate BOM Item"
msgstr "BOM-Position validieren"
-#: templates/js/bom.html:238
+#: templates/js/bom.html:242
msgid "This line has been validated"
msgstr "Diese Position wurde validiert"
-#: templates/js/bom.html:240
+#: templates/js/bom.html:244
msgid "Edit BOM Item"
msgstr "BOM-Position bearbeiten"
-#: templates/js/bom.html:242
+#: templates/js/bom.html:246
msgid "Delete BOM Item"
msgstr "BOM-Position löschen"
@@ -4424,11 +4516,11 @@ msgstr "Keine Firmeninformation gefunden"
msgid "No supplier parts found"
msgstr "Keine Zuliefererteile gefunden"
-#: templates/js/company.html:145 templates/js/part.html:248
+#: templates/js/company.html:145 templates/js/part.html:314
msgid "Template part"
msgstr "Vorlagenteil"
-#: templates/js/company.html:149 templates/js/part.html:252
+#: templates/js/company.html:149 templates/js/part.html:318
msgid "Assembled part"
msgstr "Baugruppe"
@@ -4440,7 +4532,7 @@ msgstr "Link"
msgid "No purchase orders found"
msgstr "Keine Bestellungen gefunden"
-#: templates/js/order.html:172 templates/js/stock.html:633
+#: templates/js/order.html:172 templates/js/stock.html:642
msgid "Date"
msgstr "Datum"
@@ -4458,57 +4550,62 @@ msgstr "Versanddatum"
msgid "No variants found"
msgstr "Keine Teile gefunden"
-#: templates/js/part.html:256
-msgid "Starred part"
-msgstr "Favoritenteil"
-
-#: templates/js/part.html:260
-msgid "Salable part"
-msgstr "Verkäufliches Teil"
-
-#: templates/js/part.html:299
-msgid "No category"
-msgstr "Keine Kategorie"
-
-#: templates/js/part.html:317 templates/js/table_filters.html:191
-msgid "Low stock"
-msgstr "Bestand niedrig"
-
-#: templates/js/part.html:326
-msgid "Building"
-msgstr "Im Bau"
-
-#: templates/js/part.html:345
+#: templates/js/part.html:223 templates/js/part.html:411
msgid "No parts found"
msgstr "Keine Teile gefunden"
-#: templates/js/part.html:405
+#: templates/js/part.html:275 templates/js/stock.html:409
+#: templates/js/stock.html:965
+msgid "Select"
+msgstr "Auswählen"
+
+#: templates/js/part.html:322
+msgid "Starred part"
+msgstr "Favoritenteil"
+
+#: templates/js/part.html:326
+msgid "Salable part"
+msgstr "Verkäufliches Teil"
+
+#: templates/js/part.html:365
+msgid "No category"
+msgstr "Keine Kategorie"
+
+#: templates/js/part.html:383 templates/js/table_filters.html:196
+msgid "Low stock"
+msgstr "Bestand niedrig"
+
+#: templates/js/part.html:392
+msgid "Building"
+msgstr "Im Bau"
+
+#: templates/js/part.html:471
msgid "YES"
msgstr ""
-#: templates/js/part.html:407
+#: templates/js/part.html:473
msgid "NO"
msgstr ""
-#: templates/js/part.html:441
+#: templates/js/part.html:507
#, fuzzy
#| msgid "No stock items matching query"
msgid "No test templates matching query"
msgstr "Keine zur Anfrage passenden Lagerobjekte"
-#: templates/js/part.html:492 templates/js/stock.html:63
+#: templates/js/part.html:558 templates/js/stock.html:63
#, fuzzy
#| msgid "Edit Sales Order"
msgid "Edit test result"
msgstr "Auftrag bearbeiten"
-#: templates/js/part.html:493 templates/js/stock.html:64
+#: templates/js/part.html:559 templates/js/stock.html:64
#, fuzzy
#| msgid "Delete attachment"
msgid "Delete test result"
msgstr "Anhang löschen"
-#: templates/js/part.html:499
+#: templates/js/part.html:565
msgid "This test is defined for a parent part"
msgstr ""
@@ -4564,54 +4661,84 @@ msgstr "Lagerobjekt wurde zugewiesen"
msgid "Stock item has been assigned to customer"
msgstr "Lagerobjekt wurde zugewiesen"
-#: templates/js/stock.html:474
+#: templates/js/stock.html:475
#, fuzzy
#| msgid "This stock item is allocated to Sales Order"
msgid "Stock item was assigned to a build order"
msgstr "Dieses Lagerobjekt ist dem Auftrag zugewiesen"
-#: templates/js/stock.html:476
+#: templates/js/stock.html:477
#, fuzzy
#| msgid "This stock item is allocated to Sales Order"
msgid "Stock item was assigned to a sales order"
msgstr "Dieses Lagerobjekt ist dem Auftrag zugewiesen"
-#: templates/js/stock.html:483
+#: templates/js/stock.html:482
+#, fuzzy
+#| msgid "Is this item installed in another item?"
+msgid "Stock item has been installed in another item"
+msgstr "Ist dieses Teil in einem anderen verbaut?"
+
+#: templates/js/stock.html:489
#, fuzzy
#| msgid "StockItem has been allocated"
msgid "Stock item has been rejected"
msgstr "Lagerobjekt wurde zugewiesen"
-#: templates/js/stock.html:487
+#: templates/js/stock.html:493
#, fuzzy
#| msgid "StockItem is lost"
msgid "Stock item is lost"
msgstr "Lagerobjekt verloren"
-#: templates/js/stock.html:491 templates/js/table_filters.html:60
+#: templates/js/stock.html:497 templates/js/table_filters.html:60
#, fuzzy
#| msgid "Delete"
msgid "Depleted"
msgstr "Löschen"
-#: templates/js/stock.html:516
+#: templates/js/stock.html:522
#, fuzzy
#| msgid "Installed in Stock Item"
msgid "Installed in Stock Item "
msgstr "In Lagerobjekt installiert"
-#: templates/js/stock.html:699
+#: templates/js/stock.html:530
+#, fuzzy
+#| msgid "Item assigned to customer?"
+msgid "Assigned to sales order"
+msgstr "Ist dieses Objekt einem Kunden zugeteilt?"
+
+#: templates/js/stock.html:708
msgid "No user information"
msgstr "Keine Benutzerinformation"
-#: templates/js/stock.html:783
+#: templates/js/stock.html:792
msgid "Create New Part"
msgstr "Neues Teil anlegen"
-#: templates/js/stock.html:795
+#: templates/js/stock.html:804
msgid "Create New Location"
msgstr "Neuen Standort anlegen"
+#: templates/js/stock.html:903
+#, fuzzy
+#| msgid "Serial Number"
+msgid "Serial"
+msgstr "Seriennummer"
+
+#: templates/js/stock.html:996 templates/js/table_filters.html:70
+#, fuzzy
+#| msgid "Installed In"
+msgid "Installed"
+msgstr "Installiert in"
+
+#: templates/js/stock.html:1021
+#, fuzzy
+#| msgid "Installed In"
+msgid "Install item"
+msgstr "Installiert in"
+
#: templates/js/table_filters.html:19 templates/js/table_filters.html:80
#, fuzzy
#| msgid "Serialize Stock"
@@ -4689,12 +4816,6 @@ msgstr "Objekt löschen wenn Lagerbestand aufgebraucht"
msgid "Show items which are in stock"
msgstr ""
-#: templates/js/table_filters.html:70
-#, fuzzy
-#| msgid "Installed In"
-msgid "Installed"
-msgstr "Installiert in"
-
#: templates/js/table_filters.html:71
#, fuzzy
#| msgid "Is this item installed in another item?"
@@ -4737,19 +4858,29 @@ msgstr "Unterkategorien einschließen"
msgid "Include parts in subcategories"
msgstr "Teile in Unterkategorien einschließen"
+#: templates/js/table_filters.html:178
+msgid "Has IPN"
+msgstr ""
+
#: templates/js/table_filters.html:179
+#, fuzzy
+#| msgid "Internal Part Number"
+msgid "Part has internal part number"
+msgstr "Interne Teilenummer"
+
+#: templates/js/table_filters.html:184
msgid "Show active parts"
msgstr "Aktive Teile anzeigen"
-#: templates/js/table_filters.html:187
+#: templates/js/table_filters.html:192
msgid "Stock available"
msgstr "Bestand verfügbar"
-#: templates/js/table_filters.html:203
+#: templates/js/table_filters.html:208
msgid "Starred"
msgstr "Favorit"
-#: templates/js/table_filters.html:215
+#: templates/js/table_filters.html:220
msgid "Purchasable"
msgstr "Käuflich"
@@ -4793,60 +4924,68 @@ msgstr "Statistiken"
msgid "Search"
msgstr "Suche"
-#: templates/stock_table.html:5
+#: templates/stock_table.html:6
#, fuzzy
#| msgid "Edit Stock Location"
msgid "Export Stock Information"
msgstr "Lagerobjekt-Standort bearbeiten"
-#: templates/stock_table.html:12
+#: templates/stock_table.html:13
#, fuzzy
#| msgid "Added stock to {n} items"
msgid "Add to selected stock items"
msgstr "Vorrat zu {n} Lagerobjekten hinzugefügt"
-#: templates/stock_table.html:13
+#: templates/stock_table.html:14
#, fuzzy
#| msgid "Remove selected BOM items"
msgid "Remove from selected stock items"
msgstr "Ausgewählte Stücklistenpositionen entfernen"
-#: templates/stock_table.html:14
+#: templates/stock_table.html:15
#, fuzzy
#| msgid "Delete Stock Item"
msgid "Stocktake selected stock items"
msgstr "Lagerobjekt löschen"
-#: templates/stock_table.html:15
+#: templates/stock_table.html:16
#, fuzzy
#| msgid "Delete Stock Item"
msgid "Move selected stock items"
msgstr "Lagerobjekt löschen"
-#: templates/stock_table.html:15
+#: templates/stock_table.html:16
msgid "Move stock"
msgstr "Bestand bewegen"
-#: templates/stock_table.html:16
+#: templates/stock_table.html:17
#, fuzzy
#| msgid "Remove selected BOM items"
msgid "Order selected items"
msgstr "Ausgewählte Stücklistenpositionen entfernen"
-#: templates/stock_table.html:16
+#: templates/stock_table.html:17
msgid "Order stock"
msgstr "Bestand bestellen"
-#: templates/stock_table.html:17
+#: templates/stock_table.html:18
#, fuzzy
#| msgid "Delete line item"
msgid "Delete selected items"
msgstr "Position löschen"
-#: templates/stock_table.html:17
+#: templates/stock_table.html:18
msgid "Delete Stock"
msgstr "Bestand löschen"
+#~ msgid "Belongs To"
+#~ msgstr "Gehört zu"
+
+#, fuzzy
+#~| msgid "Added stock to {n} items"
+#~ msgid "Uninstall selected stock items"
+#~ msgstr "Vorrat zu {n} Lagerobjekten hinzugefügt"
+
#~ msgid "Order Multiple"
#~ msgstr "Bestellvielfaches"
diff --git a/InvenTree/locale/en/LC_MESSAGES/django.po b/InvenTree/locale/en/LC_MESSAGES/django.po
index d4a3d7ceb6..0b5425db6e 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-09-28 12:03+0000\n"
+"POT-Creation-Date: 2020-10-04 14:02+0000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME \n"
"Language-Team: LANGUAGE \n"
@@ -86,7 +86,7 @@ msgstr ""
msgid "File comment"
msgstr ""
-#: InvenTree/models.py:68 templates/js/stock.html:690
+#: InvenTree/models.py:68 templates/js/stock.html:699
msgid "User"
msgstr ""
@@ -99,19 +99,19 @@ msgstr ""
msgid "Description (optional)"
msgstr ""
-#: InvenTree/settings.py:341
+#: InvenTree/settings.py:342
msgid "English"
msgstr ""
-#: InvenTree/settings.py:342
+#: InvenTree/settings.py:343
msgid "German"
msgstr ""
-#: InvenTree/settings.py:343
+#: InvenTree/settings.py:344
msgid "French"
msgstr ""
-#: InvenTree/settings.py:344
+#: InvenTree/settings.py:345
msgid "Polish"
msgstr ""
@@ -143,7 +143,8 @@ msgstr ""
msgid "Returned"
msgstr ""
-#: InvenTree/status_codes.py:136 order/templates/order/sales_order_base.html:98
+#: InvenTree/status_codes.py:136
+#: order/templates/order/sales_order_base.html:103
msgid "Shipped"
msgstr ""
@@ -198,7 +199,7 @@ msgstr ""
msgid "Overage must be an integer value or a percentage"
msgstr ""
-#: InvenTree/views.py:639
+#: InvenTree/views.py:661
msgid "Database Statistics"
msgstr ""
@@ -250,7 +251,7 @@ msgstr ""
msgid "Serial numbers"
msgstr ""
-#: build/forms.py:64 stock/forms.py:107
+#: build/forms.py:64 stock/forms.py:111
msgid "Enter unique serial numbers (or leave blank)"
msgstr ""
@@ -262,7 +263,7 @@ msgstr ""
msgid "Build quantity must be integer value for trackable parts"
msgstr ""
-#: build/models.py:73 build/templates/build/build_base.html:65
+#: build/models.py:73 build/templates/build/build_base.html:70
msgid "Build Title"
msgstr ""
@@ -270,7 +271,7 @@ msgstr ""
msgid "Brief description of the build"
msgstr ""
-#: build/models.py:84 build/templates/build/build_base.html:86
+#: build/models.py:84 build/templates/build/build_base.html:91
msgid "Parent Build"
msgstr ""
@@ -280,18 +281,17 @@ msgstr ""
#: build/models.py:90 build/templates/build/allocate.html:329
#: build/templates/build/auto_allocate.html:19
-#: build/templates/build/build_base.html:70
+#: build/templates/build/build_base.html:75
#: build/templates/build/detail.html:22 order/models.py:501
#: order/templates/order/order_wizard/select_parts.html:30
#: order/templates/order/purchase_order_detail.html:147
-#: order/templates/order/receive_parts.html:19 part/models.py:241
+#: order/templates/order/receive_parts.html:19 part/models.py:293
#: part/templates/part/part_app_base.html:7
-#: part/templates/part/set_category.html:13
-#: stock/templates/stock/item_installed.html:60
-#: templates/InvenTree/search.html:123 templates/js/barcode.html:336
-#: templates/js/bom.html:124 templates/js/build.html:47
-#: templates/js/company.html:137 templates/js/part.html:223
-#: templates/js/stock.html:421
+#: part/templates/part/set_category.html:13 templates/InvenTree/search.html:133
+#: templates/js/barcode.html:336 templates/js/bom.html:124
+#: templates/js/build.html:47 templates/js/company.html:137
+#: templates/js/part.html:184 templates/js/part.html:289
+#: templates/js/stock.html:421 templates/js/stock.html:977
msgid "Part"
msgstr ""
@@ -325,7 +325,7 @@ msgstr ""
msgid "Number of parts to build"
msgstr ""
-#: build/models.py:128 part/templates/part/part_base.html:142
+#: build/models.py:128 part/templates/part/part_base.html:145
msgid "Build Status"
msgstr ""
@@ -333,7 +333,7 @@ msgstr ""
msgid "Build status code"
msgstr ""
-#: build/models.py:136 stock/models.py:371
+#: build/models.py:136 stock/models.py:387
msgid "Batch Code"
msgstr ""
@@ -344,12 +344,12 @@ msgstr ""
#: build/models.py:155 build/templates/build/detail.html:55
#: company/templates/company/supplier_part_base.html:60
#: company/templates/company/supplier_part_detail.html:24
-#: part/templates/part/detail.html:80 part/templates/part/part_base.html:89
-#: stock/models.py:365 stock/templates/stock/item_base.html:232
+#: part/templates/part/detail.html:80 part/templates/part/part_base.html:92
+#: stock/models.py:381 stock/templates/stock/item_base.html:244
msgid "External Link"
msgstr ""
-#: build/models.py:156 stock/models.py:367
+#: build/models.py:156 stock/models.py:383
msgid "Link to external URL"
msgstr ""
@@ -357,10 +357,10 @@ msgstr ""
#: company/templates/company/tabs.html:33 order/templates/order/po_tabs.html:15
#: order/templates/order/purchase_order_detail.html:202
#: order/templates/order/so_tabs.html:23 part/templates/part/tabs.html:67
-#: stock/forms.py:281 stock/forms.py:309 stock/models.py:433
-#: stock/models.py:1353 stock/templates/stock/tabs.html:26
-#: templates/js/barcode.html:391 templates/js/bom.html:219
-#: templates/js/stock.html:116 templates/js/stock.html:534
+#: stock/forms.py:306 stock/forms.py:338 stock/forms.py:366 stock/models.py:453
+#: stock/models.py:1404 stock/templates/stock/tabs.html:26
+#: templates/js/barcode.html:391 templates/js/bom.html:223
+#: templates/js/stock.html:116 templates/js/stock.html:543
msgid "Notes"
msgstr ""
@@ -404,7 +404,7 @@ msgstr ""
#: build/templates/build/allocate.html:17
#: company/templates/company/detail_part.html:18 order/views.py:779
-#: part/templates/part/category.html:107
+#: part/templates/part/category.html:112
msgid "Order Parts"
msgstr ""
@@ -420,24 +420,24 @@ msgstr ""
msgid "Unallocate"
msgstr ""
-#: build/templates/build/allocate.html:87 templates/stock_table.html:8
+#: build/templates/build/allocate.html:87 templates/stock_table.html:9
msgid "New Stock Item"
msgstr ""
-#: build/templates/build/allocate.html:88 stock/views.py:1327
+#: build/templates/build/allocate.html:88 stock/views.py:1428
msgid "Create new Stock Item"
msgstr ""
#: build/templates/build/allocate.html:170
#: order/templates/order/sales_order_detail.html:68
-#: order/templates/order/sales_order_detail.html:150 stock/models.py:359
-#: stock/templates/stock/item_base.html:148
+#: order/templates/order/sales_order_detail.html:150 stock/models.py:375
+#: stock/templates/stock/item_base.html:156
msgid "Serial Number"
msgstr ""
#: build/templates/build/allocate.html:172
#: build/templates/build/auto_allocate.html:20
-#: build/templates/build/build_base.html:75
+#: build/templates/build/build_base.html:80
#: build/templates/build/detail.html:27
#: company/templates/company/supplier_part_pricing.html:71
#: order/templates/order/order_wizard/select_parts.html:32
@@ -446,22 +446,22 @@ msgstr ""
#: order/templates/order/sales_order_detail.html:152
#: part/templates/part/allocation.html:16
#: part/templates/part/allocation.html:49
-#: part/templates/part/sale_prices.html:80
+#: part/templates/part/sale_prices.html:80 stock/forms.py:297
#: stock/templates/stock/item_base.html:26
#: stock/templates/stock/item_base.html:32
-#: stock/templates/stock/item_base.html:154
+#: stock/templates/stock/item_base.html:162
#: stock/templates/stock/stock_adjust.html:18 templates/js/barcode.html:338
#: templates/js/bom.html:162 templates/js/build.html:58
-#: templates/js/stock.html:681
+#: templates/js/stock.html:690 templates/js/stock.html:905
msgid "Quantity"
msgstr ""
#: build/templates/build/allocate.html:186
-#: build/templates/build/auto_allocate.html:21 stock/forms.py:279
-#: stock/templates/stock/item_base.html:186
+#: build/templates/build/auto_allocate.html:21 stock/forms.py:336
+#: stock/templates/stock/item_base.html:198
#: stock/templates/stock/stock_adjust.html:17
-#: templates/InvenTree/search.html:173 templates/js/barcode.html:337
-#: templates/js/stock.html:512
+#: templates/InvenTree/search.html:183 templates/js/barcode.html:337
+#: templates/js/stock.html:518
msgid "Location"
msgstr ""
@@ -475,7 +475,7 @@ msgstr ""
msgid "Delete stock allocation"
msgstr ""
-#: build/templates/build/allocate.html:238 templates/js/bom.html:330
+#: build/templates/build/allocate.html:238 templates/js/bom.html:334
msgid "No BOM items found"
msgstr ""
@@ -484,12 +484,12 @@ msgstr ""
#: company/templates/company/supplier_part_detail.html:27
#: order/templates/order/purchase_order_detail.html:159
#: part/templates/part/detail.html:51 part/templates/part/set_category.html:14
-#: stock/templates/stock/item_installed.html:83
-#: templates/InvenTree/search.html:137 templates/js/bom.html:147
+#: templates/InvenTree/search.html:147 templates/js/bom.html:147
#: templates/js/company.html:56 templates/js/order.html:159
#: templates/js/order.html:234 templates/js/part.html:120
-#: templates/js/part.html:279 templates/js/part.html:460
-#: templates/js/stock.html:444 templates/js/stock.html:662
+#: templates/js/part.html:203 templates/js/part.html:345
+#: templates/js/part.html:526 templates/js/stock.html:444
+#: templates/js/stock.html:671
msgid "Description"
msgstr ""
@@ -499,8 +499,8 @@ msgstr ""
msgid "Reference"
msgstr ""
-#: build/templates/build/allocate.html:347 part/models.py:1348
-#: templates/js/part.html:464 templates/js/table_filters.html:121
+#: build/templates/build/allocate.html:347 part/models.py:1401
+#: templates/js/part.html:530 templates/js/table_filters.html:121
msgid "Required"
msgstr ""
@@ -547,7 +547,7 @@ msgstr ""
#: build/templates/build/build_base.html:8
#: build/templates/build/build_base.html:34
#: build/templates/build/complete.html:6
-#: stock/templates/stock/item_base.html:211 templates/js/build.html:39
+#: stock/templates/stock/item_base.html:223 templates/js/build.html:39
#: templates/navbar.html:20
msgid "Build"
msgstr ""
@@ -560,40 +560,49 @@ msgstr ""
msgid "This build is a child of Build"
msgstr ""
-#: build/templates/build/build_base.html:61 build/templates/build/detail.html:9
+#: build/templates/build/build_base.html:39
+#: company/templates/company/company_base.html:27
+#: order/templates/order/order_base.html:28
+#: order/templates/order/sales_order_base.html:38
+#: part/templates/part/category.html:13 part/templates/part/part_base.html:32
+#: stock/templates/stock/item_base.html:69
+#: stock/templates/stock/location.html:12
+msgid "Admin view"
+msgstr ""
+
+#: build/templates/build/build_base.html:66 build/templates/build/detail.html:9
msgid "Build Details"
msgstr ""
-#: build/templates/build/build_base.html:80
+#: build/templates/build/build_base.html:85
#: build/templates/build/detail.html:42
#: order/templates/order/receive_parts.html:24
-#: stock/templates/stock/item_base.html:264
-#: stock/templates/stock/item_installed.html:111
-#: templates/InvenTree/search.html:165 templates/js/barcode.html:42
-#: templates/js/build.html:63 templates/js/order.html:164
-#: templates/js/order.html:239 templates/js/stock.html:499
+#: stock/templates/stock/item_base.html:276 templates/InvenTree/search.html:175
+#: templates/js/barcode.html:42 templates/js/build.html:63
+#: templates/js/order.html:164 templates/js/order.html:239
+#: templates/js/stock.html:505 templates/js/stock.html:913
msgid "Status"
msgstr ""
-#: build/templates/build/build_base.html:93 order/models.py:499
+#: build/templates/build/build_base.html:98 order/models.py:499
#: 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:174 templates/js/order.html:213
+#: stock/templates/stock/item_base.html:186 templates/js/order.html:213
msgid "Sales Order"
msgstr ""
-#: build/templates/build/build_base.html:99
+#: build/templates/build/build_base.html:104
msgid "BOM Price"
msgstr ""
-#: build/templates/build/build_base.html:104
+#: build/templates/build/build_base.html:109
msgid "BOM pricing is incomplete"
msgstr ""
-#: build/templates/build/build_base.html:107
+#: build/templates/build/build_base.html:112
msgid "No pricing information"
msgstr ""
@@ -648,15 +657,15 @@ msgid "Stock can be taken from any available location."
msgstr ""
#: build/templates/build/detail.html:48
-#: stock/templates/stock/item_base.html:204
-#: stock/templates/stock/item_installed.html:119 templates/js/stock.html:507
-#: templates/js/table_filters.html:34 templates/js/table_filters.html:100
+#: stock/templates/stock/item_base.html:216 templates/js/stock.html:513
+#: templates/js/stock.html:920 templates/js/table_filters.html:34
+#: templates/js/table_filters.html:100
msgid "Batch"
msgstr ""
#: build/templates/build/detail.html:61
-#: order/templates/order/order_base.html:93
-#: order/templates/order/sales_order_base.html:92 templates/js/build.html:71
+#: order/templates/order/order_base.html:98
+#: order/templates/order/sales_order_base.html:97 templates/js/build.html:71
msgid "Created"
msgstr ""
@@ -769,7 +778,7 @@ msgstr ""
msgid "Invalid location selected"
msgstr ""
-#: build/views.py:296 stock/views.py:1520
+#: build/views.py:296 stock/views.py:1621
#, python-brace-format
msgid "The following serial numbers already exist: ({sn})"
msgstr ""
@@ -878,7 +887,7 @@ msgstr ""
msgid "Description of the company"
msgstr ""
-#: company/models.py:91 company/templates/company/company_base.html:48
+#: company/models.py:91 company/templates/company/company_base.html:53
#: templates/js/company.html:61
msgid "Website"
msgstr ""
@@ -887,7 +896,7 @@ msgstr ""
msgid "Company website URL"
msgstr ""
-#: company/models.py:94 company/templates/company/company_base.html:55
+#: company/models.py:94 company/templates/company/company_base.html:60
msgid "Address"
msgstr ""
@@ -903,7 +912,7 @@ msgstr ""
msgid "Contact phone number"
msgstr ""
-#: company/models.py:101 company/templates/company/company_base.html:69
+#: company/models.py:101 company/templates/company/company_base.html:74
msgid "Email"
msgstr ""
@@ -911,7 +920,7 @@ msgstr ""
msgid "Contact email address"
msgstr ""
-#: company/models.py:104 company/templates/company/company_base.html:76
+#: company/models.py:104 company/templates/company/company_base.html:81
msgid "Contact"
msgstr ""
@@ -935,8 +944,8 @@ msgstr ""
msgid "Does this company manufacture parts?"
msgstr ""
-#: company/models.py:279 stock/models.py:319
-#: stock/templates/stock/item_base.html:140
+#: company/models.py:279 stock/models.py:335
+#: stock/templates/stock/item_base.html:148
msgid "Base Part"
msgstr ""
@@ -986,12 +995,12 @@ msgstr ""
msgid "Company"
msgstr ""
-#: company/templates/company/company_base.html:42
+#: company/templates/company/company_base.html:47
#: company/templates/company/detail.html:8
msgid "Company Details"
msgstr ""
-#: company/templates/company/company_base.html:62
+#: company/templates/company/company_base.html:67
msgid "Phone"
msgstr ""
@@ -1005,16 +1014,16 @@ msgstr ""
#: company/templates/company/detail.html:21
#: company/templates/company/supplier_part_base.html:66
#: company/templates/company/supplier_part_detail.html:21
-#: order/templates/order/order_base.html:74
+#: 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:239 templates/js/company.html:48
+#: stock/templates/stock/item_base.html:251 templates/js/company.html:48
#: templates/js/company.html:162 templates/js/order.html:146
msgid "Supplier"
msgstr ""
#: company/templates/company/detail.html:26
-#: order/templates/order/sales_order_base.html:73 stock/models.py:354
-#: stock/models.py:355 stock/templates/stock/item_base.html:161
+#: order/templates/order/sales_order_base.html:78 stock/models.py:370
+#: stock/models.py:371 stock/templates/stock/item_base.html:169
#: templates/js/company.html:40 templates/js/order.html:221
msgid "Customer"
msgstr ""
@@ -1030,18 +1039,18 @@ msgstr ""
#: company/templates/company/detail_part.html:13
#: order/templates/order/purchase_order_detail.html:67
-#: part/templates/part/supplier.html:13 templates/js/stock.html:788
+#: part/templates/part/supplier.html:13 templates/js/stock.html:797
msgid "New Supplier Part"
msgstr ""
#: company/templates/company/detail_part.html:15
-#: part/templates/part/category.html:104 part/templates/part/supplier.html:15
-#: stock/templates/stock/item_installed.html:16 templates/stock_table.html:10
+#: part/templates/part/category.html:109 part/templates/part/supplier.html:15
+#: templates/stock_table.html:11
msgid "Options"
msgstr ""
#: company/templates/company/detail_part.html:18
-#: part/templates/part/category.html:107
+#: part/templates/part/category.html:112
msgid "Order parts"
msgstr ""
@@ -1054,7 +1063,7 @@ msgid "Delete Parts"
msgstr ""
#: company/templates/company/detail_part.html:43
-#: part/templates/part/category.html:102 templates/js/stock.html:782
+#: part/templates/part/category.html:107 templates/js/stock.html:791
msgid "New Part"
msgstr ""
@@ -1086,8 +1095,8 @@ msgstr ""
#: company/templates/company/detail_stock.html:35
#: company/templates/company/supplier_part_stock.html:33
-#: part/templates/part/category.html:101 part/templates/part/category.html:108
-#: part/templates/part/stock.html:51 templates/stock_table.html:5
+#: part/templates/part/category.html:106 part/templates/part/category.html:113
+#: part/templates/part/stock.html:51 templates/stock_table.html:6
msgid "Export"
msgstr ""
@@ -1143,8 +1152,8 @@ msgid "New Sales Order"
msgstr ""
#: company/templates/company/supplier_part_base.html:6
-#: company/templates/company/supplier_part_base.html:19 stock/models.py:328
-#: stock/templates/stock/item_base.html:244 templates/js/company.html:178
+#: company/templates/company/supplier_part_base.html:19 stock/models.py:344
+#: stock/templates/stock/item_base.html:256 templates/js/company.html:178
msgid "Supplier Part"
msgstr ""
@@ -1196,7 +1205,7 @@ msgid "Pricing Information"
msgstr ""
#: company/templates/company/supplier_part_pricing.html:15 company/views.py:399
-#: part/templates/part/sale_prices.html:13 part/views.py:2108
+#: part/templates/part/sale_prices.html:13 part/views.py:2149
msgid "Add Price Break"
msgstr ""
@@ -1206,7 +1215,7 @@ msgid "No price break information found"
msgstr ""
#: company/templates/company/supplier_part_pricing.html:76
-#: part/templates/part/sale_prices.html:85 templates/js/bom.html:203
+#: part/templates/part/sale_prices.html:85 templates/js/bom.html:207
msgid "Price"
msgstr ""
@@ -1230,9 +1239,8 @@ msgstr ""
#: company/templates/company/supplier_part_tabs.html:8
#: company/templates/company/tabs.html:12 part/templates/part/tabs.html:18
-#: stock/templates/stock/item_installed.html:91
-#: stock/templates/stock/location.html:12 templates/InvenTree/search.html:145
-#: templates/js/part.html:124 templates/js/part.html:306
+#: stock/templates/stock/location.html:17 templates/InvenTree/search.html:155
+#: templates/js/part.html:124 templates/js/part.html:372
#: templates/js/stock.html:452 templates/navbar.html:19
msgid "Stock"
msgstr ""
@@ -1242,9 +1250,10 @@ msgid "Orders"
msgstr ""
#: company/templates/company/tabs.html:9
-#: order/templates/order/receive_parts.html:14 part/models.py:242
-#: part/templates/part/cat_link.html:7 part/templates/part/category.html:83
-#: templates/navbar.html:18 templates/stats.html:8 templates/stats.html:17
+#: order/templates/order/receive_parts.html:14 part/models.py:294
+#: part/templates/part/cat_link.html:7 part/templates/part/category.html:88
+#: part/templates/part/category_tabs.html:6 templates/navbar.html:18
+#: templates/stats.html:8 templates/stats.html:17
msgid "Parts"
msgstr ""
@@ -1313,7 +1322,7 @@ msgstr ""
msgid "Edit Supplier Part"
msgstr ""
-#: company/views.py:269 templates/js/stock.html:789
+#: company/views.py:269 templates/js/stock.html:798
msgid "Create new Supplier Part"
msgstr ""
@@ -1321,15 +1330,15 @@ msgstr ""
msgid "Delete Supplier Part"
msgstr ""
-#: company/views.py:404 part/views.py:2112
+#: company/views.py:404 part/views.py:2153
msgid "Added new price break"
msgstr ""
-#: company/views.py:441 part/views.py:2157
+#: company/views.py:441 part/views.py:2198
msgid "Edit Price Break"
msgstr ""
-#: company/views.py:456 part/views.py:2171
+#: company/views.py:456 part/views.py:2212
msgid "Delete Price Break"
msgstr ""
@@ -1366,11 +1375,11 @@ msgid "Mark order as complete"
msgstr ""
#: order/forms.py:46 order/forms.py:57
-#: order/templates/order/sales_order_base.html:49
+#: order/templates/order/sales_order_base.html:54
msgid "Cancel order"
msgstr ""
-#: order/forms.py:68 order/templates/order/sales_order_base.html:46
+#: order/forms.py:68 order/templates/order/sales_order_base.html:51
msgid "Ship order"
msgstr ""
@@ -1423,7 +1432,7 @@ msgid "Date order was completed"
msgstr ""
#: order/models.py:185 order/models.py:259 part/views.py:1304
-#: stock/models.py:239 stock/models.py:754
+#: stock/models.py:241 stock/models.py:805
msgid "Quantity must be greater than zero"
msgstr ""
@@ -1461,7 +1470,7 @@ msgstr ""
#: order/models.py:466 order/templates/order/order_base.html:9
#: order/templates/order/order_base.html:23
-#: stock/templates/stock/item_base.html:218 templates/js/order.html:138
+#: stock/templates/stock/item_base.html:230 templates/js/order.html:138
msgid "Purchase Order"
msgstr ""
@@ -1503,32 +1512,32 @@ msgstr ""
msgid "Are you sure you want to delete this attachment?"
msgstr ""
-#: order/templates/order/order_base.html:59
-msgid "Purchase Order Details"
-msgstr ""
-
#: order/templates/order/order_base.html:64
-#: order/templates/order/sales_order_base.html:63
-msgid "Order Reference"
+msgid "Purchase Order Details"
msgstr ""
#: order/templates/order/order_base.html:69
#: order/templates/order/sales_order_base.html:68
+msgid "Order Reference"
+msgstr ""
+
+#: order/templates/order/order_base.html:74
+#: order/templates/order/sales_order_base.html:73
msgid "Order Status"
msgstr ""
-#: order/templates/order/order_base.html:80 templates/js/order.html:153
+#: order/templates/order/order_base.html:85 templates/js/order.html:153
msgid "Supplier Reference"
msgstr ""
-#: order/templates/order/order_base.html:99
+#: order/templates/order/order_base.html:104
msgid "Issued"
msgstr ""
-#: order/templates/order/order_base.html:106
+#: order/templates/order/order_base.html:111
#: order/templates/order/purchase_order_detail.html:182
#: order/templates/order/receive_parts.html:22
-#: order/templates/order/sales_order_base.html:105
+#: order/templates/order/sales_order_base.html:110
msgid "Received"
msgstr ""
@@ -1607,14 +1616,14 @@ msgstr ""
#: order/templates/order/purchase_order_detail.html:38
#: order/templates/order/purchase_order_detail.html:118
-#: part/templates/part/category.html:153 part/templates/part/category.html:194
-#: templates/js/stock.html:794
+#: part/templates/part/category.html:161 part/templates/part/category.html:202
+#: templates/js/stock.html:803
msgid "New Location"
msgstr ""
#: order/templates/order/purchase_order_detail.html:39
#: order/templates/order/purchase_order_detail.html:119
-#: stock/templates/stock/location.html:16
+#: stock/templates/stock/location.html:21
msgid "Create new stock location"
msgstr ""
@@ -1649,7 +1658,7 @@ msgid "Select parts to receive against this order"
msgstr ""
#: order/templates/order/receive_parts.html:21
-#: part/templates/part/part_base.html:132 templates/js/part.html:322
+#: part/templates/part/part_base.html:135 templates/js/part.html:388
msgid "On Order"
msgstr ""
@@ -1665,15 +1674,15 @@ msgstr ""
msgid "This SalesOrder has not been fully allocated"
msgstr ""
-#: order/templates/order/sales_order_base.html:42
+#: order/templates/order/sales_order_base.html:47
msgid "Packing List"
msgstr ""
-#: order/templates/order/sales_order_base.html:58
+#: order/templates/order/sales_order_base.html:63
msgid "Sales Order Details"
msgstr ""
-#: order/templates/order/sales_order_base.html:79 templates/js/order.html:228
+#: order/templates/order/sales_order_base.html:84 templates/js/order.html:228
msgid "Customer Reference"
msgstr ""
@@ -1881,12 +1890,12 @@ msgstr ""
msgid "Remove allocation"
msgstr ""
-#: part/bom.py:138 part/templates/part/category.html:50
+#: part/bom.py:138 part/templates/part/category.html:55
#: part/templates/part/detail.html:87
msgid "Default Location"
msgstr ""
-#: part/bom.py:139 part/templates/part/part_base.html:105
+#: part/bom.py:139 part/templates/part/part_base.html:108
msgid "Available Stock"
msgstr ""
@@ -1903,11 +1912,11 @@ msgstr ""
msgid "Error reading BOM file (incorrect row size)"
msgstr ""
-#: part/forms.py:57 stock/forms.py:250
+#: part/forms.py:57 stock/forms.py:254
msgid "File Format"
msgstr ""
-#: part/forms.py:57 stock/forms.py:250
+#: part/forms.py:57 stock/forms.py:254
msgid "Select output file format"
msgstr ""
@@ -1983,11 +1992,11 @@ msgstr ""
msgid "Confirm part creation"
msgstr ""
-#: part/forms.py:247
+#: part/forms.py:248
msgid "Input quantity for price calculation"
msgstr ""
-#: part/forms.py:250
+#: part/forms.py:251
msgid "Select currency for price calculation"
msgstr ""
@@ -2003,222 +2012,226 @@ msgstr ""
msgid "Part Category"
msgstr ""
-#: part/models.py:76 part/templates/part/category.html:13
-#: part/templates/part/category.html:78 templates/stats.html:12
+#: part/models.py:76 part/templates/part/category.html:18
+#: part/templates/part/category.html:83 templates/stats.html:12
msgid "Part Categories"
msgstr ""
-#: part/models.py:293 part/models.py:303
+#: part/models.py:345 part/models.py:355
#, python-brace-format
msgid "Part '{p1}' is used in BOM for '{p2}' (recursive)"
msgstr ""
-#: part/models.py:383
+#: part/models.py:435
msgid "Next available serial numbers are"
msgstr ""
-#: part/models.py:387
+#: part/models.py:439
msgid "Next available serial number is"
msgstr ""
-#: part/models.py:392
+#: part/models.py:444
msgid "Most recent serial number is"
msgstr ""
-#: part/models.py:470
+#: part/models.py:522
msgid "Part must be unique for name, IPN and revision"
msgstr ""
-#: part/models.py:485 part/templates/part/detail.html:19
+#: part/models.py:537 part/templates/part/detail.html:19
msgid "Part name"
msgstr ""
-#: part/models.py:489
+#: part/models.py:541
msgid "Is this part a template part?"
msgstr ""
-#: part/models.py:498
+#: part/models.py:550
msgid "Is this part a variant of another part?"
msgstr ""
-#: part/models.py:500
+#: part/models.py:552
msgid "Part description"
msgstr ""
-#: part/models.py:502
+#: part/models.py:554
msgid "Part keywords to improve visibility in search results"
msgstr ""
-#: part/models.py:507
+#: part/models.py:559
msgid "Part category"
msgstr ""
-#: part/models.py:509
+#: part/models.py:561
msgid "Internal Part Number"
msgstr ""
-#: part/models.py:511
+#: part/models.py:563
msgid "Part revision or version number"
msgstr ""
-#: part/models.py:513
+#: part/models.py:565
msgid "Link to extenal URL"
msgstr ""
-#: part/models.py:525
+#: part/models.py:577
msgid "Where is this item normally stored?"
msgstr ""
-#: part/models.py:569
+#: part/models.py:621
msgid "Default supplier part"
msgstr ""
-#: part/models.py:572
+#: part/models.py:624
msgid "Minimum allowed stock level"
msgstr ""
-#: part/models.py:574
+#: part/models.py:626
msgid "Stock keeping units for this part"
msgstr ""
-#: part/models.py:576
+#: part/models.py:628
msgid "Can this part be built from other parts?"
msgstr ""
-#: part/models.py:578
+#: part/models.py:630
msgid "Can this part be used to build other parts?"
msgstr ""
-#: part/models.py:580
+#: part/models.py:632
msgid "Does this part have tracking for unique items?"
msgstr ""
-#: part/models.py:582
+#: part/models.py:634
msgid "Can this part be purchased from external suppliers?"
msgstr ""
-#: part/models.py:584
+#: part/models.py:636
msgid "Can this part be sold to customers?"
msgstr ""
-#: part/models.py:586
+#: part/models.py:638
msgid "Is this part active?"
msgstr ""
-#: part/models.py:588
+#: part/models.py:640
msgid "Is this a virtual part, such as a software product or license?"
msgstr ""
-#: part/models.py:590
+#: part/models.py:642
msgid "Part notes - supports Markdown formatting"
msgstr ""
-#: part/models.py:592
+#: part/models.py:644
msgid "Stored BOM checksum"
msgstr ""
-#: part/models.py:1300
+#: part/models.py:1353
msgid "Test templates can only be created for trackable parts"
msgstr ""
-#: part/models.py:1317
+#: part/models.py:1370
msgid "Test with this name already exists for this part"
msgstr ""
-#: part/models.py:1336 templates/js/part.html:455 templates/js/stock.html:92
+#: part/models.py:1389 templates/js/part.html:521 templates/js/stock.html:92
msgid "Test Name"
msgstr ""
-#: part/models.py:1337
+#: part/models.py:1390
msgid "Enter a name for the test"
msgstr ""
-#: part/models.py:1342
+#: part/models.py:1395
msgid "Test Description"
msgstr ""
-#: part/models.py:1343
+#: part/models.py:1396
msgid "Enter description for this test"
msgstr ""
-#: part/models.py:1349
+#: part/models.py:1402
msgid "Is this test required to pass?"
msgstr ""
-#: part/models.py:1354 templates/js/part.html:472
+#: part/models.py:1407 templates/js/part.html:538
msgid "Requires Value"
msgstr ""
-#: part/models.py:1355
+#: part/models.py:1408
msgid "Does this test require a value when adding a test result?"
msgstr ""
-#: part/models.py:1360 templates/js/part.html:479
+#: part/models.py:1413 templates/js/part.html:545
msgid "Requires Attachment"
msgstr ""
-#: part/models.py:1361
+#: part/models.py:1414
msgid "Does this test require a file attachment when adding a test result?"
msgstr ""
-#: part/models.py:1394
+#: part/models.py:1447
msgid "Parameter template name must be unique"
msgstr ""
-#: part/models.py:1399
+#: part/models.py:1452
msgid "Parameter Name"
msgstr ""
-#: part/models.py:1401
+#: part/models.py:1454
msgid "Parameter Units"
msgstr ""
-#: part/models.py:1427
+#: part/models.py:1480
msgid "Parent Part"
msgstr ""
-#: part/models.py:1429
+#: part/models.py:1482
msgid "Parameter Template"
msgstr ""
-#: part/models.py:1431
+#: part/models.py:1484
msgid "Parameter Value"
msgstr ""
-#: part/models.py:1467
+#: part/models.py:1521
msgid "Select parent part"
msgstr ""
-#: part/models.py:1475
+#: part/models.py:1529
msgid "Select part to be used in BOM"
msgstr ""
-#: part/models.py:1481
+#: part/models.py:1535
msgid "BOM quantity for this BOM item"
msgstr ""
-#: part/models.py:1484
+#: part/models.py:1537
+msgid "This BOM item is optional"
+msgstr ""
+
+#: part/models.py:1540
msgid "Estimated build wastage quantity (absolute or percentage)"
msgstr ""
-#: part/models.py:1487
+#: part/models.py:1543
msgid "BOM item reference"
msgstr ""
-#: part/models.py:1490
+#: part/models.py:1546
msgid "BOM item notes"
msgstr ""
-#: part/models.py:1492
+#: part/models.py:1548
msgid "BOM line checksum"
msgstr ""
-#: part/models.py:1556 part/views.py:1310 part/views.py:1362
-#: stock/models.py:229
+#: part/models.py:1612 part/views.py:1310 part/views.py:1362
+#: stock/models.py:231
msgid "Quantity must be integer value for trackable parts"
msgstr ""
-#: part/models.py:1565
+#: part/models.py:1621
msgid "BOM Item"
msgstr ""
@@ -2237,14 +2250,14 @@ msgstr ""
#: part/templates/part/allocation.html:45
#: stock/templates/stock/item_base.html:8
#: stock/templates/stock/item_base.html:58
-#: stock/templates/stock/item_base.html:226
+#: stock/templates/stock/item_base.html:238
#: stock/templates/stock/stock_adjust.html:16 templates/js/build.html:112
-#: templates/js/stock.html:651
+#: templates/js/stock.html:660 templates/js/stock.html:896
msgid "Stock Item"
msgstr ""
#: part/templates/part/allocation.html:20
-#: stock/templates/stock/item_base.html:180
+#: stock/templates/stock/item_base.html:192
msgid "Build Order"
msgstr ""
@@ -2360,91 +2373,95 @@ msgstr ""
msgid "Each part must already exist in the database"
msgstr ""
-#: part/templates/part/category.html:14
+#: part/templates/part/category.html:19
msgid "All parts"
msgstr ""
-#: part/templates/part/category.html:18 part/views.py:1935
+#: part/templates/part/category.html:23 part/views.py:1976
msgid "Create new part category"
msgstr ""
-#: part/templates/part/category.html:22
+#: part/templates/part/category.html:27
msgid "Edit part category"
msgstr ""
-#: part/templates/part/category.html:25
+#: part/templates/part/category.html:30
msgid "Delete part category"
msgstr ""
-#: part/templates/part/category.html:34 part/templates/part/category.html:73
+#: part/templates/part/category.html:39 part/templates/part/category.html:78
msgid "Category Details"
msgstr ""
-#: part/templates/part/category.html:39
+#: part/templates/part/category.html:44
msgid "Category Path"
msgstr ""
-#: part/templates/part/category.html:44
+#: part/templates/part/category.html:49
msgid "Category Description"
msgstr ""
-#: part/templates/part/category.html:57 part/templates/part/detail.html:64
+#: part/templates/part/category.html:62 part/templates/part/detail.html:64
msgid "Keywords"
msgstr ""
-#: part/templates/part/category.html:63
+#: part/templates/part/category.html:68
msgid "Subcategories"
msgstr ""
-#: part/templates/part/category.html:68
+#: part/templates/part/category.html:73
msgid "Parts (Including subcategories)"
msgstr ""
-#: part/templates/part/category.html:101
+#: part/templates/part/category.html:106
msgid "Export Part Data"
msgstr ""
-#: part/templates/part/category.html:102 part/views.py:491
+#: part/templates/part/category.html:107 part/views.py:491
msgid "Create new part"
msgstr ""
-#: part/templates/part/category.html:106
+#: part/templates/part/category.html:111
msgid "Set category"
msgstr ""
-#: part/templates/part/category.html:106
+#: part/templates/part/category.html:111
msgid "Set Category"
msgstr ""
-#: part/templates/part/category.html:108
+#: part/templates/part/category.html:113
msgid "Export Data"
msgstr ""
-#: part/templates/part/category.html:154
+#: part/templates/part/category.html:162
msgid "Create new location"
msgstr ""
-#: part/templates/part/category.html:159 part/templates/part/category.html:188
+#: part/templates/part/category.html:167 part/templates/part/category.html:196
msgid "New Category"
msgstr ""
-#: part/templates/part/category.html:160
+#: part/templates/part/category.html:168
msgid "Create new category"
msgstr ""
-#: part/templates/part/category.html:189
+#: part/templates/part/category.html:197
msgid "Create new Part Category"
msgstr ""
-#: part/templates/part/category.html:195 stock/views.py:1213
+#: part/templates/part/category.html:203 stock/views.py:1314
msgid "Create new Stock Location"
msgstr ""
+#: part/templates/part/category_tabs.html:9
+msgid "Parametric Table"
+msgstr ""
+
#: part/templates/part/detail.html:9
msgid "Part Details"
msgstr ""
-#: part/templates/part/detail.html:25 part/templates/part/part_base.html:82
+#: part/templates/part/detail.html:25 part/templates/part/part_base.html:85
#: templates/js/part.html:112
msgid "IPN"
msgstr ""
@@ -2466,7 +2483,7 @@ msgid "Variant Of"
msgstr ""
#: part/templates/part/detail.html:70 part/templates/part/set_category.html:15
-#: templates/js/part.html:293
+#: templates/js/part.html:359
msgid "Category"
msgstr ""
@@ -2506,8 +2523,8 @@ msgstr ""
msgid "Part is not a virtual part"
msgstr ""
-#: part/templates/part/detail.html:145 stock/forms.py:244
-#: templates/js/table_filters.html:183
+#: part/templates/part/detail.html:145 stock/forms.py:248
+#: templates/js/table_filters.html:188
msgid "Template"
msgstr ""
@@ -2519,7 +2536,7 @@ msgstr ""
msgid "Part is not a template part"
msgstr ""
-#: part/templates/part/detail.html:154 templates/js/table_filters.html:195
+#: part/templates/part/detail.html:154 templates/js/table_filters.html:200
msgid "Assembly"
msgstr ""
@@ -2531,7 +2548,7 @@ msgstr ""
msgid "Part cannot be assembled from other parts"
msgstr ""
-#: part/templates/part/detail.html:163 templates/js/table_filters.html:199
+#: part/templates/part/detail.html:163 templates/js/table_filters.html:204
msgid "Component"
msgstr ""
@@ -2543,7 +2560,7 @@ msgstr ""
msgid "Part cannot be used in assemblies"
msgstr ""
-#: part/templates/part/detail.html:172 templates/js/table_filters.html:211
+#: part/templates/part/detail.html:172 templates/js/table_filters.html:216
msgid "Trackable"
msgstr ""
@@ -2563,7 +2580,7 @@ msgstr ""
msgid "Part can be purchased from external suppliers"
msgstr ""
-#: part/templates/part/detail.html:190 templates/js/table_filters.html:207
+#: part/templates/part/detail.html:190 templates/js/table_filters.html:212
msgid "Salable"
msgstr ""
@@ -2575,7 +2592,7 @@ msgstr ""
msgid "Part cannot be sold to customers"
msgstr ""
-#: part/templates/part/detail.html:199 templates/js/table_filters.html:178
+#: part/templates/part/detail.html:199 templates/js/table_filters.html:183
msgid "Active"
msgstr ""
@@ -2607,7 +2624,7 @@ msgstr ""
msgid "New Parameter"
msgstr ""
-#: part/templates/part/params.html:21 stock/models.py:1340
+#: part/templates/part/params.html:21 stock/models.py:1391
#: templates/js/stock.html:112
msgid "Value"
msgstr ""
@@ -2636,70 +2653,70 @@ msgstr ""
msgid "This part is a variant of"
msgstr ""
-#: part/templates/part/part_base.html:33 templates/js/company.html:153
-#: templates/js/part.html:270
+#: part/templates/part/part_base.html:36 templates/js/company.html:153
+#: templates/js/part.html:336
msgid "Inactive"
msgstr ""
-#: part/templates/part/part_base.html:40
+#: part/templates/part/part_base.html:43
msgid "Star this part"
msgstr ""
-#: part/templates/part/part_base.html:46
-#: stock/templates/stock/item_base.html:78
-#: stock/templates/stock/location.html:22
-msgid "Barcode actions"
-msgstr ""
-
-#: part/templates/part/part_base.html:48
-#: stock/templates/stock/item_base.html:80
-#: stock/templates/stock/location.html:24
-msgid "Show QR Code"
-msgstr ""
-
#: part/templates/part/part_base.html:49
#: stock/templates/stock/item_base.html:81
-#: stock/templates/stock/location.html:25
+#: stock/templates/stock/location.html:27
+msgid "Barcode actions"
+msgstr ""
+
+#: part/templates/part/part_base.html:51
+#: stock/templates/stock/item_base.html:83
+#: stock/templates/stock/location.html:29
+msgid "Show QR Code"
+msgstr ""
+
+#: part/templates/part/part_base.html:52
+#: stock/templates/stock/item_base.html:84
+#: stock/templates/stock/location.html:30
msgid "Print Label"
msgstr ""
-#: part/templates/part/part_base.html:53
+#: part/templates/part/part_base.html:56
msgid "Show pricing information"
msgstr ""
-#: part/templates/part/part_base.html:67
+#: part/templates/part/part_base.html:70
msgid "Part actions"
msgstr ""
-#: part/templates/part/part_base.html:69
+#: part/templates/part/part_base.html:72
msgid "Duplicate part"
msgstr ""
-#: part/templates/part/part_base.html:70
+#: part/templates/part/part_base.html:73
msgid "Edit part"
msgstr ""
-#: part/templates/part/part_base.html:72
+#: part/templates/part/part_base.html:75
msgid "Delete part"
msgstr ""
-#: part/templates/part/part_base.html:111 templates/js/table_filters.html:65
+#: part/templates/part/part_base.html:114 templates/js/table_filters.html:65
msgid "In Stock"
msgstr ""
-#: part/templates/part/part_base.html:118
+#: part/templates/part/part_base.html:121
msgid "Allocated to Build Orders"
msgstr ""
-#: part/templates/part/part_base.html:125
+#: part/templates/part/part_base.html:128
msgid "Allocated to Sales Orders"
msgstr ""
-#: part/templates/part/part_base.html:147
+#: part/templates/part/part_base.html:150
msgid "Can Build"
msgstr ""
-#: part/templates/part/part_base.html:153
+#: part/templates/part/part_base.html:156
msgid "Underway"
msgstr ""
@@ -2743,8 +2760,8 @@ msgstr ""
msgid "Part Stock"
msgstr ""
-#: part/templates/part/stock_count.html:7 templates/js/bom.html:193
-#: templates/js/part.html:330
+#: part/templates/part/stock_count.html:7 templates/js/bom.html:197
+#: templates/js/part.html:396
msgid "No Stock"
msgstr ""
@@ -2784,7 +2801,7 @@ msgstr ""
msgid "Used In"
msgstr ""
-#: part/templates/part/tabs.html:58 stock/templates/stock/item_base.html:270
+#: part/templates/part/tabs.html:58 stock/templates/stock/item_base.html:282
msgid "Tests"
msgstr ""
@@ -2961,27 +2978,27 @@ msgstr ""
msgid "Delete Part Parameter"
msgstr ""
-#: part/views.py:1886
+#: part/views.py:1927
msgid "Edit Part Category"
msgstr ""
-#: part/views.py:1921
+#: part/views.py:1962
msgid "Delete Part Category"
msgstr ""
-#: part/views.py:1927
+#: part/views.py:1968
msgid "Part category was deleted"
msgstr ""
-#: part/views.py:1986
+#: part/views.py:2027
msgid "Create BOM item"
msgstr ""
-#: part/views.py:2052
+#: part/views.py:2093
msgid "Edit BOM item"
msgstr ""
-#: part/views.py:2100
+#: part/views.py:2141
msgid "Confim BOM item deletion"
msgstr ""
@@ -3013,267 +3030,295 @@ msgstr ""
msgid "Asset file description"
msgstr ""
-#: stock/forms.py:187
+#: stock/forms.py:191
msgid "Label"
msgstr ""
-#: stock/forms.py:188 stock/forms.py:244
+#: stock/forms.py:192 stock/forms.py:248
msgid "Select test report template"
msgstr ""
-#: stock/forms.py:252
+#: stock/forms.py:256
msgid "Include stock items in sub locations"
msgstr ""
-#: stock/forms.py:279
+#: stock/forms.py:291
+msgid "Stock item to install"
+msgstr ""
+
+#: stock/forms.py:298
+msgid "Stock quantity to assign"
+msgstr ""
+
+#: stock/forms.py:326
+msgid "Must not exceed available quantity"
+msgstr ""
+
+#: stock/forms.py:336
msgid "Destination location for uninstalled items"
msgstr ""
-#: stock/forms.py:281
+#: stock/forms.py:338
msgid "Add transaction note (optional)"
msgstr ""
-#: stock/forms.py:283
+#: stock/forms.py:340
msgid "Confirm uninstall"
msgstr ""
-#: stock/forms.py:283
+#: stock/forms.py:340
msgid "Confirm removal of installed stock items"
msgstr ""
-#: stock/forms.py:307
+#: stock/forms.py:364
msgid "Destination"
msgstr ""
-#: stock/forms.py:307
+#: stock/forms.py:364
msgid "Destination stock location"
msgstr ""
-#: stock/forms.py:309
+#: stock/forms.py:366
msgid "Add note (required)"
msgstr ""
-#: stock/forms.py:313 stock/views.py:795 stock/views.py:992
+#: stock/forms.py:370 stock/views.py:895 stock/views.py:1092
msgid "Confirm stock adjustment"
msgstr ""
-#: stock/forms.py:313
+#: stock/forms.py:370
msgid "Confirm movement of stock items"
msgstr ""
-#: stock/forms.py:315
+#: stock/forms.py:372
msgid "Set Default Location"
msgstr ""
-#: stock/forms.py:315
+#: stock/forms.py:372
msgid "Set the destination as the default location for selected parts"
msgstr ""
-#: stock/models.py:210
+#: stock/models.py:212
msgid "StockItem with this serial number already exists"
msgstr ""
-#: stock/models.py:246
+#: stock/models.py:248
#, python-brace-format
msgid "Part type ('{pf}') must be {pe}"
msgstr ""
-#: stock/models.py:256 stock/models.py:265
+#: stock/models.py:258 stock/models.py:267
msgid "Quantity must be 1 for item with a serial number"
msgstr ""
-#: stock/models.py:257
+#: stock/models.py:259
msgid "Serial number cannot be set if quantity greater than 1"
msgstr ""
-#: stock/models.py:278
+#: stock/models.py:281
msgid "Item cannot belong to itself"
msgstr ""
-#: stock/models.py:311
+#: stock/models.py:287
+msgid "Item must have a build reference if is_building=True"
+msgstr ""
+
+#: stock/models.py:294
+msgid "Build reference does not point to the same part object"
+msgstr ""
+
+#: stock/models.py:327
msgid "Parent Stock Item"
msgstr ""
-#: stock/models.py:320
+#: stock/models.py:336
msgid "Base part"
msgstr ""
-#: stock/models.py:329
+#: stock/models.py:345
msgid "Select a matching supplier part for this stock item"
msgstr ""
-#: stock/models.py:334 stock/templates/stock/stock_app_base.html:7
+#: stock/models.py:350 stock/templates/stock/stock_app_base.html:7
msgid "Stock Location"
msgstr ""
-#: stock/models.py:337
+#: stock/models.py:353
msgid "Where is this stock item located?"
msgstr ""
-#: stock/models.py:342
+#: stock/models.py:358 stock/templates/stock/item_base.html:177
msgid "Installed In"
msgstr ""
-#: stock/models.py:345
+#: stock/models.py:361
msgid "Is this item installed in another item?"
msgstr ""
-#: stock/models.py:361
+#: stock/models.py:377
msgid "Serial number for this item"
msgstr ""
-#: stock/models.py:373
+#: stock/models.py:389
msgid "Batch code for this stock item"
msgstr ""
-#: stock/models.py:377
+#: stock/models.py:393
msgid "Stock Quantity"
msgstr ""
-#: stock/models.py:386
+#: stock/models.py:402
msgid "Source Build"
msgstr ""
-#: stock/models.py:388
+#: stock/models.py:404
msgid "Build for this stock item"
msgstr ""
-#: stock/models.py:395
+#: stock/models.py:415
msgid "Source Purchase Order"
msgstr ""
-#: stock/models.py:398
+#: stock/models.py:418
msgid "Purchase order for this stock item"
msgstr ""
-#: stock/models.py:404
+#: stock/models.py:424
msgid "Destination Sales Order"
msgstr ""
-#: stock/models.py:411
+#: stock/models.py:431
msgid "Destination Build Order"
msgstr ""
-#: stock/models.py:424
+#: stock/models.py:444
msgid "Delete this Stock Item when stock is depleted"
msgstr ""
-#: stock/models.py:434 stock/templates/stock/item_notes.html:14
+#: stock/models.py:454 stock/templates/stock/item_notes.html:14
#: stock/templates/stock/item_notes.html:30
msgid "Stock Item Notes"
msgstr ""
-#: stock/models.py:485
+#: stock/models.py:505
msgid "Assigned to Customer"
msgstr ""
-#: stock/models.py:487
+#: stock/models.py:507
msgid "Manually assigned to customer"
msgstr ""
-#: stock/models.py:500
+#: stock/models.py:520
msgid "Returned from customer"
msgstr ""
-#: stock/models.py:502
+#: stock/models.py:522
msgid "Returned to location"
msgstr ""
-#: stock/models.py:626
-msgid "Installed in stock item"
+#: stock/models.py:650
+msgid "Installed into stock item"
msgstr ""
-#: stock/models.py:655
+#: stock/models.py:658
+msgid "Installed stock item"
+msgstr ""
+
+#: stock/models.py:682
+msgid "Uninstalled stock item"
+msgstr ""
+
+#: stock/models.py:701
msgid "Uninstalled into location"
msgstr ""
-#: stock/models.py:745
+#: stock/models.py:796
msgid "Part is not set as trackable"
msgstr ""
-#: stock/models.py:751
+#: stock/models.py:802
msgid "Quantity must be integer"
msgstr ""
-#: stock/models.py:757
+#: stock/models.py:808
#, python-brace-format
msgid "Quantity must not exceed available stock quantity ({n})"
msgstr ""
-#: stock/models.py:760
+#: stock/models.py:811
msgid "Serial numbers must be a list of integers"
msgstr ""
-#: stock/models.py:763
+#: stock/models.py:814
msgid "Quantity does not match serial numbers"
msgstr ""
-#: stock/models.py:773
+#: stock/models.py:824
msgid "Serial numbers already exist: "
msgstr ""
-#: stock/models.py:798
+#: stock/models.py:849
msgid "Add serial number"
msgstr ""
-#: stock/models.py:801
+#: stock/models.py:852
#, python-brace-format
msgid "Serialized {n} items"
msgstr ""
-#: stock/models.py:912
+#: stock/models.py:963
msgid "StockItem cannot be moved as it is not in stock"
msgstr ""
-#: stock/models.py:1241
+#: stock/models.py:1292
msgid "Tracking entry title"
msgstr ""
-#: stock/models.py:1243
+#: stock/models.py:1294
msgid "Entry notes"
msgstr ""
-#: stock/models.py:1245
+#: stock/models.py:1296
msgid "Link to external page for further information"
msgstr ""
-#: stock/models.py:1305
+#: stock/models.py:1356
msgid "Value must be provided for this test"
msgstr ""
-#: stock/models.py:1311
+#: stock/models.py:1362
msgid "Attachment must be uploaded for this test"
msgstr ""
-#: stock/models.py:1328
+#: stock/models.py:1379
msgid "Test"
msgstr ""
-#: stock/models.py:1329
+#: stock/models.py:1380
msgid "Test name"
msgstr ""
-#: stock/models.py:1334
+#: stock/models.py:1385
msgid "Result"
msgstr ""
-#: stock/models.py:1335 templates/js/table_filters.html:111
+#: stock/models.py:1386 templates/js/table_filters.html:111
msgid "Test result"
msgstr ""
-#: stock/models.py:1341
+#: stock/models.py:1392
msgid "Test output value"
msgstr ""
-#: stock/models.py:1347
+#: stock/models.py:1398
msgid "Attachment"
msgstr ""
-#: stock/models.py:1348
+#: stock/models.py:1399
msgid "Test result attachment"
msgstr ""
-#: stock/models.py:1354
+#: stock/models.py:1405
msgid "Test notes"
msgstr ""
@@ -3312,102 +3357,106 @@ msgid ""
"This stock item will be automatically deleted when all stock is depleted."
msgstr ""
-#: stock/templates/stock/item_base.html:83 templates/js/barcode.html:283
+#: stock/templates/stock/item_base.html:86 templates/js/barcode.html:283
#: templates/js/barcode.html:288
msgid "Unlink Barcode"
msgstr ""
-#: stock/templates/stock/item_base.html:85
+#: stock/templates/stock/item_base.html:88
msgid "Link Barcode"
msgstr ""
-#: stock/templates/stock/item_base.html:91
+#: stock/templates/stock/item_base.html:94
msgid "Stock adjustment actions"
msgstr ""
-#: stock/templates/stock/item_base.html:95
-#: stock/templates/stock/location.html:33 templates/stock_table.html:14
+#: stock/templates/stock/item_base.html:98
+#: stock/templates/stock/location.html:38 templates/stock_table.html:15
msgid "Count stock"
msgstr ""
-#: stock/templates/stock/item_base.html:96 templates/stock_table.html:12
+#: stock/templates/stock/item_base.html:99 templates/stock_table.html:13
msgid "Add stock"
msgstr ""
-#: stock/templates/stock/item_base.html:97 templates/stock_table.html:13
+#: stock/templates/stock/item_base.html:100 templates/stock_table.html:14
msgid "Remove stock"
msgstr ""
-#: stock/templates/stock/item_base.html:99
+#: stock/templates/stock/item_base.html:102
msgid "Transfer stock"
msgstr ""
-#: stock/templates/stock/item_base.html:101
+#: stock/templates/stock/item_base.html:104
msgid "Serialize stock"
msgstr ""
-#: stock/templates/stock/item_base.html:105
+#: stock/templates/stock/item_base.html:108
msgid "Assign to customer"
msgstr ""
-#: stock/templates/stock/item_base.html:108
+#: stock/templates/stock/item_base.html:111
msgid "Return to stock"
msgstr ""
-#: stock/templates/stock/item_base.html:114
-#: stock/templates/stock/location.html:30
+#: stock/templates/stock/item_base.html:115 templates/js/stock.html:933
+msgid "Uninstall stock item"
+msgstr ""
+
+#: stock/templates/stock/item_base.html:115
+msgid "Uninstall"
+msgstr ""
+
+#: stock/templates/stock/item_base.html:122
+#: stock/templates/stock/location.html:35
msgid "Stock actions"
msgstr ""
-#: stock/templates/stock/item_base.html:118
+#: stock/templates/stock/item_base.html:126
msgid "Convert to variant"
msgstr ""
-#: stock/templates/stock/item_base.html:120
+#: stock/templates/stock/item_base.html:128
msgid "Duplicate stock item"
msgstr ""
-#: stock/templates/stock/item_base.html:121
+#: stock/templates/stock/item_base.html:129
msgid "Edit stock item"
msgstr ""
-#: stock/templates/stock/item_base.html:123
+#: stock/templates/stock/item_base.html:131
msgid "Delete stock item"
msgstr ""
-#: stock/templates/stock/item_base.html:127
+#: stock/templates/stock/item_base.html:135
msgid "Generate test report"
msgstr ""
-#: stock/templates/stock/item_base.html:135
+#: stock/templates/stock/item_base.html:143
msgid "Stock Item Details"
msgstr ""
-#: stock/templates/stock/item_base.html:168
-msgid "Belongs To"
-msgstr ""
-
-#: stock/templates/stock/item_base.html:190
+#: stock/templates/stock/item_base.html:202
msgid "No location set"
msgstr ""
-#: stock/templates/stock/item_base.html:197
+#: stock/templates/stock/item_base.html:209
msgid "Unique Identifier"
msgstr ""
-#: stock/templates/stock/item_base.html:225
+#: stock/templates/stock/item_base.html:237
msgid "Parent Item"
msgstr ""
-#: stock/templates/stock/item_base.html:250
+#: stock/templates/stock/item_base.html:262
msgid "Last Updated"
msgstr ""
-#: stock/templates/stock/item_base.html:255
+#: stock/templates/stock/item_base.html:267
msgid "Last Stocktake"
msgstr ""
-#: stock/templates/stock/item_base.html:259
+#: stock/templates/stock/item_base.html:271
msgid "No stocktake performed"
msgstr ""
@@ -3423,29 +3472,32 @@ msgstr ""
msgid "Are you sure you want to delete this stock item?"
msgstr ""
+#: stock/templates/stock/item_install.html:7
+msgid "Install another StockItem into this item."
+msgstr ""
+
+#: stock/templates/stock/item_install.html:10
+msgid "Stock items can only be installed if they meet the following criteria"
+msgstr ""
+
+#: stock/templates/stock/item_install.html:13
+msgid "The StockItem links to a Part which is in the BOM for this StockItem"
+msgstr ""
+
+#: stock/templates/stock/item_install.html:14
+msgid "The StockItem is currently in stock"
+msgstr ""
+
#: stock/templates/stock/item_installed.html:10
msgid "Installed Stock Items"
msgstr ""
-#: stock/templates/stock/item_installed.html:18
-msgid "Uninstall selected stock items"
+#: stock/templates/stock/item_serialize.html:5
+msgid "Create serialized items from this stock item."
msgstr ""
-#: stock/templates/stock/item_installed.html:18
-msgid "Uninstall"
-msgstr ""
-
-#: stock/templates/stock/item_installed.html:35
-msgid "No stock items installed"
-msgstr ""
-
-#: stock/templates/stock/item_installed.html:48 templates/js/part.html:209
-#: templates/js/stock.html:409
-msgid "Select"
-msgstr ""
-
-#: stock/templates/stock/item_installed.html:131
-msgid "Uninstall item"
+#: stock/templates/stock/item_serialize.html:7
+msgid "Select quantity to serialize, and unique serial numbers."
msgstr ""
#: stock/templates/stock/item_tests.html:10 stock/templates/stock/tabs.html:13
@@ -3464,54 +3516,54 @@ msgstr ""
msgid "Test Report"
msgstr ""
-#: stock/templates/stock/location.html:13
+#: stock/templates/stock/location.html:18
msgid "All stock items"
msgstr ""
-#: stock/templates/stock/location.html:26
+#: stock/templates/stock/location.html:31
msgid "Check-in Items"
msgstr ""
-#: stock/templates/stock/location.html:37
+#: stock/templates/stock/location.html:42
msgid "Location actions"
msgstr ""
-#: stock/templates/stock/location.html:39
+#: stock/templates/stock/location.html:44
msgid "Edit location"
msgstr ""
-#: stock/templates/stock/location.html:40
+#: stock/templates/stock/location.html:45
msgid "Delete location"
msgstr ""
-#: stock/templates/stock/location.html:48
+#: stock/templates/stock/location.html:53
msgid "Location Details"
msgstr ""
-#: stock/templates/stock/location.html:53
+#: stock/templates/stock/location.html:58
msgid "Location Path"
msgstr ""
-#: stock/templates/stock/location.html:58
+#: stock/templates/stock/location.html:63
msgid "Location Description"
msgstr ""
-#: stock/templates/stock/location.html:63
+#: stock/templates/stock/location.html:68
msgid "Sublocations"
msgstr ""
-#: stock/templates/stock/location.html:68
-#: stock/templates/stock/location.html:83
+#: stock/templates/stock/location.html:73
+#: stock/templates/stock/location.html:88
#: templates/InvenTree/search_stock_items.html:6 templates/stats.html:21
#: templates/stats.html:30
msgid "Stock Items"
msgstr ""
-#: stock/templates/stock/location.html:73
+#: stock/templates/stock/location.html:78
msgid "Stock Details"
msgstr ""
-#: stock/templates/stock/location.html:78
+#: stock/templates/stock/location.html:83
#: templates/InvenTree/search_stock_location.html:6 templates/stats.html:25
msgid "Stock Locations"
msgstr ""
@@ -3524,7 +3576,7 @@ msgstr ""
msgid "The following stock items will be uninstalled"
msgstr ""
-#: stock/templates/stock/stockitem_convert.html:7 stock/views.py:1186
+#: stock/templates/stock/stockitem_convert.html:7 stock/views.py:1287
msgid "Convert Stock Item"
msgstr ""
@@ -3636,130 +3688,134 @@ msgstr ""
msgid "Stock Item QR Code"
msgstr ""
-#: stock/views.py:699
+#: stock/views.py:700
+msgid "Install Stock Item"
+msgstr ""
+
+#: stock/views.py:799
msgid "Uninstall Stock Items"
msgstr ""
-#: stock/views.py:806
+#: stock/views.py:906
msgid "Uninstalled stock items"
msgstr ""
-#: stock/views.py:831
+#: stock/views.py:931
msgid "Adjust Stock"
msgstr ""
-#: stock/views.py:940
+#: stock/views.py:1040
msgid "Move Stock Items"
msgstr ""
-#: stock/views.py:941
+#: stock/views.py:1041
msgid "Count Stock Items"
msgstr ""
-#: stock/views.py:942
+#: stock/views.py:1042
msgid "Remove From Stock"
msgstr ""
-#: stock/views.py:943
+#: stock/views.py:1043
msgid "Add Stock Items"
msgstr ""
-#: stock/views.py:944
+#: stock/views.py:1044
msgid "Delete Stock Items"
msgstr ""
-#: stock/views.py:972
+#: stock/views.py:1072
msgid "Must enter integer value"
msgstr ""
-#: stock/views.py:977
+#: stock/views.py:1077
msgid "Quantity must be positive"
msgstr ""
-#: stock/views.py:984
+#: stock/views.py:1084
#, python-brace-format
msgid "Quantity must not exceed {x}"
msgstr ""
-#: stock/views.py:1063
+#: stock/views.py:1163
#, python-brace-format
msgid "Added stock to {n} items"
msgstr ""
-#: stock/views.py:1078
+#: stock/views.py:1178
#, python-brace-format
msgid "Removed stock from {n} items"
msgstr ""
-#: stock/views.py:1091
+#: stock/views.py:1191
#, python-brace-format
msgid "Counted stock for {n} items"
msgstr ""
-#: stock/views.py:1119
+#: stock/views.py:1219
msgid "No items were moved"
msgstr ""
-#: stock/views.py:1122
+#: stock/views.py:1222
#, python-brace-format
msgid "Moved {n} items to {dest}"
msgstr ""
-#: stock/views.py:1141
+#: stock/views.py:1241
#, python-brace-format
msgid "Deleted {n} stock items"
msgstr ""
-#: stock/views.py:1153
+#: stock/views.py:1253
msgid "Edit Stock Item"
msgstr ""
-#: stock/views.py:1234
+#: stock/views.py:1335
msgid "Serialize Stock"
msgstr ""
-#: stock/views.py:1426
+#: stock/views.py:1527
msgid "Duplicate Stock Item"
msgstr ""
-#: stock/views.py:1492
+#: stock/views.py:1593
msgid "Invalid quantity"
msgstr ""
-#: stock/views.py:1495
+#: stock/views.py:1596
msgid "Quantity cannot be less than zero"
msgstr ""
-#: stock/views.py:1499
+#: stock/views.py:1600
msgid "Invalid part selection"
msgstr ""
-#: stock/views.py:1548
+#: stock/views.py:1649
#, python-brace-format
msgid "Created {n} new stock items"
msgstr ""
-#: stock/views.py:1567 stock/views.py:1583
+#: stock/views.py:1668 stock/views.py:1684
msgid "Created new stock item"
msgstr ""
-#: stock/views.py:1602
+#: stock/views.py:1703
msgid "Delete Stock Location"
msgstr ""
-#: stock/views.py:1615
+#: stock/views.py:1716
msgid "Delete Stock Item"
msgstr ""
-#: stock/views.py:1626
+#: stock/views.py:1727
msgid "Delete Stock Tracking Entry"
msgstr ""
-#: stock/views.py:1643
+#: stock/views.py:1744
msgid "Edit Stock Tracking Entry"
msgstr ""
-#: stock/views.py:1652
+#: stock/views.py:1753
msgid "Add Stock Tracking Entry"
msgstr ""
@@ -3787,15 +3843,19 @@ msgstr ""
msgid "Search Results"
msgstr ""
-#: templates/InvenTree/search.html:22
-msgid "No results found"
+#: templates/InvenTree/search.html:24
+msgid "No results found for "
msgstr ""
-#: templates/InvenTree/search.html:181 templates/js/stock.html:521
+#: templates/InvenTree/search.html:42
+msgid "Enter a search query"
+msgstr ""
+
+#: templates/InvenTree/search.html:191 templates/js/stock.html:527
msgid "Shipped to customer"
msgstr ""
-#: templates/InvenTree/search.html:184 templates/js/stock.html:528
+#: templates/InvenTree/search.html:194 templates/js/stock.html:537
msgid "No stock location set"
msgstr ""
@@ -3974,31 +4034,35 @@ msgstr ""
msgid "Open subassembly"
msgstr ""
-#: templates/js/bom.html:184 templates/js/build.html:119
+#: templates/js/bom.html:173
+msgid "Optional"
+msgstr ""
+
+#: templates/js/bom.html:188 templates/js/build.html:119
msgid "Available"
msgstr ""
-#: templates/js/bom.html:209
+#: templates/js/bom.html:213
msgid "No pricing available"
msgstr ""
-#: templates/js/bom.html:228
+#: templates/js/bom.html:232
msgid "Actions"
msgstr ""
-#: templates/js/bom.html:236
+#: templates/js/bom.html:240
msgid "Validate BOM Item"
msgstr ""
-#: templates/js/bom.html:238
+#: templates/js/bom.html:242
msgid "This line has been validated"
msgstr ""
-#: templates/js/bom.html:240
+#: templates/js/bom.html:244
msgid "Edit BOM Item"
msgstr ""
-#: templates/js/bom.html:242
+#: templates/js/bom.html:246
msgid "Delete BOM Item"
msgstr ""
@@ -4026,11 +4090,11 @@ msgstr ""
msgid "No supplier parts found"
msgstr ""
-#: templates/js/company.html:145 templates/js/part.html:248
+#: templates/js/company.html:145 templates/js/part.html:314
msgid "Template part"
msgstr ""
-#: templates/js/company.html:149 templates/js/part.html:252
+#: templates/js/company.html:149 templates/js/part.html:318
msgid "Assembled part"
msgstr ""
@@ -4042,7 +4106,7 @@ msgstr ""
msgid "No purchase orders found"
msgstr ""
-#: templates/js/order.html:172 templates/js/stock.html:633
+#: templates/js/order.html:172 templates/js/stock.html:642
msgid "Date"
msgstr ""
@@ -4058,51 +4122,56 @@ msgstr ""
msgid "No variants found"
msgstr ""
-#: templates/js/part.html:256
-msgid "Starred part"
-msgstr ""
-
-#: templates/js/part.html:260
-msgid "Salable part"
-msgstr ""
-
-#: templates/js/part.html:299
-msgid "No category"
-msgstr ""
-
-#: templates/js/part.html:317 templates/js/table_filters.html:191
-msgid "Low stock"
-msgstr ""
-
-#: templates/js/part.html:326
-msgid "Building"
-msgstr ""
-
-#: templates/js/part.html:345
+#: templates/js/part.html:223 templates/js/part.html:411
msgid "No parts found"
msgstr ""
-#: templates/js/part.html:405
+#: templates/js/part.html:275 templates/js/stock.html:409
+#: templates/js/stock.html:965
+msgid "Select"
+msgstr ""
+
+#: templates/js/part.html:322
+msgid "Starred part"
+msgstr ""
+
+#: templates/js/part.html:326
+msgid "Salable part"
+msgstr ""
+
+#: templates/js/part.html:365
+msgid "No category"
+msgstr ""
+
+#: templates/js/part.html:383 templates/js/table_filters.html:196
+msgid "Low stock"
+msgstr ""
+
+#: templates/js/part.html:392
+msgid "Building"
+msgstr ""
+
+#: templates/js/part.html:471
msgid "YES"
msgstr ""
-#: templates/js/part.html:407
+#: templates/js/part.html:473
msgid "NO"
msgstr ""
-#: templates/js/part.html:441
+#: templates/js/part.html:507
msgid "No test templates matching query"
msgstr ""
-#: templates/js/part.html:492 templates/js/stock.html:63
+#: templates/js/part.html:558 templates/js/stock.html:63
msgid "Edit test result"
msgstr ""
-#: templates/js/part.html:493 templates/js/stock.html:64
+#: templates/js/part.html:559 templates/js/stock.html:64
msgid "Delete test result"
msgstr ""
-#: templates/js/part.html:499
+#: templates/js/part.html:565
msgid "This test is defined for a parent part"
msgstr ""
@@ -4146,42 +4215,62 @@ msgstr ""
msgid "Stock item has been assigned to customer"
msgstr ""
-#: templates/js/stock.html:474
+#: templates/js/stock.html:475
msgid "Stock item was assigned to a build order"
msgstr ""
-#: templates/js/stock.html:476
+#: templates/js/stock.html:477
msgid "Stock item was assigned to a sales order"
msgstr ""
-#: templates/js/stock.html:483
+#: templates/js/stock.html:482
+msgid "Stock item has been installed in another item"
+msgstr ""
+
+#: templates/js/stock.html:489
msgid "Stock item has been rejected"
msgstr ""
-#: templates/js/stock.html:487
+#: templates/js/stock.html:493
msgid "Stock item is lost"
msgstr ""
-#: templates/js/stock.html:491 templates/js/table_filters.html:60
+#: templates/js/stock.html:497 templates/js/table_filters.html:60
msgid "Depleted"
msgstr ""
-#: templates/js/stock.html:516
+#: templates/js/stock.html:522
msgid "Installed in Stock Item "
msgstr ""
-#: templates/js/stock.html:699
+#: templates/js/stock.html:530
+msgid "Assigned to sales order"
+msgstr ""
+
+#: templates/js/stock.html:708
msgid "No user information"
msgstr ""
-#: templates/js/stock.html:783
+#: templates/js/stock.html:792
msgid "Create New Part"
msgstr ""
-#: templates/js/stock.html:795
+#: templates/js/stock.html:804
msgid "Create New Location"
msgstr ""
+#: templates/js/stock.html:903
+msgid "Serial"
+msgstr ""
+
+#: templates/js/stock.html:996 templates/js/table_filters.html:70
+msgid "Installed"
+msgstr ""
+
+#: templates/js/stock.html:1021
+msgid "Install item"
+msgstr ""
+
#: templates/js/table_filters.html:19 templates/js/table_filters.html:80
msgid "Is Serialized"
msgstr ""
@@ -4243,10 +4332,6 @@ msgstr ""
msgid "Show items which are in stock"
msgstr ""
-#: templates/js/table_filters.html:70
-msgid "Installed"
-msgstr ""
-
#: templates/js/table_filters.html:71
msgid "Show stock items which are installed in another item"
msgstr ""
@@ -4283,19 +4368,27 @@ msgstr ""
msgid "Include parts in subcategories"
msgstr ""
+#: templates/js/table_filters.html:178
+msgid "Has IPN"
+msgstr ""
+
#: templates/js/table_filters.html:179
+msgid "Part has internal part number"
+msgstr ""
+
+#: templates/js/table_filters.html:184
msgid "Show active parts"
msgstr ""
-#: templates/js/table_filters.html:187
+#: templates/js/table_filters.html:192
msgid "Stock available"
msgstr ""
-#: templates/js/table_filters.html:203
+#: templates/js/table_filters.html:208
msgid "Starred"
msgstr ""
-#: templates/js/table_filters.html:215
+#: templates/js/table_filters.html:220
msgid "Purchasable"
msgstr ""
@@ -4339,42 +4432,42 @@ msgstr ""
msgid "Search"
msgstr ""
-#: templates/stock_table.html:5
+#: templates/stock_table.html:6
msgid "Export Stock Information"
msgstr ""
-#: templates/stock_table.html:12
+#: templates/stock_table.html:13
msgid "Add to selected stock items"
msgstr ""
-#: templates/stock_table.html:13
+#: templates/stock_table.html:14
msgid "Remove from selected stock items"
msgstr ""
-#: templates/stock_table.html:14
+#: templates/stock_table.html:15
msgid "Stocktake selected stock items"
msgstr ""
-#: templates/stock_table.html:15
+#: templates/stock_table.html:16
msgid "Move selected stock items"
msgstr ""
-#: templates/stock_table.html:15
+#: templates/stock_table.html:16
msgid "Move stock"
msgstr ""
-#: templates/stock_table.html:16
+#: templates/stock_table.html:17
msgid "Order selected items"
msgstr ""
-#: templates/stock_table.html:16
+#: templates/stock_table.html:17
msgid "Order stock"
msgstr ""
-#: templates/stock_table.html:17
+#: templates/stock_table.html:18
msgid "Delete selected items"
msgstr ""
-#: templates/stock_table.html:17
+#: templates/stock_table.html:18
msgid "Delete Stock"
msgstr ""
diff --git a/InvenTree/locale/es/LC_MESSAGES/django.po b/InvenTree/locale/es/LC_MESSAGES/django.po
index d4a3d7ceb6..0b5425db6e 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-09-28 12:03+0000\n"
+"POT-Creation-Date: 2020-10-04 14:02+0000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME \n"
"Language-Team: LANGUAGE \n"
@@ -86,7 +86,7 @@ msgstr ""
msgid "File comment"
msgstr ""
-#: InvenTree/models.py:68 templates/js/stock.html:690
+#: InvenTree/models.py:68 templates/js/stock.html:699
msgid "User"
msgstr ""
@@ -99,19 +99,19 @@ msgstr ""
msgid "Description (optional)"
msgstr ""
-#: InvenTree/settings.py:341
+#: InvenTree/settings.py:342
msgid "English"
msgstr ""
-#: InvenTree/settings.py:342
+#: InvenTree/settings.py:343
msgid "German"
msgstr ""
-#: InvenTree/settings.py:343
+#: InvenTree/settings.py:344
msgid "French"
msgstr ""
-#: InvenTree/settings.py:344
+#: InvenTree/settings.py:345
msgid "Polish"
msgstr ""
@@ -143,7 +143,8 @@ msgstr ""
msgid "Returned"
msgstr ""
-#: InvenTree/status_codes.py:136 order/templates/order/sales_order_base.html:98
+#: InvenTree/status_codes.py:136
+#: order/templates/order/sales_order_base.html:103
msgid "Shipped"
msgstr ""
@@ -198,7 +199,7 @@ msgstr ""
msgid "Overage must be an integer value or a percentage"
msgstr ""
-#: InvenTree/views.py:639
+#: InvenTree/views.py:661
msgid "Database Statistics"
msgstr ""
@@ -250,7 +251,7 @@ msgstr ""
msgid "Serial numbers"
msgstr ""
-#: build/forms.py:64 stock/forms.py:107
+#: build/forms.py:64 stock/forms.py:111
msgid "Enter unique serial numbers (or leave blank)"
msgstr ""
@@ -262,7 +263,7 @@ msgstr ""
msgid "Build quantity must be integer value for trackable parts"
msgstr ""
-#: build/models.py:73 build/templates/build/build_base.html:65
+#: build/models.py:73 build/templates/build/build_base.html:70
msgid "Build Title"
msgstr ""
@@ -270,7 +271,7 @@ msgstr ""
msgid "Brief description of the build"
msgstr ""
-#: build/models.py:84 build/templates/build/build_base.html:86
+#: build/models.py:84 build/templates/build/build_base.html:91
msgid "Parent Build"
msgstr ""
@@ -280,18 +281,17 @@ msgstr ""
#: build/models.py:90 build/templates/build/allocate.html:329
#: build/templates/build/auto_allocate.html:19
-#: build/templates/build/build_base.html:70
+#: build/templates/build/build_base.html:75
#: build/templates/build/detail.html:22 order/models.py:501
#: order/templates/order/order_wizard/select_parts.html:30
#: order/templates/order/purchase_order_detail.html:147
-#: order/templates/order/receive_parts.html:19 part/models.py:241
+#: order/templates/order/receive_parts.html:19 part/models.py:293
#: part/templates/part/part_app_base.html:7
-#: part/templates/part/set_category.html:13
-#: stock/templates/stock/item_installed.html:60
-#: templates/InvenTree/search.html:123 templates/js/barcode.html:336
-#: templates/js/bom.html:124 templates/js/build.html:47
-#: templates/js/company.html:137 templates/js/part.html:223
-#: templates/js/stock.html:421
+#: part/templates/part/set_category.html:13 templates/InvenTree/search.html:133
+#: templates/js/barcode.html:336 templates/js/bom.html:124
+#: templates/js/build.html:47 templates/js/company.html:137
+#: templates/js/part.html:184 templates/js/part.html:289
+#: templates/js/stock.html:421 templates/js/stock.html:977
msgid "Part"
msgstr ""
@@ -325,7 +325,7 @@ msgstr ""
msgid "Number of parts to build"
msgstr ""
-#: build/models.py:128 part/templates/part/part_base.html:142
+#: build/models.py:128 part/templates/part/part_base.html:145
msgid "Build Status"
msgstr ""
@@ -333,7 +333,7 @@ msgstr ""
msgid "Build status code"
msgstr ""
-#: build/models.py:136 stock/models.py:371
+#: build/models.py:136 stock/models.py:387
msgid "Batch Code"
msgstr ""
@@ -344,12 +344,12 @@ msgstr ""
#: build/models.py:155 build/templates/build/detail.html:55
#: company/templates/company/supplier_part_base.html:60
#: company/templates/company/supplier_part_detail.html:24
-#: part/templates/part/detail.html:80 part/templates/part/part_base.html:89
-#: stock/models.py:365 stock/templates/stock/item_base.html:232
+#: part/templates/part/detail.html:80 part/templates/part/part_base.html:92
+#: stock/models.py:381 stock/templates/stock/item_base.html:244
msgid "External Link"
msgstr ""
-#: build/models.py:156 stock/models.py:367
+#: build/models.py:156 stock/models.py:383
msgid "Link to external URL"
msgstr ""
@@ -357,10 +357,10 @@ msgstr ""
#: company/templates/company/tabs.html:33 order/templates/order/po_tabs.html:15
#: order/templates/order/purchase_order_detail.html:202
#: order/templates/order/so_tabs.html:23 part/templates/part/tabs.html:67
-#: stock/forms.py:281 stock/forms.py:309 stock/models.py:433
-#: stock/models.py:1353 stock/templates/stock/tabs.html:26
-#: templates/js/barcode.html:391 templates/js/bom.html:219
-#: templates/js/stock.html:116 templates/js/stock.html:534
+#: stock/forms.py:306 stock/forms.py:338 stock/forms.py:366 stock/models.py:453
+#: stock/models.py:1404 stock/templates/stock/tabs.html:26
+#: templates/js/barcode.html:391 templates/js/bom.html:223
+#: templates/js/stock.html:116 templates/js/stock.html:543
msgid "Notes"
msgstr ""
@@ -404,7 +404,7 @@ msgstr ""
#: build/templates/build/allocate.html:17
#: company/templates/company/detail_part.html:18 order/views.py:779
-#: part/templates/part/category.html:107
+#: part/templates/part/category.html:112
msgid "Order Parts"
msgstr ""
@@ -420,24 +420,24 @@ msgstr ""
msgid "Unallocate"
msgstr ""
-#: build/templates/build/allocate.html:87 templates/stock_table.html:8
+#: build/templates/build/allocate.html:87 templates/stock_table.html:9
msgid "New Stock Item"
msgstr ""
-#: build/templates/build/allocate.html:88 stock/views.py:1327
+#: build/templates/build/allocate.html:88 stock/views.py:1428
msgid "Create new Stock Item"
msgstr ""
#: build/templates/build/allocate.html:170
#: order/templates/order/sales_order_detail.html:68
-#: order/templates/order/sales_order_detail.html:150 stock/models.py:359
-#: stock/templates/stock/item_base.html:148
+#: order/templates/order/sales_order_detail.html:150 stock/models.py:375
+#: stock/templates/stock/item_base.html:156
msgid "Serial Number"
msgstr ""
#: build/templates/build/allocate.html:172
#: build/templates/build/auto_allocate.html:20
-#: build/templates/build/build_base.html:75
+#: build/templates/build/build_base.html:80
#: build/templates/build/detail.html:27
#: company/templates/company/supplier_part_pricing.html:71
#: order/templates/order/order_wizard/select_parts.html:32
@@ -446,22 +446,22 @@ msgstr ""
#: order/templates/order/sales_order_detail.html:152
#: part/templates/part/allocation.html:16
#: part/templates/part/allocation.html:49
-#: part/templates/part/sale_prices.html:80
+#: part/templates/part/sale_prices.html:80 stock/forms.py:297
#: stock/templates/stock/item_base.html:26
#: stock/templates/stock/item_base.html:32
-#: stock/templates/stock/item_base.html:154
+#: stock/templates/stock/item_base.html:162
#: stock/templates/stock/stock_adjust.html:18 templates/js/barcode.html:338
#: templates/js/bom.html:162 templates/js/build.html:58
-#: templates/js/stock.html:681
+#: templates/js/stock.html:690 templates/js/stock.html:905
msgid "Quantity"
msgstr ""
#: build/templates/build/allocate.html:186
-#: build/templates/build/auto_allocate.html:21 stock/forms.py:279
-#: stock/templates/stock/item_base.html:186
+#: build/templates/build/auto_allocate.html:21 stock/forms.py:336
+#: stock/templates/stock/item_base.html:198
#: stock/templates/stock/stock_adjust.html:17
-#: templates/InvenTree/search.html:173 templates/js/barcode.html:337
-#: templates/js/stock.html:512
+#: templates/InvenTree/search.html:183 templates/js/barcode.html:337
+#: templates/js/stock.html:518
msgid "Location"
msgstr ""
@@ -475,7 +475,7 @@ msgstr ""
msgid "Delete stock allocation"
msgstr ""
-#: build/templates/build/allocate.html:238 templates/js/bom.html:330
+#: build/templates/build/allocate.html:238 templates/js/bom.html:334
msgid "No BOM items found"
msgstr ""
@@ -484,12 +484,12 @@ msgstr ""
#: company/templates/company/supplier_part_detail.html:27
#: order/templates/order/purchase_order_detail.html:159
#: part/templates/part/detail.html:51 part/templates/part/set_category.html:14
-#: stock/templates/stock/item_installed.html:83
-#: templates/InvenTree/search.html:137 templates/js/bom.html:147
+#: templates/InvenTree/search.html:147 templates/js/bom.html:147
#: templates/js/company.html:56 templates/js/order.html:159
#: templates/js/order.html:234 templates/js/part.html:120
-#: templates/js/part.html:279 templates/js/part.html:460
-#: templates/js/stock.html:444 templates/js/stock.html:662
+#: templates/js/part.html:203 templates/js/part.html:345
+#: templates/js/part.html:526 templates/js/stock.html:444
+#: templates/js/stock.html:671
msgid "Description"
msgstr ""
@@ -499,8 +499,8 @@ msgstr ""
msgid "Reference"
msgstr ""
-#: build/templates/build/allocate.html:347 part/models.py:1348
-#: templates/js/part.html:464 templates/js/table_filters.html:121
+#: build/templates/build/allocate.html:347 part/models.py:1401
+#: templates/js/part.html:530 templates/js/table_filters.html:121
msgid "Required"
msgstr ""
@@ -547,7 +547,7 @@ msgstr ""
#: build/templates/build/build_base.html:8
#: build/templates/build/build_base.html:34
#: build/templates/build/complete.html:6
-#: stock/templates/stock/item_base.html:211 templates/js/build.html:39
+#: stock/templates/stock/item_base.html:223 templates/js/build.html:39
#: templates/navbar.html:20
msgid "Build"
msgstr ""
@@ -560,40 +560,49 @@ msgstr ""
msgid "This build is a child of Build"
msgstr ""
-#: build/templates/build/build_base.html:61 build/templates/build/detail.html:9
+#: build/templates/build/build_base.html:39
+#: company/templates/company/company_base.html:27
+#: order/templates/order/order_base.html:28
+#: order/templates/order/sales_order_base.html:38
+#: part/templates/part/category.html:13 part/templates/part/part_base.html:32
+#: stock/templates/stock/item_base.html:69
+#: stock/templates/stock/location.html:12
+msgid "Admin view"
+msgstr ""
+
+#: build/templates/build/build_base.html:66 build/templates/build/detail.html:9
msgid "Build Details"
msgstr ""
-#: build/templates/build/build_base.html:80
+#: build/templates/build/build_base.html:85
#: build/templates/build/detail.html:42
#: order/templates/order/receive_parts.html:24
-#: stock/templates/stock/item_base.html:264
-#: stock/templates/stock/item_installed.html:111
-#: templates/InvenTree/search.html:165 templates/js/barcode.html:42
-#: templates/js/build.html:63 templates/js/order.html:164
-#: templates/js/order.html:239 templates/js/stock.html:499
+#: stock/templates/stock/item_base.html:276 templates/InvenTree/search.html:175
+#: templates/js/barcode.html:42 templates/js/build.html:63
+#: templates/js/order.html:164 templates/js/order.html:239
+#: templates/js/stock.html:505 templates/js/stock.html:913
msgid "Status"
msgstr ""
-#: build/templates/build/build_base.html:93 order/models.py:499
+#: build/templates/build/build_base.html:98 order/models.py:499
#: 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:174 templates/js/order.html:213
+#: stock/templates/stock/item_base.html:186 templates/js/order.html:213
msgid "Sales Order"
msgstr ""
-#: build/templates/build/build_base.html:99
+#: build/templates/build/build_base.html:104
msgid "BOM Price"
msgstr ""
-#: build/templates/build/build_base.html:104
+#: build/templates/build/build_base.html:109
msgid "BOM pricing is incomplete"
msgstr ""
-#: build/templates/build/build_base.html:107
+#: build/templates/build/build_base.html:112
msgid "No pricing information"
msgstr ""
@@ -648,15 +657,15 @@ msgid "Stock can be taken from any available location."
msgstr ""
#: build/templates/build/detail.html:48
-#: stock/templates/stock/item_base.html:204
-#: stock/templates/stock/item_installed.html:119 templates/js/stock.html:507
-#: templates/js/table_filters.html:34 templates/js/table_filters.html:100
+#: stock/templates/stock/item_base.html:216 templates/js/stock.html:513
+#: templates/js/stock.html:920 templates/js/table_filters.html:34
+#: templates/js/table_filters.html:100
msgid "Batch"
msgstr ""
#: build/templates/build/detail.html:61
-#: order/templates/order/order_base.html:93
-#: order/templates/order/sales_order_base.html:92 templates/js/build.html:71
+#: order/templates/order/order_base.html:98
+#: order/templates/order/sales_order_base.html:97 templates/js/build.html:71
msgid "Created"
msgstr ""
@@ -769,7 +778,7 @@ msgstr ""
msgid "Invalid location selected"
msgstr ""
-#: build/views.py:296 stock/views.py:1520
+#: build/views.py:296 stock/views.py:1621
#, python-brace-format
msgid "The following serial numbers already exist: ({sn})"
msgstr ""
@@ -878,7 +887,7 @@ msgstr ""
msgid "Description of the company"
msgstr ""
-#: company/models.py:91 company/templates/company/company_base.html:48
+#: company/models.py:91 company/templates/company/company_base.html:53
#: templates/js/company.html:61
msgid "Website"
msgstr ""
@@ -887,7 +896,7 @@ msgstr ""
msgid "Company website URL"
msgstr ""
-#: company/models.py:94 company/templates/company/company_base.html:55
+#: company/models.py:94 company/templates/company/company_base.html:60
msgid "Address"
msgstr ""
@@ -903,7 +912,7 @@ msgstr ""
msgid "Contact phone number"
msgstr ""
-#: company/models.py:101 company/templates/company/company_base.html:69
+#: company/models.py:101 company/templates/company/company_base.html:74
msgid "Email"
msgstr ""
@@ -911,7 +920,7 @@ msgstr ""
msgid "Contact email address"
msgstr ""
-#: company/models.py:104 company/templates/company/company_base.html:76
+#: company/models.py:104 company/templates/company/company_base.html:81
msgid "Contact"
msgstr ""
@@ -935,8 +944,8 @@ msgstr ""
msgid "Does this company manufacture parts?"
msgstr ""
-#: company/models.py:279 stock/models.py:319
-#: stock/templates/stock/item_base.html:140
+#: company/models.py:279 stock/models.py:335
+#: stock/templates/stock/item_base.html:148
msgid "Base Part"
msgstr ""
@@ -986,12 +995,12 @@ msgstr ""
msgid "Company"
msgstr ""
-#: company/templates/company/company_base.html:42
+#: company/templates/company/company_base.html:47
#: company/templates/company/detail.html:8
msgid "Company Details"
msgstr ""
-#: company/templates/company/company_base.html:62
+#: company/templates/company/company_base.html:67
msgid "Phone"
msgstr ""
@@ -1005,16 +1014,16 @@ msgstr ""
#: company/templates/company/detail.html:21
#: company/templates/company/supplier_part_base.html:66
#: company/templates/company/supplier_part_detail.html:21
-#: order/templates/order/order_base.html:74
+#: 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:239 templates/js/company.html:48
+#: stock/templates/stock/item_base.html:251 templates/js/company.html:48
#: templates/js/company.html:162 templates/js/order.html:146
msgid "Supplier"
msgstr ""
#: company/templates/company/detail.html:26
-#: order/templates/order/sales_order_base.html:73 stock/models.py:354
-#: stock/models.py:355 stock/templates/stock/item_base.html:161
+#: order/templates/order/sales_order_base.html:78 stock/models.py:370
+#: stock/models.py:371 stock/templates/stock/item_base.html:169
#: templates/js/company.html:40 templates/js/order.html:221
msgid "Customer"
msgstr ""
@@ -1030,18 +1039,18 @@ msgstr ""
#: company/templates/company/detail_part.html:13
#: order/templates/order/purchase_order_detail.html:67
-#: part/templates/part/supplier.html:13 templates/js/stock.html:788
+#: part/templates/part/supplier.html:13 templates/js/stock.html:797
msgid "New Supplier Part"
msgstr ""
#: company/templates/company/detail_part.html:15
-#: part/templates/part/category.html:104 part/templates/part/supplier.html:15
-#: stock/templates/stock/item_installed.html:16 templates/stock_table.html:10
+#: part/templates/part/category.html:109 part/templates/part/supplier.html:15
+#: templates/stock_table.html:11
msgid "Options"
msgstr ""
#: company/templates/company/detail_part.html:18
-#: part/templates/part/category.html:107
+#: part/templates/part/category.html:112
msgid "Order parts"
msgstr ""
@@ -1054,7 +1063,7 @@ msgid "Delete Parts"
msgstr ""
#: company/templates/company/detail_part.html:43
-#: part/templates/part/category.html:102 templates/js/stock.html:782
+#: part/templates/part/category.html:107 templates/js/stock.html:791
msgid "New Part"
msgstr ""
@@ -1086,8 +1095,8 @@ msgstr ""
#: company/templates/company/detail_stock.html:35
#: company/templates/company/supplier_part_stock.html:33
-#: part/templates/part/category.html:101 part/templates/part/category.html:108
-#: part/templates/part/stock.html:51 templates/stock_table.html:5
+#: part/templates/part/category.html:106 part/templates/part/category.html:113
+#: part/templates/part/stock.html:51 templates/stock_table.html:6
msgid "Export"
msgstr ""
@@ -1143,8 +1152,8 @@ msgid "New Sales Order"
msgstr ""
#: company/templates/company/supplier_part_base.html:6
-#: company/templates/company/supplier_part_base.html:19 stock/models.py:328
-#: stock/templates/stock/item_base.html:244 templates/js/company.html:178
+#: company/templates/company/supplier_part_base.html:19 stock/models.py:344
+#: stock/templates/stock/item_base.html:256 templates/js/company.html:178
msgid "Supplier Part"
msgstr ""
@@ -1196,7 +1205,7 @@ msgid "Pricing Information"
msgstr ""
#: company/templates/company/supplier_part_pricing.html:15 company/views.py:399
-#: part/templates/part/sale_prices.html:13 part/views.py:2108
+#: part/templates/part/sale_prices.html:13 part/views.py:2149
msgid "Add Price Break"
msgstr ""
@@ -1206,7 +1215,7 @@ msgid "No price break information found"
msgstr ""
#: company/templates/company/supplier_part_pricing.html:76
-#: part/templates/part/sale_prices.html:85 templates/js/bom.html:203
+#: part/templates/part/sale_prices.html:85 templates/js/bom.html:207
msgid "Price"
msgstr ""
@@ -1230,9 +1239,8 @@ msgstr ""
#: company/templates/company/supplier_part_tabs.html:8
#: company/templates/company/tabs.html:12 part/templates/part/tabs.html:18
-#: stock/templates/stock/item_installed.html:91
-#: stock/templates/stock/location.html:12 templates/InvenTree/search.html:145
-#: templates/js/part.html:124 templates/js/part.html:306
+#: stock/templates/stock/location.html:17 templates/InvenTree/search.html:155
+#: templates/js/part.html:124 templates/js/part.html:372
#: templates/js/stock.html:452 templates/navbar.html:19
msgid "Stock"
msgstr ""
@@ -1242,9 +1250,10 @@ msgid "Orders"
msgstr ""
#: company/templates/company/tabs.html:9
-#: order/templates/order/receive_parts.html:14 part/models.py:242
-#: part/templates/part/cat_link.html:7 part/templates/part/category.html:83
-#: templates/navbar.html:18 templates/stats.html:8 templates/stats.html:17
+#: order/templates/order/receive_parts.html:14 part/models.py:294
+#: part/templates/part/cat_link.html:7 part/templates/part/category.html:88
+#: part/templates/part/category_tabs.html:6 templates/navbar.html:18
+#: templates/stats.html:8 templates/stats.html:17
msgid "Parts"
msgstr ""
@@ -1313,7 +1322,7 @@ msgstr ""
msgid "Edit Supplier Part"
msgstr ""
-#: company/views.py:269 templates/js/stock.html:789
+#: company/views.py:269 templates/js/stock.html:798
msgid "Create new Supplier Part"
msgstr ""
@@ -1321,15 +1330,15 @@ msgstr ""
msgid "Delete Supplier Part"
msgstr ""
-#: company/views.py:404 part/views.py:2112
+#: company/views.py:404 part/views.py:2153
msgid "Added new price break"
msgstr ""
-#: company/views.py:441 part/views.py:2157
+#: company/views.py:441 part/views.py:2198
msgid "Edit Price Break"
msgstr ""
-#: company/views.py:456 part/views.py:2171
+#: company/views.py:456 part/views.py:2212
msgid "Delete Price Break"
msgstr ""
@@ -1366,11 +1375,11 @@ msgid "Mark order as complete"
msgstr ""
#: order/forms.py:46 order/forms.py:57
-#: order/templates/order/sales_order_base.html:49
+#: order/templates/order/sales_order_base.html:54
msgid "Cancel order"
msgstr ""
-#: order/forms.py:68 order/templates/order/sales_order_base.html:46
+#: order/forms.py:68 order/templates/order/sales_order_base.html:51
msgid "Ship order"
msgstr ""
@@ -1423,7 +1432,7 @@ msgid "Date order was completed"
msgstr ""
#: order/models.py:185 order/models.py:259 part/views.py:1304
-#: stock/models.py:239 stock/models.py:754
+#: stock/models.py:241 stock/models.py:805
msgid "Quantity must be greater than zero"
msgstr ""
@@ -1461,7 +1470,7 @@ msgstr ""
#: order/models.py:466 order/templates/order/order_base.html:9
#: order/templates/order/order_base.html:23
-#: stock/templates/stock/item_base.html:218 templates/js/order.html:138
+#: stock/templates/stock/item_base.html:230 templates/js/order.html:138
msgid "Purchase Order"
msgstr ""
@@ -1503,32 +1512,32 @@ msgstr ""
msgid "Are you sure you want to delete this attachment?"
msgstr ""
-#: order/templates/order/order_base.html:59
-msgid "Purchase Order Details"
-msgstr ""
-
#: order/templates/order/order_base.html:64
-#: order/templates/order/sales_order_base.html:63
-msgid "Order Reference"
+msgid "Purchase Order Details"
msgstr ""
#: order/templates/order/order_base.html:69
#: order/templates/order/sales_order_base.html:68
+msgid "Order Reference"
+msgstr ""
+
+#: order/templates/order/order_base.html:74
+#: order/templates/order/sales_order_base.html:73
msgid "Order Status"
msgstr ""
-#: order/templates/order/order_base.html:80 templates/js/order.html:153
+#: order/templates/order/order_base.html:85 templates/js/order.html:153
msgid "Supplier Reference"
msgstr ""
-#: order/templates/order/order_base.html:99
+#: order/templates/order/order_base.html:104
msgid "Issued"
msgstr ""
-#: order/templates/order/order_base.html:106
+#: order/templates/order/order_base.html:111
#: order/templates/order/purchase_order_detail.html:182
#: order/templates/order/receive_parts.html:22
-#: order/templates/order/sales_order_base.html:105
+#: order/templates/order/sales_order_base.html:110
msgid "Received"
msgstr ""
@@ -1607,14 +1616,14 @@ msgstr ""
#: order/templates/order/purchase_order_detail.html:38
#: order/templates/order/purchase_order_detail.html:118
-#: part/templates/part/category.html:153 part/templates/part/category.html:194
-#: templates/js/stock.html:794
+#: part/templates/part/category.html:161 part/templates/part/category.html:202
+#: templates/js/stock.html:803
msgid "New Location"
msgstr ""
#: order/templates/order/purchase_order_detail.html:39
#: order/templates/order/purchase_order_detail.html:119
-#: stock/templates/stock/location.html:16
+#: stock/templates/stock/location.html:21
msgid "Create new stock location"
msgstr ""
@@ -1649,7 +1658,7 @@ msgid "Select parts to receive against this order"
msgstr ""
#: order/templates/order/receive_parts.html:21
-#: part/templates/part/part_base.html:132 templates/js/part.html:322
+#: part/templates/part/part_base.html:135 templates/js/part.html:388
msgid "On Order"
msgstr ""
@@ -1665,15 +1674,15 @@ msgstr ""
msgid "This SalesOrder has not been fully allocated"
msgstr ""
-#: order/templates/order/sales_order_base.html:42
+#: order/templates/order/sales_order_base.html:47
msgid "Packing List"
msgstr ""
-#: order/templates/order/sales_order_base.html:58
+#: order/templates/order/sales_order_base.html:63
msgid "Sales Order Details"
msgstr ""
-#: order/templates/order/sales_order_base.html:79 templates/js/order.html:228
+#: order/templates/order/sales_order_base.html:84 templates/js/order.html:228
msgid "Customer Reference"
msgstr ""
@@ -1881,12 +1890,12 @@ msgstr ""
msgid "Remove allocation"
msgstr ""
-#: part/bom.py:138 part/templates/part/category.html:50
+#: part/bom.py:138 part/templates/part/category.html:55
#: part/templates/part/detail.html:87
msgid "Default Location"
msgstr ""
-#: part/bom.py:139 part/templates/part/part_base.html:105
+#: part/bom.py:139 part/templates/part/part_base.html:108
msgid "Available Stock"
msgstr ""
@@ -1903,11 +1912,11 @@ msgstr ""
msgid "Error reading BOM file (incorrect row size)"
msgstr ""
-#: part/forms.py:57 stock/forms.py:250
+#: part/forms.py:57 stock/forms.py:254
msgid "File Format"
msgstr ""
-#: part/forms.py:57 stock/forms.py:250
+#: part/forms.py:57 stock/forms.py:254
msgid "Select output file format"
msgstr ""
@@ -1983,11 +1992,11 @@ msgstr ""
msgid "Confirm part creation"
msgstr ""
-#: part/forms.py:247
+#: part/forms.py:248
msgid "Input quantity for price calculation"
msgstr ""
-#: part/forms.py:250
+#: part/forms.py:251
msgid "Select currency for price calculation"
msgstr ""
@@ -2003,222 +2012,226 @@ msgstr ""
msgid "Part Category"
msgstr ""
-#: part/models.py:76 part/templates/part/category.html:13
-#: part/templates/part/category.html:78 templates/stats.html:12
+#: part/models.py:76 part/templates/part/category.html:18
+#: part/templates/part/category.html:83 templates/stats.html:12
msgid "Part Categories"
msgstr ""
-#: part/models.py:293 part/models.py:303
+#: part/models.py:345 part/models.py:355
#, python-brace-format
msgid "Part '{p1}' is used in BOM for '{p2}' (recursive)"
msgstr ""
-#: part/models.py:383
+#: part/models.py:435
msgid "Next available serial numbers are"
msgstr ""
-#: part/models.py:387
+#: part/models.py:439
msgid "Next available serial number is"
msgstr ""
-#: part/models.py:392
+#: part/models.py:444
msgid "Most recent serial number is"
msgstr ""
-#: part/models.py:470
+#: part/models.py:522
msgid "Part must be unique for name, IPN and revision"
msgstr ""
-#: part/models.py:485 part/templates/part/detail.html:19
+#: part/models.py:537 part/templates/part/detail.html:19
msgid "Part name"
msgstr ""
-#: part/models.py:489
+#: part/models.py:541
msgid "Is this part a template part?"
msgstr ""
-#: part/models.py:498
+#: part/models.py:550
msgid "Is this part a variant of another part?"
msgstr ""
-#: part/models.py:500
+#: part/models.py:552
msgid "Part description"
msgstr ""
-#: part/models.py:502
+#: part/models.py:554
msgid "Part keywords to improve visibility in search results"
msgstr ""
-#: part/models.py:507
+#: part/models.py:559
msgid "Part category"
msgstr ""
-#: part/models.py:509
+#: part/models.py:561
msgid "Internal Part Number"
msgstr ""
-#: part/models.py:511
+#: part/models.py:563
msgid "Part revision or version number"
msgstr ""
-#: part/models.py:513
+#: part/models.py:565
msgid "Link to extenal URL"
msgstr ""
-#: part/models.py:525
+#: part/models.py:577
msgid "Where is this item normally stored?"
msgstr ""
-#: part/models.py:569
+#: part/models.py:621
msgid "Default supplier part"
msgstr ""
-#: part/models.py:572
+#: part/models.py:624
msgid "Minimum allowed stock level"
msgstr ""
-#: part/models.py:574
+#: part/models.py:626
msgid "Stock keeping units for this part"
msgstr ""
-#: part/models.py:576
+#: part/models.py:628
msgid "Can this part be built from other parts?"
msgstr ""
-#: part/models.py:578
+#: part/models.py:630
msgid "Can this part be used to build other parts?"
msgstr ""
-#: part/models.py:580
+#: part/models.py:632
msgid "Does this part have tracking for unique items?"
msgstr ""
-#: part/models.py:582
+#: part/models.py:634
msgid "Can this part be purchased from external suppliers?"
msgstr ""
-#: part/models.py:584
+#: part/models.py:636
msgid "Can this part be sold to customers?"
msgstr ""
-#: part/models.py:586
+#: part/models.py:638
msgid "Is this part active?"
msgstr ""
-#: part/models.py:588
+#: part/models.py:640
msgid "Is this a virtual part, such as a software product or license?"
msgstr ""
-#: part/models.py:590
+#: part/models.py:642
msgid "Part notes - supports Markdown formatting"
msgstr ""
-#: part/models.py:592
+#: part/models.py:644
msgid "Stored BOM checksum"
msgstr ""
-#: part/models.py:1300
+#: part/models.py:1353
msgid "Test templates can only be created for trackable parts"
msgstr ""
-#: part/models.py:1317
+#: part/models.py:1370
msgid "Test with this name already exists for this part"
msgstr ""
-#: part/models.py:1336 templates/js/part.html:455 templates/js/stock.html:92
+#: part/models.py:1389 templates/js/part.html:521 templates/js/stock.html:92
msgid "Test Name"
msgstr ""
-#: part/models.py:1337
+#: part/models.py:1390
msgid "Enter a name for the test"
msgstr ""
-#: part/models.py:1342
+#: part/models.py:1395
msgid "Test Description"
msgstr ""
-#: part/models.py:1343
+#: part/models.py:1396
msgid "Enter description for this test"
msgstr ""
-#: part/models.py:1349
+#: part/models.py:1402
msgid "Is this test required to pass?"
msgstr ""
-#: part/models.py:1354 templates/js/part.html:472
+#: part/models.py:1407 templates/js/part.html:538
msgid "Requires Value"
msgstr ""
-#: part/models.py:1355
+#: part/models.py:1408
msgid "Does this test require a value when adding a test result?"
msgstr ""
-#: part/models.py:1360 templates/js/part.html:479
+#: part/models.py:1413 templates/js/part.html:545
msgid "Requires Attachment"
msgstr ""
-#: part/models.py:1361
+#: part/models.py:1414
msgid "Does this test require a file attachment when adding a test result?"
msgstr ""
-#: part/models.py:1394
+#: part/models.py:1447
msgid "Parameter template name must be unique"
msgstr ""
-#: part/models.py:1399
+#: part/models.py:1452
msgid "Parameter Name"
msgstr ""
-#: part/models.py:1401
+#: part/models.py:1454
msgid "Parameter Units"
msgstr ""
-#: part/models.py:1427
+#: part/models.py:1480
msgid "Parent Part"
msgstr ""
-#: part/models.py:1429
+#: part/models.py:1482
msgid "Parameter Template"
msgstr ""
-#: part/models.py:1431
+#: part/models.py:1484
msgid "Parameter Value"
msgstr ""
-#: part/models.py:1467
+#: part/models.py:1521
msgid "Select parent part"
msgstr ""
-#: part/models.py:1475
+#: part/models.py:1529
msgid "Select part to be used in BOM"
msgstr ""
-#: part/models.py:1481
+#: part/models.py:1535
msgid "BOM quantity for this BOM item"
msgstr ""
-#: part/models.py:1484
+#: part/models.py:1537
+msgid "This BOM item is optional"
+msgstr ""
+
+#: part/models.py:1540
msgid "Estimated build wastage quantity (absolute or percentage)"
msgstr ""
-#: part/models.py:1487
+#: part/models.py:1543
msgid "BOM item reference"
msgstr ""
-#: part/models.py:1490
+#: part/models.py:1546
msgid "BOM item notes"
msgstr ""
-#: part/models.py:1492
+#: part/models.py:1548
msgid "BOM line checksum"
msgstr ""
-#: part/models.py:1556 part/views.py:1310 part/views.py:1362
-#: stock/models.py:229
+#: part/models.py:1612 part/views.py:1310 part/views.py:1362
+#: stock/models.py:231
msgid "Quantity must be integer value for trackable parts"
msgstr ""
-#: part/models.py:1565
+#: part/models.py:1621
msgid "BOM Item"
msgstr ""
@@ -2237,14 +2250,14 @@ msgstr ""
#: part/templates/part/allocation.html:45
#: stock/templates/stock/item_base.html:8
#: stock/templates/stock/item_base.html:58
-#: stock/templates/stock/item_base.html:226
+#: stock/templates/stock/item_base.html:238
#: stock/templates/stock/stock_adjust.html:16 templates/js/build.html:112
-#: templates/js/stock.html:651
+#: templates/js/stock.html:660 templates/js/stock.html:896
msgid "Stock Item"
msgstr ""
#: part/templates/part/allocation.html:20
-#: stock/templates/stock/item_base.html:180
+#: stock/templates/stock/item_base.html:192
msgid "Build Order"
msgstr ""
@@ -2360,91 +2373,95 @@ msgstr ""
msgid "Each part must already exist in the database"
msgstr ""
-#: part/templates/part/category.html:14
+#: part/templates/part/category.html:19
msgid "All parts"
msgstr ""
-#: part/templates/part/category.html:18 part/views.py:1935
+#: part/templates/part/category.html:23 part/views.py:1976
msgid "Create new part category"
msgstr ""
-#: part/templates/part/category.html:22
+#: part/templates/part/category.html:27
msgid "Edit part category"
msgstr ""
-#: part/templates/part/category.html:25
+#: part/templates/part/category.html:30
msgid "Delete part category"
msgstr ""
-#: part/templates/part/category.html:34 part/templates/part/category.html:73
+#: part/templates/part/category.html:39 part/templates/part/category.html:78
msgid "Category Details"
msgstr ""
-#: part/templates/part/category.html:39
+#: part/templates/part/category.html:44
msgid "Category Path"
msgstr ""
-#: part/templates/part/category.html:44
+#: part/templates/part/category.html:49
msgid "Category Description"
msgstr ""
-#: part/templates/part/category.html:57 part/templates/part/detail.html:64
+#: part/templates/part/category.html:62 part/templates/part/detail.html:64
msgid "Keywords"
msgstr ""
-#: part/templates/part/category.html:63
+#: part/templates/part/category.html:68
msgid "Subcategories"
msgstr ""
-#: part/templates/part/category.html:68
+#: part/templates/part/category.html:73
msgid "Parts (Including subcategories)"
msgstr ""
-#: part/templates/part/category.html:101
+#: part/templates/part/category.html:106
msgid "Export Part Data"
msgstr ""
-#: part/templates/part/category.html:102 part/views.py:491
+#: part/templates/part/category.html:107 part/views.py:491
msgid "Create new part"
msgstr ""
-#: part/templates/part/category.html:106
+#: part/templates/part/category.html:111
msgid "Set category"
msgstr ""
-#: part/templates/part/category.html:106
+#: part/templates/part/category.html:111
msgid "Set Category"
msgstr ""
-#: part/templates/part/category.html:108
+#: part/templates/part/category.html:113
msgid "Export Data"
msgstr ""
-#: part/templates/part/category.html:154
+#: part/templates/part/category.html:162
msgid "Create new location"
msgstr ""
-#: part/templates/part/category.html:159 part/templates/part/category.html:188
+#: part/templates/part/category.html:167 part/templates/part/category.html:196
msgid "New Category"
msgstr ""
-#: part/templates/part/category.html:160
+#: part/templates/part/category.html:168
msgid "Create new category"
msgstr ""
-#: part/templates/part/category.html:189
+#: part/templates/part/category.html:197
msgid "Create new Part Category"
msgstr ""
-#: part/templates/part/category.html:195 stock/views.py:1213
+#: part/templates/part/category.html:203 stock/views.py:1314
msgid "Create new Stock Location"
msgstr ""
+#: part/templates/part/category_tabs.html:9
+msgid "Parametric Table"
+msgstr ""
+
#: part/templates/part/detail.html:9
msgid "Part Details"
msgstr ""
-#: part/templates/part/detail.html:25 part/templates/part/part_base.html:82
+#: part/templates/part/detail.html:25 part/templates/part/part_base.html:85
#: templates/js/part.html:112
msgid "IPN"
msgstr ""
@@ -2466,7 +2483,7 @@ msgid "Variant Of"
msgstr ""
#: part/templates/part/detail.html:70 part/templates/part/set_category.html:15
-#: templates/js/part.html:293
+#: templates/js/part.html:359
msgid "Category"
msgstr ""
@@ -2506,8 +2523,8 @@ msgstr ""
msgid "Part is not a virtual part"
msgstr ""
-#: part/templates/part/detail.html:145 stock/forms.py:244
-#: templates/js/table_filters.html:183
+#: part/templates/part/detail.html:145 stock/forms.py:248
+#: templates/js/table_filters.html:188
msgid "Template"
msgstr ""
@@ -2519,7 +2536,7 @@ msgstr ""
msgid "Part is not a template part"
msgstr ""
-#: part/templates/part/detail.html:154 templates/js/table_filters.html:195
+#: part/templates/part/detail.html:154 templates/js/table_filters.html:200
msgid "Assembly"
msgstr ""
@@ -2531,7 +2548,7 @@ msgstr ""
msgid "Part cannot be assembled from other parts"
msgstr ""
-#: part/templates/part/detail.html:163 templates/js/table_filters.html:199
+#: part/templates/part/detail.html:163 templates/js/table_filters.html:204
msgid "Component"
msgstr ""
@@ -2543,7 +2560,7 @@ msgstr ""
msgid "Part cannot be used in assemblies"
msgstr ""
-#: part/templates/part/detail.html:172 templates/js/table_filters.html:211
+#: part/templates/part/detail.html:172 templates/js/table_filters.html:216
msgid "Trackable"
msgstr ""
@@ -2563,7 +2580,7 @@ msgstr ""
msgid "Part can be purchased from external suppliers"
msgstr ""
-#: part/templates/part/detail.html:190 templates/js/table_filters.html:207
+#: part/templates/part/detail.html:190 templates/js/table_filters.html:212
msgid "Salable"
msgstr ""
@@ -2575,7 +2592,7 @@ msgstr ""
msgid "Part cannot be sold to customers"
msgstr ""
-#: part/templates/part/detail.html:199 templates/js/table_filters.html:178
+#: part/templates/part/detail.html:199 templates/js/table_filters.html:183
msgid "Active"
msgstr ""
@@ -2607,7 +2624,7 @@ msgstr ""
msgid "New Parameter"
msgstr ""
-#: part/templates/part/params.html:21 stock/models.py:1340
+#: part/templates/part/params.html:21 stock/models.py:1391
#: templates/js/stock.html:112
msgid "Value"
msgstr ""
@@ -2636,70 +2653,70 @@ msgstr ""
msgid "This part is a variant of"
msgstr ""
-#: part/templates/part/part_base.html:33 templates/js/company.html:153
-#: templates/js/part.html:270
+#: part/templates/part/part_base.html:36 templates/js/company.html:153
+#: templates/js/part.html:336
msgid "Inactive"
msgstr ""
-#: part/templates/part/part_base.html:40
+#: part/templates/part/part_base.html:43
msgid "Star this part"
msgstr ""
-#: part/templates/part/part_base.html:46
-#: stock/templates/stock/item_base.html:78
-#: stock/templates/stock/location.html:22
-msgid "Barcode actions"
-msgstr ""
-
-#: part/templates/part/part_base.html:48
-#: stock/templates/stock/item_base.html:80
-#: stock/templates/stock/location.html:24
-msgid "Show QR Code"
-msgstr ""
-
#: part/templates/part/part_base.html:49
#: stock/templates/stock/item_base.html:81
-#: stock/templates/stock/location.html:25
+#: stock/templates/stock/location.html:27
+msgid "Barcode actions"
+msgstr ""
+
+#: part/templates/part/part_base.html:51
+#: stock/templates/stock/item_base.html:83
+#: stock/templates/stock/location.html:29
+msgid "Show QR Code"
+msgstr ""
+
+#: part/templates/part/part_base.html:52
+#: stock/templates/stock/item_base.html:84
+#: stock/templates/stock/location.html:30
msgid "Print Label"
msgstr ""
-#: part/templates/part/part_base.html:53
+#: part/templates/part/part_base.html:56
msgid "Show pricing information"
msgstr ""
-#: part/templates/part/part_base.html:67
+#: part/templates/part/part_base.html:70
msgid "Part actions"
msgstr ""
-#: part/templates/part/part_base.html:69
+#: part/templates/part/part_base.html:72
msgid "Duplicate part"
msgstr ""
-#: part/templates/part/part_base.html:70
+#: part/templates/part/part_base.html:73
msgid "Edit part"
msgstr ""
-#: part/templates/part/part_base.html:72
+#: part/templates/part/part_base.html:75
msgid "Delete part"
msgstr ""
-#: part/templates/part/part_base.html:111 templates/js/table_filters.html:65
+#: part/templates/part/part_base.html:114 templates/js/table_filters.html:65
msgid "In Stock"
msgstr ""
-#: part/templates/part/part_base.html:118
+#: part/templates/part/part_base.html:121
msgid "Allocated to Build Orders"
msgstr ""
-#: part/templates/part/part_base.html:125
+#: part/templates/part/part_base.html:128
msgid "Allocated to Sales Orders"
msgstr ""
-#: part/templates/part/part_base.html:147
+#: part/templates/part/part_base.html:150
msgid "Can Build"
msgstr ""
-#: part/templates/part/part_base.html:153
+#: part/templates/part/part_base.html:156
msgid "Underway"
msgstr ""
@@ -2743,8 +2760,8 @@ msgstr ""
msgid "Part Stock"
msgstr ""
-#: part/templates/part/stock_count.html:7 templates/js/bom.html:193
-#: templates/js/part.html:330
+#: part/templates/part/stock_count.html:7 templates/js/bom.html:197
+#: templates/js/part.html:396
msgid "No Stock"
msgstr ""
@@ -2784,7 +2801,7 @@ msgstr ""
msgid "Used In"
msgstr ""
-#: part/templates/part/tabs.html:58 stock/templates/stock/item_base.html:270
+#: part/templates/part/tabs.html:58 stock/templates/stock/item_base.html:282
msgid "Tests"
msgstr ""
@@ -2961,27 +2978,27 @@ msgstr ""
msgid "Delete Part Parameter"
msgstr ""
-#: part/views.py:1886
+#: part/views.py:1927
msgid "Edit Part Category"
msgstr ""
-#: part/views.py:1921
+#: part/views.py:1962
msgid "Delete Part Category"
msgstr ""
-#: part/views.py:1927
+#: part/views.py:1968
msgid "Part category was deleted"
msgstr ""
-#: part/views.py:1986
+#: part/views.py:2027
msgid "Create BOM item"
msgstr ""
-#: part/views.py:2052
+#: part/views.py:2093
msgid "Edit BOM item"
msgstr ""
-#: part/views.py:2100
+#: part/views.py:2141
msgid "Confim BOM item deletion"
msgstr ""
@@ -3013,267 +3030,295 @@ msgstr ""
msgid "Asset file description"
msgstr ""
-#: stock/forms.py:187
+#: stock/forms.py:191
msgid "Label"
msgstr ""
-#: stock/forms.py:188 stock/forms.py:244
+#: stock/forms.py:192 stock/forms.py:248
msgid "Select test report template"
msgstr ""
-#: stock/forms.py:252
+#: stock/forms.py:256
msgid "Include stock items in sub locations"
msgstr ""
-#: stock/forms.py:279
+#: stock/forms.py:291
+msgid "Stock item to install"
+msgstr ""
+
+#: stock/forms.py:298
+msgid "Stock quantity to assign"
+msgstr ""
+
+#: stock/forms.py:326
+msgid "Must not exceed available quantity"
+msgstr ""
+
+#: stock/forms.py:336
msgid "Destination location for uninstalled items"
msgstr ""
-#: stock/forms.py:281
+#: stock/forms.py:338
msgid "Add transaction note (optional)"
msgstr ""
-#: stock/forms.py:283
+#: stock/forms.py:340
msgid "Confirm uninstall"
msgstr ""
-#: stock/forms.py:283
+#: stock/forms.py:340
msgid "Confirm removal of installed stock items"
msgstr ""
-#: stock/forms.py:307
+#: stock/forms.py:364
msgid "Destination"
msgstr ""
-#: stock/forms.py:307
+#: stock/forms.py:364
msgid "Destination stock location"
msgstr ""
-#: stock/forms.py:309
+#: stock/forms.py:366
msgid "Add note (required)"
msgstr ""
-#: stock/forms.py:313 stock/views.py:795 stock/views.py:992
+#: stock/forms.py:370 stock/views.py:895 stock/views.py:1092
msgid "Confirm stock adjustment"
msgstr ""
-#: stock/forms.py:313
+#: stock/forms.py:370
msgid "Confirm movement of stock items"
msgstr ""
-#: stock/forms.py:315
+#: stock/forms.py:372
msgid "Set Default Location"
msgstr ""
-#: stock/forms.py:315
+#: stock/forms.py:372
msgid "Set the destination as the default location for selected parts"
msgstr ""
-#: stock/models.py:210
+#: stock/models.py:212
msgid "StockItem with this serial number already exists"
msgstr ""
-#: stock/models.py:246
+#: stock/models.py:248
#, python-brace-format
msgid "Part type ('{pf}') must be {pe}"
msgstr ""
-#: stock/models.py:256 stock/models.py:265
+#: stock/models.py:258 stock/models.py:267
msgid "Quantity must be 1 for item with a serial number"
msgstr ""
-#: stock/models.py:257
+#: stock/models.py:259
msgid "Serial number cannot be set if quantity greater than 1"
msgstr ""
-#: stock/models.py:278
+#: stock/models.py:281
msgid "Item cannot belong to itself"
msgstr ""
-#: stock/models.py:311
+#: stock/models.py:287
+msgid "Item must have a build reference if is_building=True"
+msgstr ""
+
+#: stock/models.py:294
+msgid "Build reference does not point to the same part object"
+msgstr ""
+
+#: stock/models.py:327
msgid "Parent Stock Item"
msgstr ""
-#: stock/models.py:320
+#: stock/models.py:336
msgid "Base part"
msgstr ""
-#: stock/models.py:329
+#: stock/models.py:345
msgid "Select a matching supplier part for this stock item"
msgstr ""
-#: stock/models.py:334 stock/templates/stock/stock_app_base.html:7
+#: stock/models.py:350 stock/templates/stock/stock_app_base.html:7
msgid "Stock Location"
msgstr ""
-#: stock/models.py:337
+#: stock/models.py:353
msgid "Where is this stock item located?"
msgstr ""
-#: stock/models.py:342
+#: stock/models.py:358 stock/templates/stock/item_base.html:177
msgid "Installed In"
msgstr ""
-#: stock/models.py:345
+#: stock/models.py:361
msgid "Is this item installed in another item?"
msgstr ""
-#: stock/models.py:361
+#: stock/models.py:377
msgid "Serial number for this item"
msgstr ""
-#: stock/models.py:373
+#: stock/models.py:389
msgid "Batch code for this stock item"
msgstr ""
-#: stock/models.py:377
+#: stock/models.py:393
msgid "Stock Quantity"
msgstr ""
-#: stock/models.py:386
+#: stock/models.py:402
msgid "Source Build"
msgstr ""
-#: stock/models.py:388
+#: stock/models.py:404
msgid "Build for this stock item"
msgstr ""
-#: stock/models.py:395
+#: stock/models.py:415
msgid "Source Purchase Order"
msgstr ""
-#: stock/models.py:398
+#: stock/models.py:418
msgid "Purchase order for this stock item"
msgstr ""
-#: stock/models.py:404
+#: stock/models.py:424
msgid "Destination Sales Order"
msgstr ""
-#: stock/models.py:411
+#: stock/models.py:431
msgid "Destination Build Order"
msgstr ""
-#: stock/models.py:424
+#: stock/models.py:444
msgid "Delete this Stock Item when stock is depleted"
msgstr ""
-#: stock/models.py:434 stock/templates/stock/item_notes.html:14
+#: stock/models.py:454 stock/templates/stock/item_notes.html:14
#: stock/templates/stock/item_notes.html:30
msgid "Stock Item Notes"
msgstr ""
-#: stock/models.py:485
+#: stock/models.py:505
msgid "Assigned to Customer"
msgstr ""
-#: stock/models.py:487
+#: stock/models.py:507
msgid "Manually assigned to customer"
msgstr ""
-#: stock/models.py:500
+#: stock/models.py:520
msgid "Returned from customer"
msgstr ""
-#: stock/models.py:502
+#: stock/models.py:522
msgid "Returned to location"
msgstr ""
-#: stock/models.py:626
-msgid "Installed in stock item"
+#: stock/models.py:650
+msgid "Installed into stock item"
msgstr ""
-#: stock/models.py:655
+#: stock/models.py:658
+msgid "Installed stock item"
+msgstr ""
+
+#: stock/models.py:682
+msgid "Uninstalled stock item"
+msgstr ""
+
+#: stock/models.py:701
msgid "Uninstalled into location"
msgstr ""
-#: stock/models.py:745
+#: stock/models.py:796
msgid "Part is not set as trackable"
msgstr ""
-#: stock/models.py:751
+#: stock/models.py:802
msgid "Quantity must be integer"
msgstr ""
-#: stock/models.py:757
+#: stock/models.py:808
#, python-brace-format
msgid "Quantity must not exceed available stock quantity ({n})"
msgstr ""
-#: stock/models.py:760
+#: stock/models.py:811
msgid "Serial numbers must be a list of integers"
msgstr ""
-#: stock/models.py:763
+#: stock/models.py:814
msgid "Quantity does not match serial numbers"
msgstr ""
-#: stock/models.py:773
+#: stock/models.py:824
msgid "Serial numbers already exist: "
msgstr ""
-#: stock/models.py:798
+#: stock/models.py:849
msgid "Add serial number"
msgstr ""
-#: stock/models.py:801
+#: stock/models.py:852
#, python-brace-format
msgid "Serialized {n} items"
msgstr ""
-#: stock/models.py:912
+#: stock/models.py:963
msgid "StockItem cannot be moved as it is not in stock"
msgstr ""
-#: stock/models.py:1241
+#: stock/models.py:1292
msgid "Tracking entry title"
msgstr ""
-#: stock/models.py:1243
+#: stock/models.py:1294
msgid "Entry notes"
msgstr ""
-#: stock/models.py:1245
+#: stock/models.py:1296
msgid "Link to external page for further information"
msgstr ""
-#: stock/models.py:1305
+#: stock/models.py:1356
msgid "Value must be provided for this test"
msgstr ""
-#: stock/models.py:1311
+#: stock/models.py:1362
msgid "Attachment must be uploaded for this test"
msgstr ""
-#: stock/models.py:1328
+#: stock/models.py:1379
msgid "Test"
msgstr ""
-#: stock/models.py:1329
+#: stock/models.py:1380
msgid "Test name"
msgstr ""
-#: stock/models.py:1334
+#: stock/models.py:1385
msgid "Result"
msgstr ""
-#: stock/models.py:1335 templates/js/table_filters.html:111
+#: stock/models.py:1386 templates/js/table_filters.html:111
msgid "Test result"
msgstr ""
-#: stock/models.py:1341
+#: stock/models.py:1392
msgid "Test output value"
msgstr ""
-#: stock/models.py:1347
+#: stock/models.py:1398
msgid "Attachment"
msgstr ""
-#: stock/models.py:1348
+#: stock/models.py:1399
msgid "Test result attachment"
msgstr ""
-#: stock/models.py:1354
+#: stock/models.py:1405
msgid "Test notes"
msgstr ""
@@ -3312,102 +3357,106 @@ msgid ""
"This stock item will be automatically deleted when all stock is depleted."
msgstr ""
-#: stock/templates/stock/item_base.html:83 templates/js/barcode.html:283
+#: stock/templates/stock/item_base.html:86 templates/js/barcode.html:283
#: templates/js/barcode.html:288
msgid "Unlink Barcode"
msgstr ""
-#: stock/templates/stock/item_base.html:85
+#: stock/templates/stock/item_base.html:88
msgid "Link Barcode"
msgstr ""
-#: stock/templates/stock/item_base.html:91
+#: stock/templates/stock/item_base.html:94
msgid "Stock adjustment actions"
msgstr ""
-#: stock/templates/stock/item_base.html:95
-#: stock/templates/stock/location.html:33 templates/stock_table.html:14
+#: stock/templates/stock/item_base.html:98
+#: stock/templates/stock/location.html:38 templates/stock_table.html:15
msgid "Count stock"
msgstr ""
-#: stock/templates/stock/item_base.html:96 templates/stock_table.html:12
+#: stock/templates/stock/item_base.html:99 templates/stock_table.html:13
msgid "Add stock"
msgstr ""
-#: stock/templates/stock/item_base.html:97 templates/stock_table.html:13
+#: stock/templates/stock/item_base.html:100 templates/stock_table.html:14
msgid "Remove stock"
msgstr ""
-#: stock/templates/stock/item_base.html:99
+#: stock/templates/stock/item_base.html:102
msgid "Transfer stock"
msgstr ""
-#: stock/templates/stock/item_base.html:101
+#: stock/templates/stock/item_base.html:104
msgid "Serialize stock"
msgstr ""
-#: stock/templates/stock/item_base.html:105
+#: stock/templates/stock/item_base.html:108
msgid "Assign to customer"
msgstr ""
-#: stock/templates/stock/item_base.html:108
+#: stock/templates/stock/item_base.html:111
msgid "Return to stock"
msgstr ""
-#: stock/templates/stock/item_base.html:114
-#: stock/templates/stock/location.html:30
+#: stock/templates/stock/item_base.html:115 templates/js/stock.html:933
+msgid "Uninstall stock item"
+msgstr ""
+
+#: stock/templates/stock/item_base.html:115
+msgid "Uninstall"
+msgstr ""
+
+#: stock/templates/stock/item_base.html:122
+#: stock/templates/stock/location.html:35
msgid "Stock actions"
msgstr ""
-#: stock/templates/stock/item_base.html:118
+#: stock/templates/stock/item_base.html:126
msgid "Convert to variant"
msgstr ""
-#: stock/templates/stock/item_base.html:120
+#: stock/templates/stock/item_base.html:128
msgid "Duplicate stock item"
msgstr ""
-#: stock/templates/stock/item_base.html:121
+#: stock/templates/stock/item_base.html:129
msgid "Edit stock item"
msgstr ""
-#: stock/templates/stock/item_base.html:123
+#: stock/templates/stock/item_base.html:131
msgid "Delete stock item"
msgstr ""
-#: stock/templates/stock/item_base.html:127
+#: stock/templates/stock/item_base.html:135
msgid "Generate test report"
msgstr ""
-#: stock/templates/stock/item_base.html:135
+#: stock/templates/stock/item_base.html:143
msgid "Stock Item Details"
msgstr ""
-#: stock/templates/stock/item_base.html:168
-msgid "Belongs To"
-msgstr ""
-
-#: stock/templates/stock/item_base.html:190
+#: stock/templates/stock/item_base.html:202
msgid "No location set"
msgstr ""
-#: stock/templates/stock/item_base.html:197
+#: stock/templates/stock/item_base.html:209
msgid "Unique Identifier"
msgstr ""
-#: stock/templates/stock/item_base.html:225
+#: stock/templates/stock/item_base.html:237
msgid "Parent Item"
msgstr ""
-#: stock/templates/stock/item_base.html:250
+#: stock/templates/stock/item_base.html:262
msgid "Last Updated"
msgstr ""
-#: stock/templates/stock/item_base.html:255
+#: stock/templates/stock/item_base.html:267
msgid "Last Stocktake"
msgstr ""
-#: stock/templates/stock/item_base.html:259
+#: stock/templates/stock/item_base.html:271
msgid "No stocktake performed"
msgstr ""
@@ -3423,29 +3472,32 @@ msgstr ""
msgid "Are you sure you want to delete this stock item?"
msgstr ""
+#: stock/templates/stock/item_install.html:7
+msgid "Install another StockItem into this item."
+msgstr ""
+
+#: stock/templates/stock/item_install.html:10
+msgid "Stock items can only be installed if they meet the following criteria"
+msgstr ""
+
+#: stock/templates/stock/item_install.html:13
+msgid "The StockItem links to a Part which is in the BOM for this StockItem"
+msgstr ""
+
+#: stock/templates/stock/item_install.html:14
+msgid "The StockItem is currently in stock"
+msgstr ""
+
#: stock/templates/stock/item_installed.html:10
msgid "Installed Stock Items"
msgstr ""
-#: stock/templates/stock/item_installed.html:18
-msgid "Uninstall selected stock items"
+#: stock/templates/stock/item_serialize.html:5
+msgid "Create serialized items from this stock item."
msgstr ""
-#: stock/templates/stock/item_installed.html:18
-msgid "Uninstall"
-msgstr ""
-
-#: stock/templates/stock/item_installed.html:35
-msgid "No stock items installed"
-msgstr ""
-
-#: stock/templates/stock/item_installed.html:48 templates/js/part.html:209
-#: templates/js/stock.html:409
-msgid "Select"
-msgstr ""
-
-#: stock/templates/stock/item_installed.html:131
-msgid "Uninstall item"
+#: stock/templates/stock/item_serialize.html:7
+msgid "Select quantity to serialize, and unique serial numbers."
msgstr ""
#: stock/templates/stock/item_tests.html:10 stock/templates/stock/tabs.html:13
@@ -3464,54 +3516,54 @@ msgstr ""
msgid "Test Report"
msgstr ""
-#: stock/templates/stock/location.html:13
+#: stock/templates/stock/location.html:18
msgid "All stock items"
msgstr ""
-#: stock/templates/stock/location.html:26
+#: stock/templates/stock/location.html:31
msgid "Check-in Items"
msgstr ""
-#: stock/templates/stock/location.html:37
+#: stock/templates/stock/location.html:42
msgid "Location actions"
msgstr ""
-#: stock/templates/stock/location.html:39
+#: stock/templates/stock/location.html:44
msgid "Edit location"
msgstr ""
-#: stock/templates/stock/location.html:40
+#: stock/templates/stock/location.html:45
msgid "Delete location"
msgstr ""
-#: stock/templates/stock/location.html:48
+#: stock/templates/stock/location.html:53
msgid "Location Details"
msgstr ""
-#: stock/templates/stock/location.html:53
+#: stock/templates/stock/location.html:58
msgid "Location Path"
msgstr ""
-#: stock/templates/stock/location.html:58
+#: stock/templates/stock/location.html:63
msgid "Location Description"
msgstr ""
-#: stock/templates/stock/location.html:63
+#: stock/templates/stock/location.html:68
msgid "Sublocations"
msgstr ""
-#: stock/templates/stock/location.html:68
-#: stock/templates/stock/location.html:83
+#: stock/templates/stock/location.html:73
+#: stock/templates/stock/location.html:88
#: templates/InvenTree/search_stock_items.html:6 templates/stats.html:21
#: templates/stats.html:30
msgid "Stock Items"
msgstr ""
-#: stock/templates/stock/location.html:73
+#: stock/templates/stock/location.html:78
msgid "Stock Details"
msgstr ""
-#: stock/templates/stock/location.html:78
+#: stock/templates/stock/location.html:83
#: templates/InvenTree/search_stock_location.html:6 templates/stats.html:25
msgid "Stock Locations"
msgstr ""
@@ -3524,7 +3576,7 @@ msgstr ""
msgid "The following stock items will be uninstalled"
msgstr ""
-#: stock/templates/stock/stockitem_convert.html:7 stock/views.py:1186
+#: stock/templates/stock/stockitem_convert.html:7 stock/views.py:1287
msgid "Convert Stock Item"
msgstr ""
@@ -3636,130 +3688,134 @@ msgstr ""
msgid "Stock Item QR Code"
msgstr ""
-#: stock/views.py:699
+#: stock/views.py:700
+msgid "Install Stock Item"
+msgstr ""
+
+#: stock/views.py:799
msgid "Uninstall Stock Items"
msgstr ""
-#: stock/views.py:806
+#: stock/views.py:906
msgid "Uninstalled stock items"
msgstr ""
-#: stock/views.py:831
+#: stock/views.py:931
msgid "Adjust Stock"
msgstr ""
-#: stock/views.py:940
+#: stock/views.py:1040
msgid "Move Stock Items"
msgstr ""
-#: stock/views.py:941
+#: stock/views.py:1041
msgid "Count Stock Items"
msgstr ""
-#: stock/views.py:942
+#: stock/views.py:1042
msgid "Remove From Stock"
msgstr ""
-#: stock/views.py:943
+#: stock/views.py:1043
msgid "Add Stock Items"
msgstr ""
-#: stock/views.py:944
+#: stock/views.py:1044
msgid "Delete Stock Items"
msgstr ""
-#: stock/views.py:972
+#: stock/views.py:1072
msgid "Must enter integer value"
msgstr ""
-#: stock/views.py:977
+#: stock/views.py:1077
msgid "Quantity must be positive"
msgstr ""
-#: stock/views.py:984
+#: stock/views.py:1084
#, python-brace-format
msgid "Quantity must not exceed {x}"
msgstr ""
-#: stock/views.py:1063
+#: stock/views.py:1163
#, python-brace-format
msgid "Added stock to {n} items"
msgstr ""
-#: stock/views.py:1078
+#: stock/views.py:1178
#, python-brace-format
msgid "Removed stock from {n} items"
msgstr ""
-#: stock/views.py:1091
+#: stock/views.py:1191
#, python-brace-format
msgid "Counted stock for {n} items"
msgstr ""
-#: stock/views.py:1119
+#: stock/views.py:1219
msgid "No items were moved"
msgstr ""
-#: stock/views.py:1122
+#: stock/views.py:1222
#, python-brace-format
msgid "Moved {n} items to {dest}"
msgstr ""
-#: stock/views.py:1141
+#: stock/views.py:1241
#, python-brace-format
msgid "Deleted {n} stock items"
msgstr ""
-#: stock/views.py:1153
+#: stock/views.py:1253
msgid "Edit Stock Item"
msgstr ""
-#: stock/views.py:1234
+#: stock/views.py:1335
msgid "Serialize Stock"
msgstr ""
-#: stock/views.py:1426
+#: stock/views.py:1527
msgid "Duplicate Stock Item"
msgstr ""
-#: stock/views.py:1492
+#: stock/views.py:1593
msgid "Invalid quantity"
msgstr ""
-#: stock/views.py:1495
+#: stock/views.py:1596
msgid "Quantity cannot be less than zero"
msgstr ""
-#: stock/views.py:1499
+#: stock/views.py:1600
msgid "Invalid part selection"
msgstr ""
-#: stock/views.py:1548
+#: stock/views.py:1649
#, python-brace-format
msgid "Created {n} new stock items"
msgstr ""
-#: stock/views.py:1567 stock/views.py:1583
+#: stock/views.py:1668 stock/views.py:1684
msgid "Created new stock item"
msgstr ""
-#: stock/views.py:1602
+#: stock/views.py:1703
msgid "Delete Stock Location"
msgstr ""
-#: stock/views.py:1615
+#: stock/views.py:1716
msgid "Delete Stock Item"
msgstr ""
-#: stock/views.py:1626
+#: stock/views.py:1727
msgid "Delete Stock Tracking Entry"
msgstr ""
-#: stock/views.py:1643
+#: stock/views.py:1744
msgid "Edit Stock Tracking Entry"
msgstr ""
-#: stock/views.py:1652
+#: stock/views.py:1753
msgid "Add Stock Tracking Entry"
msgstr ""
@@ -3787,15 +3843,19 @@ msgstr ""
msgid "Search Results"
msgstr ""
-#: templates/InvenTree/search.html:22
-msgid "No results found"
+#: templates/InvenTree/search.html:24
+msgid "No results found for "
msgstr ""
-#: templates/InvenTree/search.html:181 templates/js/stock.html:521
+#: templates/InvenTree/search.html:42
+msgid "Enter a search query"
+msgstr ""
+
+#: templates/InvenTree/search.html:191 templates/js/stock.html:527
msgid "Shipped to customer"
msgstr ""
-#: templates/InvenTree/search.html:184 templates/js/stock.html:528
+#: templates/InvenTree/search.html:194 templates/js/stock.html:537
msgid "No stock location set"
msgstr ""
@@ -3974,31 +4034,35 @@ msgstr ""
msgid "Open subassembly"
msgstr ""
-#: templates/js/bom.html:184 templates/js/build.html:119
+#: templates/js/bom.html:173
+msgid "Optional"
+msgstr ""
+
+#: templates/js/bom.html:188 templates/js/build.html:119
msgid "Available"
msgstr ""
-#: templates/js/bom.html:209
+#: templates/js/bom.html:213
msgid "No pricing available"
msgstr ""
-#: templates/js/bom.html:228
+#: templates/js/bom.html:232
msgid "Actions"
msgstr ""
-#: templates/js/bom.html:236
+#: templates/js/bom.html:240
msgid "Validate BOM Item"
msgstr ""
-#: templates/js/bom.html:238
+#: templates/js/bom.html:242
msgid "This line has been validated"
msgstr ""
-#: templates/js/bom.html:240
+#: templates/js/bom.html:244
msgid "Edit BOM Item"
msgstr ""
-#: templates/js/bom.html:242
+#: templates/js/bom.html:246
msgid "Delete BOM Item"
msgstr ""
@@ -4026,11 +4090,11 @@ msgstr ""
msgid "No supplier parts found"
msgstr ""
-#: templates/js/company.html:145 templates/js/part.html:248
+#: templates/js/company.html:145 templates/js/part.html:314
msgid "Template part"
msgstr ""
-#: templates/js/company.html:149 templates/js/part.html:252
+#: templates/js/company.html:149 templates/js/part.html:318
msgid "Assembled part"
msgstr ""
@@ -4042,7 +4106,7 @@ msgstr ""
msgid "No purchase orders found"
msgstr ""
-#: templates/js/order.html:172 templates/js/stock.html:633
+#: templates/js/order.html:172 templates/js/stock.html:642
msgid "Date"
msgstr ""
@@ -4058,51 +4122,56 @@ msgstr ""
msgid "No variants found"
msgstr ""
-#: templates/js/part.html:256
-msgid "Starred part"
-msgstr ""
-
-#: templates/js/part.html:260
-msgid "Salable part"
-msgstr ""
-
-#: templates/js/part.html:299
-msgid "No category"
-msgstr ""
-
-#: templates/js/part.html:317 templates/js/table_filters.html:191
-msgid "Low stock"
-msgstr ""
-
-#: templates/js/part.html:326
-msgid "Building"
-msgstr ""
-
-#: templates/js/part.html:345
+#: templates/js/part.html:223 templates/js/part.html:411
msgid "No parts found"
msgstr ""
-#: templates/js/part.html:405
+#: templates/js/part.html:275 templates/js/stock.html:409
+#: templates/js/stock.html:965
+msgid "Select"
+msgstr ""
+
+#: templates/js/part.html:322
+msgid "Starred part"
+msgstr ""
+
+#: templates/js/part.html:326
+msgid "Salable part"
+msgstr ""
+
+#: templates/js/part.html:365
+msgid "No category"
+msgstr ""
+
+#: templates/js/part.html:383 templates/js/table_filters.html:196
+msgid "Low stock"
+msgstr ""
+
+#: templates/js/part.html:392
+msgid "Building"
+msgstr ""
+
+#: templates/js/part.html:471
msgid "YES"
msgstr ""
-#: templates/js/part.html:407
+#: templates/js/part.html:473
msgid "NO"
msgstr ""
-#: templates/js/part.html:441
+#: templates/js/part.html:507
msgid "No test templates matching query"
msgstr ""
-#: templates/js/part.html:492 templates/js/stock.html:63
+#: templates/js/part.html:558 templates/js/stock.html:63
msgid "Edit test result"
msgstr ""
-#: templates/js/part.html:493 templates/js/stock.html:64
+#: templates/js/part.html:559 templates/js/stock.html:64
msgid "Delete test result"
msgstr ""
-#: templates/js/part.html:499
+#: templates/js/part.html:565
msgid "This test is defined for a parent part"
msgstr ""
@@ -4146,42 +4215,62 @@ msgstr ""
msgid "Stock item has been assigned to customer"
msgstr ""
-#: templates/js/stock.html:474
+#: templates/js/stock.html:475
msgid "Stock item was assigned to a build order"
msgstr ""
-#: templates/js/stock.html:476
+#: templates/js/stock.html:477
msgid "Stock item was assigned to a sales order"
msgstr ""
-#: templates/js/stock.html:483
+#: templates/js/stock.html:482
+msgid "Stock item has been installed in another item"
+msgstr ""
+
+#: templates/js/stock.html:489
msgid "Stock item has been rejected"
msgstr ""
-#: templates/js/stock.html:487
+#: templates/js/stock.html:493
msgid "Stock item is lost"
msgstr ""
-#: templates/js/stock.html:491 templates/js/table_filters.html:60
+#: templates/js/stock.html:497 templates/js/table_filters.html:60
msgid "Depleted"
msgstr ""
-#: templates/js/stock.html:516
+#: templates/js/stock.html:522
msgid "Installed in Stock Item "
msgstr ""
-#: templates/js/stock.html:699
+#: templates/js/stock.html:530
+msgid "Assigned to sales order"
+msgstr ""
+
+#: templates/js/stock.html:708
msgid "No user information"
msgstr ""
-#: templates/js/stock.html:783
+#: templates/js/stock.html:792
msgid "Create New Part"
msgstr ""
-#: templates/js/stock.html:795
+#: templates/js/stock.html:804
msgid "Create New Location"
msgstr ""
+#: templates/js/stock.html:903
+msgid "Serial"
+msgstr ""
+
+#: templates/js/stock.html:996 templates/js/table_filters.html:70
+msgid "Installed"
+msgstr ""
+
+#: templates/js/stock.html:1021
+msgid "Install item"
+msgstr ""
+
#: templates/js/table_filters.html:19 templates/js/table_filters.html:80
msgid "Is Serialized"
msgstr ""
@@ -4243,10 +4332,6 @@ msgstr ""
msgid "Show items which are in stock"
msgstr ""
-#: templates/js/table_filters.html:70
-msgid "Installed"
-msgstr ""
-
#: templates/js/table_filters.html:71
msgid "Show stock items which are installed in another item"
msgstr ""
@@ -4283,19 +4368,27 @@ msgstr ""
msgid "Include parts in subcategories"
msgstr ""
+#: templates/js/table_filters.html:178
+msgid "Has IPN"
+msgstr ""
+
#: templates/js/table_filters.html:179
+msgid "Part has internal part number"
+msgstr ""
+
+#: templates/js/table_filters.html:184
msgid "Show active parts"
msgstr ""
-#: templates/js/table_filters.html:187
+#: templates/js/table_filters.html:192
msgid "Stock available"
msgstr ""
-#: templates/js/table_filters.html:203
+#: templates/js/table_filters.html:208
msgid "Starred"
msgstr ""
-#: templates/js/table_filters.html:215
+#: templates/js/table_filters.html:220
msgid "Purchasable"
msgstr ""
@@ -4339,42 +4432,42 @@ msgstr ""
msgid "Search"
msgstr ""
-#: templates/stock_table.html:5
+#: templates/stock_table.html:6
msgid "Export Stock Information"
msgstr ""
-#: templates/stock_table.html:12
+#: templates/stock_table.html:13
msgid "Add to selected stock items"
msgstr ""
-#: templates/stock_table.html:13
+#: templates/stock_table.html:14
msgid "Remove from selected stock items"
msgstr ""
-#: templates/stock_table.html:14
+#: templates/stock_table.html:15
msgid "Stocktake selected stock items"
msgstr ""
-#: templates/stock_table.html:15
+#: templates/stock_table.html:16
msgid "Move selected stock items"
msgstr ""
-#: templates/stock_table.html:15
+#: templates/stock_table.html:16
msgid "Move stock"
msgstr ""
-#: templates/stock_table.html:16
+#: templates/stock_table.html:17
msgid "Order selected items"
msgstr ""
-#: templates/stock_table.html:16
+#: templates/stock_table.html:17
msgid "Order stock"
msgstr ""
-#: templates/stock_table.html:17
+#: templates/stock_table.html:18
msgid "Delete selected items"
msgstr ""
-#: templates/stock_table.html:17
+#: templates/stock_table.html:18
msgid "Delete Stock"
msgstr ""
diff --git a/InvenTree/part/api.py b/InvenTree/part/api.py
index c70ef5c21a..6834503466 100644
--- a/InvenTree/part/api.py
+++ b/InvenTree/part/api.py
@@ -765,18 +765,35 @@ class BomList(generics.ListCreateAPIView):
queryset = super().filter_queryset(queryset)
+ params = self.request.query_params
+
+ # Filter by "optional" status?
+ optional = params.get('optional', None)
+
+ if optional is not None:
+ optional = str2bool(optional)
+
+ queryset = queryset.filter(optional=optional)
+
# Filter by part?
- part = self.request.query_params.get('part', None)
+ part = params.get('part', None)
if part is not None:
queryset = queryset.filter(part=part)
# Filter by sub-part?
- sub_part = self.request.query_params.get('sub_part', None)
+ sub_part = params.get('sub_part', None)
if sub_part is not None:
queryset = queryset.filter(sub_part=sub_part)
+ # Filter by "trackable" status of the sub-part
+ trackable = params.get('trackable', None)
+
+ if trackable is not None:
+ trackable = str2bool(trackable)
+ queryset = queryset.filter(sub_part__trackable=trackable)
+
return queryset
permission_classes = [
diff --git a/InvenTree/part/apps.py b/InvenTree/part/apps.py
index 2137ec5d89..198e58e337 100644
--- a/InvenTree/part/apps.py
+++ b/InvenTree/part/apps.py
@@ -37,4 +37,4 @@ class PartConfig(AppConfig):
part.image = None
part.save()
except (OperationalError, ProgrammingError):
- print("Could not generate Part thumbnails")
+ pass
diff --git a/InvenTree/part/forms.py b/InvenTree/part/forms.py
index 0a15d598bd..c64bbb8362 100644
--- a/InvenTree/part/forms.py
+++ b/InvenTree/part/forms.py
@@ -231,7 +231,8 @@ class EditBomItemForm(HelperForm):
'quantity',
'reference',
'overage',
- 'note'
+ 'note',
+ 'optional',
]
# Prevent editing of the part associated with this BomItem
diff --git a/InvenTree/part/migrations/0051_bomitem_optional.py b/InvenTree/part/migrations/0051_bomitem_optional.py
new file mode 100644
index 0000000000..04920b3c10
--- /dev/null
+++ b/InvenTree/part/migrations/0051_bomitem_optional.py
@@ -0,0 +1,18 @@
+# Generated by Django 3.0.7 on 2020-10-04 13:34
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('part', '0050_auto_20200917_2315'),
+ ]
+
+ operations = [
+ migrations.AddField(
+ model_name='bomitem',
+ name='optional',
+ field=models.BooleanField(default=False, help_text='This BOM item is optional'),
+ ),
+ ]
diff --git a/InvenTree/part/models.py b/InvenTree/part/models.py
index afb2dfa64e..d427409c71 100644
--- a/InvenTree/part/models.py
+++ b/InvenTree/part/models.py
@@ -111,6 +111,58 @@ class PartCategory(InvenTreeTree):
""" True if there are any parts in this category """
return self.partcount() > 0
+ def prefetch_parts_parameters(self, cascade=True):
+ """ Prefectch parts parameters """
+
+ return self.get_parts(cascade=cascade).prefetch_related('parameters', 'parameters__template').all()
+
+ def get_unique_parameters(self, cascade=True, prefetch=None):
+ """ Get all unique parameter names for all parts from this category """
+
+ unique_parameters_names = []
+
+ if prefetch:
+ parts = prefetch
+ else:
+ parts = self.prefetch_parts_parameters(cascade=cascade)
+
+ for part in parts:
+ for parameter in part.parameters.all():
+ parameter_name = parameter.template.name
+ if parameter_name not in unique_parameters_names:
+ unique_parameters_names.append(parameter_name)
+
+ return sorted(unique_parameters_names)
+
+ def get_parts_parameters(self, cascade=True, prefetch=None):
+ """ Get all parameter names and values for all parts from this category """
+
+ category_parameters = []
+
+ if prefetch:
+ parts = prefetch
+ else:
+ parts = self.prefetch_parts_parameters(cascade=cascade)
+
+ for part in parts:
+ part_parameters = {
+ 'pk': part.pk,
+ 'name': part.name,
+ 'description': part.description,
+ }
+ # Add IPN only if it exists
+ if part.IPN:
+ part_parameters['IPN'] = part.IPN
+
+ for parameter in part.parameters.all():
+ parameter_name = parameter.template.name
+ parameter_value = parameter.data
+ part_parameters[parameter_name] = parameter_value
+
+ category_parameters.append(part_parameters)
+
+ return category_parameters
+
@receiver(pre_delete, sender=PartCategory, dispatch_uid='partcategory_delete_log')
def before_delete_part_category(sender, instance, using, **kwargs):
@@ -382,7 +434,7 @@ class Part(MPTTModel):
return _('Next available serial numbers are') + ' ' + text
else:
- text = str(latest)
+ text = str(latest + 1)
return _('Next available serial number is') + ' ' + text
@@ -732,12 +784,13 @@ class Part(MPTTModel):
""" Return the current number of parts currently being built
"""
- quantity = self.active_builds.aggregate(quantity=Sum('quantity'))['quantity']
+ stock_items = self.stock_items.filter(is_building=True)
- if quantity is None:
- quantity = 0
+ query = stock_items.aggregate(
+ quantity=Coalesce(Sum('quantity'), Decimal(0))
+ )
- return quantity
+ return query['quantity']
def build_order_allocations(self):
"""
@@ -1447,6 +1500,7 @@ class BomItem(models.Model):
part: Link to the parent part (the part that will be produced)
sub_part: Link to the child part (the part that will be consumed)
quantity: Number of 'sub_parts' consumed to produce one 'part'
+ optional: Boolean field describing if this BomItem is optional
reference: BOM reference field (e.g. part designators)
overage: Estimated losses for a Build. Can be expressed as absolute value (e.g. '7') or a percentage (e.g. '2%')
note: Note field for this BOM item
@@ -1480,6 +1534,8 @@ class BomItem(models.Model):
# Quantity required
quantity = models.DecimalField(default=1.0, max_digits=15, decimal_places=5, validators=[MinValueValidator(0)], help_text=_('BOM quantity for this BOM item'))
+ optional = models.BooleanField(default=False, help_text=_("This BOM item is optional"))
+
overage = models.CharField(max_length=24, blank=True, validators=[validators.validate_overage],
help_text=_('Estimated build wastage quantity (absolute or percentage)')
)
diff --git a/InvenTree/part/serializers.py b/InvenTree/part/serializers.py
index 7c73e9f98b..847216e957 100644
--- a/InvenTree/part/serializers.py
+++ b/InvenTree/part/serializers.py
@@ -403,6 +403,7 @@ class BomItemSerializer(InvenTreeModelSerializer):
'quantity',
'reference',
'price_range',
+ 'optional',
'overage',
'note',
'validated',
diff --git a/InvenTree/part/templates/part/category.html b/InvenTree/part/templates/part/category.html
index a79bfcbe84..9a6fb9d7e5 100644
--- a/InvenTree/part/templates/part/category.html
+++ b/InvenTree/part/templates/part/category.html
@@ -120,8 +120,11 @@