From 0d462389b9472d40448543ffd45beb5b1a014a35 Mon Sep 17 00:00:00 2001 From: Daniel Pervan Date: Tue, 19 Jan 2021 12:00:30 +0100 Subject: [PATCH 01/15] Fix misspelled query filter method name --- InvenTree/order/models.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/InvenTree/order/models.py b/InvenTree/order/models.py index 84f6aeb6f0..ff159fce0c 100644 --- a/InvenTree/order/models.py +++ b/InvenTree/order/models.py @@ -455,7 +455,7 @@ class SalesOrder(Order): """ query = SalesOrder.objects.filter(pk=self.pk) - query = query.filer(SalesOrder.OVERDUE_FILTER) + query = query.filter(SalesOrder.OVERDUE_FILTER) return query.exists() From 82e6b87e1cac21436c195cd77943e30b6ff2caee Mon Sep 17 00:00:00 2001 From: Oliver Walters Date: Wed, 20 Jan 2021 07:49:14 +1100 Subject: [PATCH 02/15] Adds unit testing for order overdue status --- InvenTree/build/models.py | 15 ++++++--------- InvenTree/build/tests.py | 19 +++++++++++++++++++ InvenTree/order/models.py | 1 + InvenTree/order/test_sales_order.py | 22 ++++++++++++++++++++++ InvenTree/order/tests.py | 22 ++++++++++++++++++++++ 5 files changed, 70 insertions(+), 9 deletions(-) diff --git a/InvenTree/build/models.py b/InvenTree/build/models.py index 10b3b00259..c1d4aa8026 100644 --- a/InvenTree/build/models.py +++ b/InvenTree/build/models.py @@ -225,22 +225,19 @@ class Build(MPTTModel): blank=True, help_text=_('Extra build notes') ) + @property def is_overdue(self): """ Returns true if this build is "overdue": - - Not completed - - Target date is "in the past" + Makes use of the OVERDUE_FILTER to avoid code duplication """ - # Cannot be deemed overdue if target_date is not set - if self.target_date is None: - return False - - today = datetime.now().date() - - return self.active and self.target_date < today + query = Build.objects.filter(pk=self.pk) + query = query.filter(Build.OVERDUE_FILTER) + return query.exists() + @property def active(self): """ diff --git a/InvenTree/build/tests.py b/InvenTree/build/tests.py index cb1881e507..2ac571a726 100644 --- a/InvenTree/build/tests.py +++ b/InvenTree/build/tests.py @@ -10,6 +10,7 @@ from rest_framework.test import APITestCase from rest_framework import status import json +from datetime import datetime, timedelta from .models import Build from stock.models import StockItem @@ -70,6 +71,24 @@ class BuildTestSimple(TestCase): self.assertEqual(b2.status, BuildStatus.COMPLETE) + def test_overdue(self): + """ + Test overdue status functionality + """ + + today = datetime.now().date() + + build = Build.objects.get(pk=1) + self.assertFalse(build.is_overdue) + + build.target_date = today - timedelta(days=1) + build.save() + self.assertTrue(build.is_overdue) + + build.target_date = today + timedelta(days=80) + build.save() + self.assertFalse(build.is_overdue) + def test_is_active(self): b1 = Build.objects.get(pk=1) b2 = Build.objects.get(pk=2) diff --git a/InvenTree/order/models.py b/InvenTree/order/models.py index ff159fce0c..32f25a78cc 100644 --- a/InvenTree/order/models.py +++ b/InvenTree/order/models.py @@ -272,6 +272,7 @@ class PurchaseOrder(Order): self.complete_date = datetime.now().date() self.save() + @property def is_overdue(self): """ Returns True if this PurchaseOrder is "overdue" diff --git a/InvenTree/order/test_sales_order.py b/InvenTree/order/test_sales_order.py index 5eb350575e..c619aec5bc 100644 --- a/InvenTree/order/test_sales_order.py +++ b/InvenTree/order/test_sales_order.py @@ -5,6 +5,8 @@ from django.test import TestCase from django.core.exceptions import ValidationError from django.db.utils import IntegrityError +from datetime import datetime, timedelta + from company.models import Company from stock.models import StockItem from order.models import SalesOrder, SalesOrderLineItem, SalesOrderAllocation @@ -40,6 +42,26 @@ class SalesOrderTest(TestCase): # Create a line item self.line = SalesOrderLineItem.objects.create(quantity=50, order=self.order, part=self.part) + def test_overdue(self): + """ + Tests for overdue functionality + """ + + today = datetime.now().date() + + # By default, order is *not* overdue as the target date is not set + self.assertFalse(self.order.is_overdue) + + # Set target date in the past + self.order.target_date = today - timedelta(days=5) + self.order.save() + self.assertTrue(self.order.is_overdue) + + # Set target date in the future + self.order.target_date = today + timedelta(days=5) + self.order.save() + self.assertFalse(self.order.is_overdue) + def test_empty_order(self): self.assertEqual(self.line.quantity, 50) self.assertEqual(self.line.allocated_quantity(), 0) diff --git a/InvenTree/order/tests.py b/InvenTree/order/tests.py index 7f60b1445b..ed6a4ebb6a 100644 --- a/InvenTree/order/tests.py +++ b/InvenTree/order/tests.py @@ -1,3 +1,7 @@ +# -*- coding: utf-8 -*- + +from datetime import datetime, timedelta + from django.test import TestCase import django.core.exceptions as django_exceptions @@ -37,6 +41,24 @@ class OrderTest(TestCase): self.assertEqual(str(line), "100 x ACME0001 from ACME (for PO0001 - ACME)") + def test_overdue(self): + """ + Test overdue status functionality + """ + + today = datetime.now().date() + + order = PurchaseOrder.objects.get(pk=1) + self.assertFalse(order.is_overdue) + + order.target_date = today - timedelta(days=5) + order.save() + self.assertTrue(order.is_overdue) + + order.target_date = today + timedelta(days=1) + order.save() + self.assertFalse(order.is_overdue) + def test_increment(self): next_ref = PurchaseOrder.getNextOrderNumber() From 69362ab960f26ae97e083d3b832f8ff6388da61d Mon Sep 17 00:00:00 2001 From: Oliver Walters Date: Wed, 20 Jan 2021 18:04:08 +1100 Subject: [PATCH 03/15] Display link column in part table --- .../static/script/inventree/tables.js | 26 +++++++++++++++++-- InvenTree/templates/js/part.js | 14 ++++++++++ 2 files changed, 38 insertions(+), 2 deletions(-) diff --git a/InvenTree/InvenTree/static/script/inventree/tables.js b/InvenTree/InvenTree/static/script/inventree/tables.js index a40eb37285..21f9160758 100644 --- a/InvenTree/InvenTree/static/script/inventree/tables.js +++ b/InvenTree/InvenTree/static/script/inventree/tables.js @@ -8,11 +8,33 @@ function deleteButton(url, text='Delete') { } -function renderLink(text, url) { - if (text === '' || url === '') { +function renderLink(text, url, options={}) { + if (url == null || url === '') { return text; } + var max_length = options.max_length || -1; + + var remove_http = options.remove_http || false; + + if (remove_http) { + if (text.startsWith('http://')) { + text = text.slice(7); + } else if (text.startsWith('https://')) { + text = text.slice(8); + } + } + + // Shorten the displayed length if required + if ((max_length > 0) && (text.length > max_length)) { + var slice_length = (max_length - 3) / 2; + + var text_start = text.slice(0, slice_length); + var text_end = text.slice(-slice_length); + + text = `${text_start}...${text_end}`; + } + return '' + text + ''; } diff --git a/InvenTree/templates/js/part.js b/InvenTree/templates/js/part.js index e0f6a491f6..c9f59ab4eb 100644 --- a/InvenTree/templates/js/part.js +++ b/InvenTree/templates/js/part.js @@ -446,6 +446,20 @@ function loadPartTable(table, url, options={}) { } }); + columns.push({ + field: 'link', + title: '{% trans "Link" %}', + formatter: function(value, row, index, field) { + return renderLink( + value, value, + { + max_length: 32, + remove_http: true, + } + ); + } + }); + $(table).inventreeTable({ url: url, sortName: 'name', From 220777611a0d0ee757e97fde5b598a1826e4f725 Mon Sep 17 00:00:00 2001 From: Oliver Walters Date: Wed, 27 Jan 2021 22:31:21 +1100 Subject: [PATCH 04/15] Prevent part images from auto deleting - Part images can be used for multiple parts --- InvenTree/InvenTree/settings.py | 34 ++++++++++++++++----------------- InvenTree/part/models.py | 11 +++++++++-- requirements.txt | 2 +- 3 files changed, 27 insertions(+), 20 deletions(-) diff --git a/InvenTree/InvenTree/settings.py b/InvenTree/InvenTree/settings.py index 107cc7ff16..06908e76bf 100644 --- a/InvenTree/InvenTree/settings.py +++ b/InvenTree/InvenTree/settings.py @@ -196,23 +196,23 @@ INSTALLED_APPS = [ 'users.apps.UsersConfig', # Third part add-ons - 'django_filters', # Extended filter functionality - 'dbbackup', # Database backup / restore - 'rest_framework', # DRF (Django Rest Framework) - 'rest_framework.authtoken', # Token authentication for API - 'corsheaders', # Cross-origin Resource Sharing for DRF - 'crispy_forms', # Improved form rendering - 'import_export', # Import / export tables to file - 'django_cleanup', # Automatically delete orphaned MEDIA files - 'qr_code', # Generate QR codes - 'mptt', # Modified Preorder Tree Traversal - 'markdownx', # Markdown editing - 'markdownify', # Markdown template rendering - 'django_tex', # LaTeX output - 'django_admin_shell', # Python shell for the admin interface - 'djmoney', # django-money integration - 'djmoney.contrib.exchange', # django-money exchange rates - 'error_report', # Error reporting in the admin interface + 'django_filters', # Extended filter functionality + 'dbbackup', # Database backup / restore + 'rest_framework', # DRF (Django Rest Framework) + 'rest_framework.authtoken', # Token authentication for API + 'corsheaders', # Cross-origin Resource Sharing for DRF + 'crispy_forms', # Improved form rendering + 'import_export', # Import / export tables to file + 'django_cleanup.apps.CleanupConfig', # Automatically delete orphaned MEDIA files + 'qr_code', # Generate QR codes + 'mptt', # Modified Preorder Tree Traversal + 'markdownx', # Markdown editing + 'markdownify', # Markdown template rendering + 'django_tex', # LaTeX output + 'django_admin_shell', # Python shell for the admin interface + 'djmoney', # django-money integration + 'djmoney.contrib.exchange', # django-money exchange rates + 'error_report', # Error reporting in the admin interface ] MIDDLEWARE = CONFIG.get('middleware', [ diff --git a/InvenTree/part/models.py b/InvenTree/part/models.py index f35cc98d39..8ba7ba799d 100644 --- a/InvenTree/part/models.py +++ b/InvenTree/part/models.py @@ -6,6 +6,7 @@ Part database model definitions from __future__ import unicode_literals import os +import logging from django.utils.translation import gettext_lazy as _ from django.core.exceptions import ValidationError @@ -51,6 +52,9 @@ import common.models import part.settings as part_settings +logger = logging.getLogger(__name__) + + class PartCategory(InvenTreeTree): """ PartCategory provides hierarchical organization of Part objects. @@ -335,11 +339,14 @@ class Part(MPTTModel): if self.pk: previous = Part.objects.get(pk=self.pk) - if previous.image and not self.image == previous.image: + # Image has been changed + if previous.image is not None and not self.image == previous.image: + # Are there any (other) parts which reference the image? n_refs = Part.objects.filter(image=previous.image).exclude(pk=self.pk).count() if n_refs == 0: + logger.info(f"Deleting unused image file '{previous.image}'") previous.image.delete(save=False) self.clean() @@ -710,7 +717,7 @@ class Part(MPTTModel): null=True, blank=True, variations={'thumbnail': (128, 128)}, - delete_orphans=True, + delete_orphans=False, ) default_location = TreeForeignKey( diff --git a/requirements.txt b/requirements.txt index 76610600a6..e4ffe6be75 100644 --- a/requirements.txt +++ b/requirements.txt @@ -15,7 +15,7 @@ pygments==2.2.0 # Syntax highlighting tablib==0.13.0 # Import / export data files django-crispy-forms==1.8.1 # Form helpers django-import-export==2.0.0 # Data import / export for admin interface -django-cleanup==4.0.0 # Manage deletion of old / unused uploaded files +django-cleanup==5.1.0 # Manage deletion of old / unused uploaded files django-qr-code==1.2.0 # Generate QR codes flake8==3.8.3 # PEP checking pep8-naming==0.11.1 # PEP naming convention extension From 51a33e5dca89a5b0375972be7043d4d781f4dd58 Mon Sep 17 00:00:00 2001 From: Oliver Walters Date: Thu, 28 Jan 2021 20:18:03 +1100 Subject: [PATCH 05/15] Add setting to enable / disable barcode support (Default = True) --- InvenTree/common/models.py | 7 +++++++ InvenTree/templates/InvenTree/settings/global.html | 8 ++++++++ 2 files changed, 15 insertions(+) diff --git a/InvenTree/common/models.py b/InvenTree/common/models.py index 0fd924a77a..053cc12864 100644 --- a/InvenTree/common/models.py +++ b/InvenTree/common/models.py @@ -71,6 +71,13 @@ class InvenTreeSetting(models.Model): 'choices': djmoney.settings.CURRENCY_CHOICES, }, + 'BARCODE_ENABLE': { + 'name': _('Barcode Support'), + 'description': _('Enable barcode scanner support'), + 'default': True, + 'validator': bool, + }, + 'PART_IPN_REGEX': { 'name': _('IPN Regex'), 'description': _('Regular expression pattern for matching Part IPN') diff --git a/InvenTree/templates/InvenTree/settings/global.html b/InvenTree/templates/InvenTree/settings/global.html index 76af68b441..6d2f14bfd9 100644 --- a/InvenTree/templates/InvenTree/settings/global.html +++ b/InvenTree/templates/InvenTree/settings/global.html @@ -21,4 +21,12 @@ +

{% trans "Barcode Settings" %}

+ + {% include "InvenTree/settings/header.html" %} + + {% include "InvenTree/settings/setting.html" with key="BARCODE_ENABLE" icon="fa-qrcode" %} + +
+ {% endblock %} \ No newline at end of file From 7e8def15ede1c9af2af91bf51442163e84ccabcd Mon Sep 17 00:00:00 2001 From: Oliver Walters Date: Thu, 28 Jan 2021 20:45:42 +1100 Subject: [PATCH 06/15] Hide barcode actions if barcode support is disabled --- InvenTree/part/templates/part/part_base.html | 3 ++ .../stock/templates/stock/item_base.html | 48 +++++++++++-------- InvenTree/stock/templates/stock/location.html | 47 +++++++++--------- 3 files changed, 56 insertions(+), 42 deletions(-) diff --git a/InvenTree/part/templates/part/part_base.html b/InvenTree/part/templates/part/part_base.html index d7604deae4..84eac7e7f4 100644 --- a/InvenTree/part/templates/part/part_base.html +++ b/InvenTree/part/templates/part/part_base.html @@ -44,6 +44,8 @@ + {% settings_value 'BARCODE_ENABLE' as barcodes %} + {% if barcodes %}
@@ -52,6 +54,7 @@
  • {% trans "Print Label" %}
  • + {% endif %} {% if part.active %} @@ -127,24 +129,26 @@ InvenTree | {% trans "Stock Item" %} - {{ item }}
  • {% trans "Show QR Code" %}
  • {% if roles.stock.change %} {% if item.uid %} -
  • {% trans "Unlink Barcode" %}
  • - {% else %} -
  • {% trans "Link Barcode" %}
  • - {% endif %} - {% endif %} - - - - {% if item.has_labels or item.has_test_reports %} -
    - - +
    + {% endif %} + + {% if item.has_labels or item.has_test_reports %} +
    + +
    {% endif %} @@ -447,14 +451,18 @@ $("#show-qr-code").click(function() { }); }); -$("#link-barcode").click(function() { +$("#barcode-link").click(function() { linkBarcodeDialog({{ item.id }}); }); -$("#unlink-barcode").click(function() { +$("#barcode-unlink").click(function() { unlinkBarcode({{ item.id }}); }); +$("#barcode-scan-into-location").click(function() { + scanItemIntoLocation({{ item.id }}); +}); + {% if item.in_stock %} $("#stock-assign-to-customer").click(function() { diff --git a/InvenTree/stock/templates/stock/location.html b/InvenTree/stock/templates/stock/location.html index f3501a50cf..4f8268b037 100644 --- a/InvenTree/stock/templates/stock/location.html +++ b/InvenTree/stock/templates/stock/location.html @@ -37,6 +37,8 @@ {% endif %} {% endif %} + {% settings_value 'BARCODE_ENABLE' as barcodes %} + {% if barcodes %} {% if location %}
    @@ -47,29 +49,30 @@
  • {% trans "Check-in Items" %}
  • - - {% if owner_control.value == "False" or owner_control.value == "True" and user in owners or user.is_superuser %} - {% if roles.stock.change %} - - {% endif %} - {% if roles.stock_location.change %} -
    - - -
    - {% endif %} + {% endif %} + + {% if owner_control.value == "False" or owner_control.value == "True" and user in owners or user.is_superuser %} + {% if roles.stock.change %} + {% endif %} + {% if roles.stock_location.change %} +
    + + +
    + {% endif %} + {% endif %} {% endif %} From d61ae8532a82109cafa642df7bf0ffdcd0d0c4cb Mon Sep 17 00:00:00 2001 From: Oliver Walters Date: Thu, 28 Jan 2021 21:36:57 +1100 Subject: [PATCH 07/15] Dialog for checking multiple items into a stock location --- InvenTree/barcode/api.py | 2 +- InvenTree/stock/api.py | 3 +- .../stock/templates/stock/item_base.html | 2 +- InvenTree/templates/js/barcode.js | 180 ++++++++++++++++-- 4 files changed, 163 insertions(+), 24 deletions(-) diff --git a/InvenTree/barcode/api.py b/InvenTree/barcode/api.py index cecdf0b349..f8a2c37329 100644 --- a/InvenTree/barcode/api.py +++ b/InvenTree/barcode/api.py @@ -90,7 +90,7 @@ class BarcodeScan(APIView): if loc is not None: response['stocklocation'] = plugin.renderStockLocation(loc) - response['url'] = reverse('location-detail', kwargs={'pk': loc.id}) + response['url'] = reverse('stock-location-detail', kwargs={'pk': loc.id}) match_found = True # Try to associate with a part diff --git a/InvenTree/stock/api.py b/InvenTree/stock/api.py index c8211aaeca..3e874e91e5 100644 --- a/InvenTree/stock/api.py +++ b/InvenTree/stock/api.py @@ -160,7 +160,8 @@ class StockAdjust(APIView): try: quantity = Decimal(str(entry.get('quantity', None))) except (ValueError, TypeError, InvalidOperation): - raise ValidationError({'quantity': 'Each entry must contain a valid quantity field'}) + # Default to the quantity of the item + quantity = item.quantity if quantity < 0: raise ValidationError({'quantity': 'Quantity field must not be less than zero'}) diff --git a/InvenTree/stock/templates/stock/item_base.html b/InvenTree/stock/templates/stock/item_base.html index e73ce8c7f9..d284a74e98 100644 --- a/InvenTree/stock/templates/stock/item_base.html +++ b/InvenTree/stock/templates/stock/item_base.html @@ -460,7 +460,7 @@ $("#barcode-unlink").click(function() { }); $("#barcode-scan-into-location").click(function() { - scanItemIntoLocation({{ item.id }}); + scanItemsIntoLocation([{{ item.id }}]); }); {% if item.in_stock %} diff --git a/InvenTree/templates/js/barcode.js b/InvenTree/templates/js/barcode.js index 9c9a8c1b08..0cc58be914 100644 --- a/InvenTree/templates/js/barcode.js +++ b/InvenTree/templates/js/barcode.js @@ -25,6 +25,25 @@ function makeBarcodeInput(placeholderText='') { return html; } +function makeNotesField(options={}) { + + var tooltip = options.tooltip || '{% trans "Enter optional notes for stock transfer" %}'; + + return ` +
    + +
    +
    + + + + +
    +
    ${tooltip}
    +
    +
    `; +} + function showBarcodeMessage(modal, message, style='danger') { @@ -386,22 +405,10 @@ function barcodeCheckIn(location_id, options={}) { var table = `
    `; // Extra form fields - var extra = ` -
    - -
    -
    - - - - -
    -
    {% trans "Enter optional notes for stock transfer" %}
    -
    -
    `; + var extra = makeNotesField(); barcodeDialog( - "{% trans "Check Stock Items into Location" %}", + '{% trans "Check Stock Items into Location" %}', { headerContent: table, preShow: function() { @@ -414,7 +421,6 @@ function barcodeCheckIn(location_id, options={}) { extraFields: extra, onSubmit: function() { - // Called when the 'check-in' button is pressed var data = {location: location_id}; @@ -434,7 +440,7 @@ function barcodeCheckIn(location_id, options={}) { data.items = entries; inventreePut( - '{% url 'api-stock-transfer' %}', + "{% url 'api-stock-transfer' %}", data, { method: 'POST', @@ -446,7 +452,7 @@ function barcodeCheckIn(location_id, options={}) { showAlertOrCache('alert-success', response.success, true); location.reload(); } else { - showAlertOrCache('alert-success', 'Error transferring stock', false); + showAlertOrCache('alert-success', '{% trans "Error transferring stock" %}', false); } } } @@ -482,25 +488,25 @@ function barcodeCheckIn(location_id, options={}) { }); if (duplicate) { - showBarcodeMessage(modal, "{% trans "Stock Item already scanned" %}", "warning"); + showBarcodeMessage(modal, '{% trans "Stock Item already scanned" %}', "warning"); } else { if (stockitem.location == location_id) { - showBarcodeMessage(modal, "{% trans "Stock Item already in this location" %}"); + showBarcodeMessage(modal, '{% trans "Stock Item already in this location" %}'); return; } // Add this stock item to the list items.push(stockitem); - showBarcodeMessage(modal, "{% trans "Added stock item" %}", "success"); + showBarcodeMessage(modal, '{% trans "Added stock item" %}', "success"); reloadTable(); } } else { // Barcode does not match a stock item - showBarcodeMessage(modal, "{% trans "Barcode does not match Stock Item" %}", "warning"); + showBarcodeMessage(modal, '{% trans "Barcode does not match Stock Item" %}', "warning"); } } else { showInvalidResponseError(modal, response, status); @@ -512,3 +518,135 @@ function barcodeCheckIn(location_id, options={}) { } ); } + + +/* + * Display dialog to check a single stock item into a stock location + */ +function scanItemsIntoLocation(item_id_list, options={}) { + + var modal = options.modal || '#modal-form'; + + var stock_location = null; + + // Extra form fields + var extra = makeNotesField(); + + // Header contentfor + var header = ` +
    +
    + `; + + function updateLocationInfo(location) { + var div = $(modal + ' #header-div'); + + if (stock_location && stock_location.pk) { + div.html(` +
    + {% trans "Location" %}
    + ${stock_location.name}
    + ${stock_location.description} +
    + `); + } else { + div.html(''); + } + } + + barcodeDialog( + '{% trans "Check Into Location" %}', + { + headerContent: header, + extraFields: extra, + preShow: function() { + modalSetSubmitText(modal, '{% trans "Check In" %}'); + modalEnable(modal, false); + }, + onShow: function() { + }, + onSubmit: function() { + // Called when the 'check-in' button is pressed + if (!stock_location) { + return; + } + + var items = []; + + item_id_list.forEach(function(pk) { + items.push({ + pk: pk, + }); + }) + + var data = { + location: stock_location.pk, + notes: $(modal + ' #notes').val(), + items: items, + }; + + // Send API request + inventreePut( + '{% url "api-stock-transfer" %}', + data, + { + method: 'POST', + success: function(response, status) { + // First hide the modal + $(modal).modal('hide'); + + if (status == 'success' && 'success' in response) { + showAlertOrCache('alert-success', response.success, true); + location.reload(); + } else { + showAlertOrCache('alert-danger', '{% trans "Error transferring stock" %}', false); + } + } + } + ) + }, + onScan: function(barcode) { + updateLocationInfo(null); + enableBarcodeInput(modal, false); + inventreePut( + '/api/barcode/', + { + barcode: barcode, + }, + { + method: 'POST', + error: function() { + enableBarcodeInput(modal, true); + showBarcodeMessage(modal, '{% trans "Server error" %}'); + }, + success: function(response, status) { + modalEnable(modal, false); + enableBarcodeInput(modal, true); + + if (status == 'success') { + if ('stocklocation' in response) { + // Barcode corresponds to a StockLocation + stock_location = response.stocklocation; + + updateLocationInfo(stock_location); + modalEnable(modal, true); + + } else { + // Barcode does *NOT* correspond to a StockLocation + showBarcodeMessage( + modal, + '{% trans "Barcode does not match a valid location" %}', + "warning", + ); + } + } else { + // Invalid response returned from server + showInvalidResponseError(modal, response, status); + } + } + } + ) + } + } + ) +} \ No newline at end of file From 4641123cd81644e1bdc510a5ca6ba546f68d16ef Mon Sep 17 00:00:00 2001 From: Oliver Walters Date: Thu, 28 Jan 2021 21:47:39 +1100 Subject: [PATCH 08/15] Allow multiple stock items to be checked into a location using table selection --- InvenTree/templates/js/stock.js | 13 +++++++++++++ InvenTree/templates/stock_table.html | 12 ++++++++++++ 2 files changed, 25 insertions(+) diff --git a/InvenTree/templates/js/stock.js b/InvenTree/templates/js/stock.js index 6c7bc3d873..f1926e9c31 100644 --- a/InvenTree/templates/js/stock.js +++ b/InvenTree/templates/js/stock.js @@ -635,6 +635,7 @@ function loadStockTable(table, options) { table, [ '#stock-print-options', + '#stock-barcode-options', '#stock-options', ] ); @@ -700,6 +701,18 @@ function loadStockTable(table, options) { printTestReports(items); }) + $('#multi-item-barcode-scan-into-location').click(function() { + var selections = $('#stock-table').bootstrapTable('getSelections'); + + var items = []; + + selections.forEach(function(item) { + items.push(item.pk); + }) + + scanItemsIntoLocation(items); + }); + $('#multi-item-stocktake').click(function() { stockAdjustment('count'); }); diff --git a/InvenTree/templates/stock_table.html b/InvenTree/templates/stock_table.html index 0542afef4d..b5b61d1ed3 100644 --- a/InvenTree/templates/stock_table.html +++ b/InvenTree/templates/stock_table.html @@ -19,6 +19,18 @@ {% endif %} + {% settings_value 'BARCODE_ENABLE' as barcodes %} + {% if barcodes %} + + + {% endif %}
    {% endif %} - {% settings_value 'BARCODE_ENABLE' as barcodes %} {% if barcodes %}
    From c61631a3809d4e6636ea683a8d6162117bca5c9d Mon Sep 17 00:00:00 2001 From: Oliver Walters Date: Thu, 28 Jan 2021 22:24:06 +1100 Subject: [PATCH 10/15] Refactor tractor --- InvenTree/templates/js/barcode.js | 269 +++++++++++++----------------- 1 file changed, 116 insertions(+), 153 deletions(-) diff --git a/InvenTree/templates/js/barcode.js b/InvenTree/templates/js/barcode.js index 0cc58be914..7a04aaa11d 100644 --- a/InvenTree/templates/js/barcode.js +++ b/InvenTree/templates/js/barcode.js @@ -45,6 +45,61 @@ function makeNotesField(options={}) { } +/* + * POST data to the server, and handle standard responses. + */ +function postBarcodeData(barcode_data, options={}) { + + var modal = options.modal || '#modal-form'; + + var url = options.url || '/api/barcode/'; + + var data = options.data || {}; + + data.barcode = barcode_data; + + inventreePut( + url, + data, + { + method: 'POST', + error: function() { + enableBarcodeInput(modal, true); + showBarcodeMessage(modal, '{% trans "Server error" %}'); + }, + success: function(response, status) { + modalEnable(modal, false); + enableBarcodeInput(modal, true); + + if (status == 'success') { + + if ('success' in response) { + if (options.onScan) { + options.onScan(response); + } + } else if ('error' in response) { + showBarcodeMessage( + modal, + response.error, + 'warning' + ); + } else { + showBarcodeMessage( + modal, + '{% trans "Unknown response from server" %}', + 'warning' + ); + } + } else { + // Invalid response returned from server + showInvalidResponseError(modal, response, status); + } + } + } + ) +} + + function showBarcodeMessage(modal, message, style='danger') { var html = `
    `; @@ -106,9 +161,7 @@ function barcodeDialog(title, options={}) { if (barcode && barcode.length > 0) { - if (options.onScan) { - options.onScan(barcode); - } + postBarcodeData(barcode, options); } } @@ -208,40 +261,20 @@ function barcodeScanDialog() { barcodeDialog( "Scan Barcode", { - onScan: function(barcode) { - enableBarcodeInput(modal, false); - inventreePut( - '/api/barcode/', - { - barcode: barcode, - }, - { - method: 'POST', - success: function(response, status) { - - enableBarcodeInput(modal, true); - - if (status == 'success') { - - if ('success' in response) { - if ('url' in response) { - // Redirect to the URL! - $(modal).modal('hide'); - window.location.href = response.url; - } - - } else if ('error' in response) { - showBarcodeMessage(modal, response.error, 'warning'); - } else { - showBarcodeMessage(modal, "{% trans 'Unknown response from server' %}", 'warning'); - } - } else { - showInvalidResponseError(modal, response, status); - } - }, - }, - ); - }, + onScan: function(response) { + if ('url' in response) { + $(modal).modal('hide'); + + // Redirect to the URL! + window.location.href = response.url; + } else { + showBarcodeMessage( + modal, + '{% trans "No URL in response" %}', + 'warning' + ); + } + } }, ); } @@ -257,37 +290,14 @@ function linkBarcodeDialog(stockitem, options={}) { barcodeDialog( "{% trans 'Link Barcode to Stock Item' %}", { - onScan: function(barcode) { - enableBarcodeInput(modal, false); - inventreePut( - '/api/barcode/link/', - { - barcode: barcode, - stockitem: stockitem, - }, - { - method: 'POST', - success: function(response, status) { + url: '/api/barcode/link/', + data: { + stockitem: stockitem, + }, + onScan: function(response) { - enableBarcodeInput(modal, true); - - if (status == 'success') { - - if ('success' in response) { - $(modal).modal('hide'); - location.reload(); - } else if ('error' in response) { - showBarcodeMessage(modal, response.error, 'warning'); - } else { - showBarcodeMessage(modal, "{% trans 'Unknown response from server' %}", warning); - } - - } else { - showInvalidResponseError(modal, response, status); - } - }, - }, - ); + $(modal).modal('hide'); + location.reload(); } } ); @@ -458,62 +468,39 @@ function barcodeCheckIn(location_id, options={}) { } ); }, - onScan: function(barcode) { - enableBarcodeInput(modal, false); - inventreePut( - '/api/barcode/', - { - barcode: barcode, - }, - { - method: 'POST', - error: function() { - enableBarcodeInput(modal, true); - showBarcodeMessage(modal, '{% trans "Server error" %}'); - }, - success: function(response, status) { + onScan: function(response) { + if ('stockitem' in response) { + stockitem = response.stockitem; - enableBarcodeInput(modal, true); + var duplicate = false; - if (status == 'success') { - if ('stockitem' in response) { - stockitem = response.stockitem; + items.forEach(function(item) { + if (item.pk == stockitem.pk) { + duplicate = true; + } + }); - var duplicate = false; + if (duplicate) { + showBarcodeMessage(modal, '{% trans "Stock Item already scanned" %}', "warning"); + } else { - items.forEach(function(item) { - if (item.pk == stockitem.pk) { - duplicate = true; - } - }); + if (stockitem.location == location_id) { + showBarcodeMessage(modal, '{% trans "Stock Item already in this location" %}'); + return; + } - if (duplicate) { - showBarcodeMessage(modal, '{% trans "Stock Item already scanned" %}', "warning"); - } else { + // Add this stock item to the list + items.push(stockitem); - if (stockitem.location == location_id) { - showBarcodeMessage(modal, '{% trans "Stock Item already in this location" %}'); - return; - } + showBarcodeMessage(modal, '{% trans "Added stock item" %}', "success"); - // Add this stock item to the list - items.push(stockitem); + reloadTable(); + } - showBarcodeMessage(modal, '{% trans "Added stock item" %}', "success"); - - reloadTable(); - } - - } else { - // Barcode does not match a stock item - showBarcodeMessage(modal, '{% trans "Barcode does not match Stock Item" %}', "warning"); - } - } else { - showInvalidResponseError(modal, response, status); - } - }, - }, - ); + } else { + // Barcode does not match a stock item + showBarcodeMessage(modal, '{% trans "Barcode does not match Stock Item" %}', "warning"); + } }, } ); @@ -605,47 +592,23 @@ function scanItemsIntoLocation(item_id_list, options={}) { } ) }, - onScan: function(barcode) { + onScan: function(response) { updateLocationInfo(null); - enableBarcodeInput(modal, false); - inventreePut( - '/api/barcode/', - { - barcode: barcode, - }, - { - method: 'POST', - error: function() { - enableBarcodeInput(modal, true); - showBarcodeMessage(modal, '{% trans "Server error" %}'); - }, - success: function(response, status) { - modalEnable(modal, false); - enableBarcodeInput(modal, true); + if ('stocklocation' in response) { + // Barcode corresponds to a StockLocation + stock_location = response.stocklocation; - if (status == 'success') { - if ('stocklocation' in response) { - // Barcode corresponds to a StockLocation - stock_location = response.stocklocation; + updateLocationInfo(stock_location); + modalEnable(modal, true); - updateLocationInfo(stock_location); - modalEnable(modal, true); - - } else { - // Barcode does *NOT* correspond to a StockLocation - showBarcodeMessage( - modal, - '{% trans "Barcode does not match a valid location" %}', - "warning", - ); - } - } else { - // Invalid response returned from server - showInvalidResponseError(modal, response, status); - } - } - } - ) + } else { + // Barcode does *NOT* correspond to a StockLocation + showBarcodeMessage( + modal, + '{% trans "Barcode does not match a valid location" %}', + "warning", + ); + } } } ) From e8d73c78eb6245c8fde14c0b1dba049a1cf2d43b Mon Sep 17 00:00:00 2001 From: Oliver Walters Date: Thu, 28 Jan 2021 22:37:28 +1100 Subject: [PATCH 11/15] Fixes for unit tests --- InvenTree/stock/api.py | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/InvenTree/stock/api.py b/InvenTree/stock/api.py index 3e874e91e5..36ea8d453d 100644 --- a/InvenTree/stock/api.py +++ b/InvenTree/stock/api.py @@ -121,12 +121,17 @@ class StockAdjust(APIView): - StockAdd: add stock items - StockRemove: remove stock items - StockTransfer: transfer stock items + + # TODO - This needs serious refactoring!!! + """ permission_classes = [ permissions.IsAuthenticated, ] + allow_missing_quantity = False + def get_items(self, request): """ Return a list of items posted to the endpoint. @@ -157,11 +162,13 @@ class StockAdjust(APIView): except (ValueError, StockItem.DoesNotExist): raise ValidationError({'pk': 'Each entry must contain a valid pk field'}) + if self.allow_missing_quantity and 'quantity' not in entry: + entry['quantity'] = item.quantity + try: quantity = Decimal(str(entry.get('quantity', None))) except (ValueError, TypeError, InvalidOperation): - # Default to the quantity of the item - quantity = item.quantity + raise ValidationError({'quantity': "Each entry must contain a valid quantity value"}) if quantity < 0: raise ValidationError({'quantity': 'Quantity field must not be less than zero'}) @@ -235,6 +242,8 @@ class StockTransfer(StockAdjust): API endpoint for performing stock movements """ + allow_missing_quantity = True + def post(self, request, *args, **kwargs): self.get_items(request) From ae15ce9d0abc8e2f4063102471b8243d127f98a6 Mon Sep 17 00:00:00 2001 From: Oliver Walters Date: Thu, 28 Jan 2021 22:38:47 +1100 Subject: [PATCH 12/15] Update translations --- InvenTree/locale/de/LC_MESSAGES/django.po | 898 ++++++++++++---------- InvenTree/locale/en/LC_MESSAGES/django.po | 826 ++++++++++---------- InvenTree/locale/es/LC_MESSAGES/django.po | 826 ++++++++++---------- 3 files changed, 1342 insertions(+), 1208 deletions(-) diff --git a/InvenTree/locale/de/LC_MESSAGES/django.po b/InvenTree/locale/de/LC_MESSAGES/django.po index aaf7c25e04..bc63af0b69 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: 2021-01-18 23:24+1100\n" +"POT-Creation-Date: 2021-01-28 22:37+1100\n" "PO-Revision-Date: 2020-05-03 11:32+0200\n" "Last-Translator: Christian Schlüter \n" "Language-Team: C \n" @@ -61,7 +61,7 @@ msgstr "" msgid "Select Category" msgstr "Teilkategorie auswählen" -#: InvenTree/helpers.py:361 order/models.py:232 order/models.py:330 +#: InvenTree/helpers.py:361 order/models.py:232 order/models.py:331 #: stock/views.py:1778 msgid "Invalid quantity provided" msgstr "Keine gültige Menge" @@ -105,12 +105,13 @@ msgstr "Datei zum Anhängen auswählen" msgid "File comment" msgstr "Datei-Kommentar" -#: InvenTree/models.py:68 templates/js/stock.js:901 +#: InvenTree/models.py:68 templates/js/stock.js:919 msgid "User" msgstr "Benutzer" -#: InvenTree/models.py:106 label/models.py:68 part/models.py:647 -#: part/templates/part/params.html:24 templates/js/part.js:129 +#: InvenTree/models.py:106 label/models.py:68 part/models.py:654 +#: part/templates/part/params.html:24 report/models.py:152 +#: templates/js/part.js:129 msgid "Name" msgstr "Name" @@ -342,7 +343,7 @@ msgstr "" #: build/forms.py:78 build/templates/build/auto_allocate.html:17 #: build/templates/build/build_base.html:83 -#: build/templates/build/detail.html:29 common/models.py:603 +#: build/templates/build/detail.html:29 common/models.py:610 #: company/forms.py:112 company/templates/company/supplier_part_pricing.html:75 #: order/templates/order/order_wizard/select_parts.html:32 #: order/templates/order/purchase_order_detail.html:179 @@ -353,10 +354,10 @@ msgstr "" #: part/templates/part/sale_prices.html:82 stock/forms.py:306 #: stock/templates/stock/item_base.html:51 #: stock/templates/stock/item_base.html:57 -#: stock/templates/stock/item_base.html:234 -#: stock/templates/stock/stock_adjust.html:18 templates/js/barcode.js:338 -#: templates/js/bom.js:195 templates/js/build.js:420 templates/js/stock.js:892 -#: templates/js/stock.js:1131 +#: stock/templates/stock/item_base.html:238 +#: stock/templates/stock/stock_adjust.html:18 templates/js/barcode.js:367 +#: templates/js/bom.js:195 templates/js/build.js:420 templates/js/stock.js:910 +#: templates/js/stock.js:1149 msgid "Quantity" msgstr "Anzahl" @@ -460,14 +461,14 @@ msgstr "Referenz" #: company/models.py:359 company/templates/company/detail.html:23 #: company/templates/company/supplier_part_base.html:61 #: company/templates/company/supplier_part_detail.html:27 label/models.py:75 -#: order/templates/order/purchase_order_detail.html:161 part/models.py:671 +#: order/templates/order/purchase_order_detail.html:161 part/models.py:678 #: part/templates/part/detail.html:51 part/templates/part/set_category.html:14 -#: templates/InvenTree/search.html:147 +#: report/models.py:166 templates/InvenTree/search.html:147 #: templates/InvenTree/settings/header.html:9 templates/js/bom.js:180 #: templates/js/bom.js:547 templates/js/build.js:664 templates/js/company.js:56 #: templates/js/order.js:180 templates/js/order.js:274 templates/js/part.js:188 -#: templates/js/part.js:271 templates/js/part.js:391 templates/js/part.js:572 -#: templates/js/stock.js:511 templates/js/stock.js:873 +#: templates/js/part.js:271 templates/js/part.js:391 templates/js/part.js:586 +#: templates/js/stock.js:512 templates/js/stock.js:891 msgid "Description" msgstr "Beschreibung" @@ -488,16 +489,16 @@ msgstr "Bestellung, die diesem Bau zugwiesen ist" #: build/models.py:134 build/templates/build/auto_allocate.html:16 #: build/templates/build/build_base.html:78 -#: build/templates/build/detail.html:24 order/models.py:651 +#: build/templates/build/detail.html:24 order/models.py:652 #: order/templates/order/order_wizard/select_parts.html:30 #: order/templates/order/purchase_order_detail.html:148 -#: order/templates/order/receive_parts.html:19 part/models.py:316 +#: order/templates/order/receive_parts.html:19 part/models.py:320 #: part/templates/part/part_app_base.html:7 part/templates/part/related.html:26 #: part/templates/part/set_category.html:13 templates/InvenTree/search.html:133 -#: templates/js/barcode.js:336 templates/js/bom.js:153 templates/js/bom.js:532 +#: templates/js/barcode.js:365 templates/js/bom.js:153 templates/js/bom.js:532 #: templates/js/build.js:669 templates/js/company.js:138 -#: templates/js/part.js:252 templates/js/part.js:357 templates/js/stock.js:485 -#: templates/js/stock.js:1203 +#: templates/js/part.js:252 templates/js/part.js:357 templates/js/stock.js:486 +#: templates/js/stock.js:1221 msgid "Part" msgstr "Teil" @@ -557,7 +558,7 @@ msgstr "Fertig" msgid "Number of stock items which have been completed" msgstr "Objekt löschen wenn Lagerbestand aufgebraucht" -#: build/models.py:186 part/templates/part/part_base.html:155 +#: build/models.py:186 part/templates/part/part_base.html:158 msgid "Build Status" msgstr "Bau-Status" @@ -573,30 +574,30 @@ msgstr "Losnummer" msgid "Batch code for this build output" msgstr "Chargennummer für diese Bau-Ausgabe" -#: build/models.py:205 order/models.py:436 +#: build/models.py:205 order/models.py:437 msgid "Target completion date" msgstr "" #: build/models.py:219 build/templates/build/detail.html:89 #: company/templates/company/supplier_part_base.html:68 #: company/templates/company/supplier_part_detail.html:24 -#: part/templates/part/detail.html:80 part/templates/part/part_base.html:102 -#: stock/models.py:412 stock/templates/stock/item_base.html:317 +#: part/templates/part/detail.html:80 part/templates/part/part_base.html:105 +#: stock/models.py:412 stock/templates/stock/item_base.html:321 msgid "External Link" msgstr "Externer Link" -#: build/models.py:220 part/models.py:705 stock/models.py:414 +#: build/models.py:220 part/models.py:712 stock/models.py:414 msgid "Link to external URL" msgstr "Link zu einer externen URL" #: build/models.py:224 build/templates/build/tabs.html:23 company/models.py:366 #: company/templates/company/tabs.html:33 order/templates/order/po_tabs.html:18 #: order/templates/order/purchase_order_detail.html:213 -#: order/templates/order/so_tabs.html:23 part/models.py:831 +#: order/templates/order/so_tabs.html:23 part/models.py:838 #: part/templates/part/tabs.html:73 stock/forms.py:315 stock/forms.py:347 #: stock/forms.py:375 stock/models.py:484 stock/models.py:1554 -#: stock/templates/stock/tabs.html:26 templates/js/barcode.js:391 -#: templates/js/bom.js:293 templates/js/stock.js:127 templates/js/stock.js:623 +#: stock/templates/stock/tabs.html:26 templates/js/barcode.js:34 +#: templates/js/bom.js:293 templates/js/stock.js:128 templates/js/stock.js:624 msgid "Notes" msgstr "Notizen" @@ -604,76 +605,76 @@ msgstr "Notizen" msgid "Extra build notes" msgstr "Notizen für den Bau" -#: build/models.py:610 +#: build/models.py:607 #, fuzzy #| msgid "No action specified" msgid "No build output specified" msgstr "Keine Aktion angegeben" -#: build/models.py:613 +#: build/models.py:610 msgid "Build output is already completed" msgstr "" -#: build/models.py:616 +#: build/models.py:613 #, fuzzy #| msgid "Quantity does not match serial numbers" msgid "Build output does not match Build Order" msgstr "Anzahl stimmt nicht mit den Seriennummern überein" -#: build/models.py:691 +#: build/models.py:688 #, fuzzy #| msgid "Complete Build" msgid "Completed build output" msgstr "Bau fertigstellen" -#: build/models.py:933 +#: build/models.py:930 msgid "BuildItem must be unique for build, stock_item and install_into" msgstr "" -#: build/models.py:955 +#: build/models.py:952 #, fuzzy #| msgid "Allocate Stock to Build" msgid "Build item must specify a build output" msgstr "Lagerbestand dem Bau zuweisen" -#: build/models.py:960 +#: build/models.py:957 #, python-brace-format msgid "Selected stock item not found in BOM for part '{p}'" msgstr "Ausgewähltes Lagerobjekt nicht in BOM für Teil '{p}' gefunden" -#: build/models.py:964 +#: build/models.py:961 #, python-brace-format msgid "Allocated quantity ({n}) must not exceed available quantity ({q})" msgstr "" "zugewiesene Anzahl ({n}) darf nicht die verfügbare ({q}) Anzahl überschreiten" -#: build/models.py:971 order/models.py:735 +#: build/models.py:968 order/models.py:736 msgid "StockItem is over-allocated" msgstr "Zu viele Lagerobjekte zugewiesen" -#: build/models.py:975 order/models.py:738 +#: build/models.py:972 order/models.py:739 msgid "Allocation quantity must be greater than zero" msgstr "Anzahl muss größer null sein" -#: build/models.py:979 +#: build/models.py:976 msgid "Quantity must be 1 for serialized stock" msgstr "Anzahl muss 1 für Objekte mit Seriennummer sein" -#: build/models.py:1019 +#: build/models.py:1016 msgid "Build to allocate parts" msgstr "Bau starten um Teile zuzuweisen" -#: build/models.py:1026 +#: build/models.py:1023 #, fuzzy #| msgid "Remove stock" msgid "Source stock item" msgstr "Bestand entfernen" -#: build/models.py:1038 +#: build/models.py:1035 msgid "Stock quantity to allocate to build" msgstr "Lagerobjekt-Anzahl dem Bau zuweisen" -#: build/models.py:1046 +#: build/models.py:1043 #, fuzzy #| msgid "Destination stock location" msgid "Destination stock item" @@ -759,10 +760,11 @@ msgid "" msgstr "Lagerobjekt dem Bau zuweisen" #: build/templates/build/auto_allocate.html:18 stock/forms.py:345 -#: stock/templates/stock/item_base.html:264 +#: stock/templates/stock/item_base.html:268 #: stock/templates/stock/stock_adjust.html:17 -#: templates/InvenTree/search.html:183 templates/js/barcode.js:337 -#: templates/js/build.js:434 templates/js/stock.js:597 +#: templates/InvenTree/search.html:183 templates/js/barcode.js:366 +#: templates/js/barcode.js:534 templates/js/build.js:434 +#: templates/js/stock.js:598 msgid "Location" msgstr "Standort" @@ -838,10 +840,10 @@ msgstr "Bau-Status" #: build/templates/build/build_base.html:88 #: build/templates/build/detail.html:57 #: order/templates/order/receive_parts.html:24 -#: stock/templates/stock/item_base.html:363 templates/InvenTree/search.html:175 -#: templates/js/barcode.js:42 templates/js/build.js:697 +#: stock/templates/stock/item_base.html:367 templates/InvenTree/search.html:175 +#: templates/js/barcode.js:116 templates/js/build.js:697 #: templates/js/order.js:185 templates/js/order.js:279 -#: templates/js/stock.js:584 templates/js/stock.js:1139 +#: templates/js/stock.js:585 templates/js/stock.js:1157 msgid "Status" msgstr "Status" @@ -865,13 +867,13 @@ msgid "Progress" msgstr "" #: build/templates/build/build_base.html:120 -#: build/templates/build/detail.html:82 order/models.py:649 +#: build/templates/build/detail.html:82 order/models.py:650 #: 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:258 templates/js/order.js:240 +#: stock/templates/stock/item_base.html:262 templates/js/order.js:240 msgid "Sales Order" msgstr "Bestellung" @@ -1005,8 +1007,8 @@ msgid "Destination location not specified" msgstr "Hat dieses Teil Tracking für einzelne Objekte?" #: build/templates/build/detail.html:68 -#: stock/templates/stock/item_base.html:282 templates/js/stock.js:592 -#: templates/js/stock.js:1146 templates/js/table_filters.js:80 +#: stock/templates/stock/item_base.html:286 templates/js/stock.js:593 +#: templates/js/stock.js:1164 templates/js/table_filters.js:80 #: templates/js/table_filters.js:161 msgid "Batch" msgstr "Los" @@ -1325,283 +1327,294 @@ msgid "Default currency" msgstr "Währung entfernen" #: common/models.py:75 +#, fuzzy +#| msgid "Source Location" +msgid "Barcode Support" +msgstr "Quell-Standort" + +#: common/models.py:76 +msgid "Enable barcode scanner support" +msgstr "" + +#: common/models.py:82 msgid "IPN Regex" msgstr "" -#: common/models.py:76 +#: common/models.py:83 msgid "Regular expression pattern for matching Part IPN" msgstr "" -#: common/models.py:80 +#: common/models.py:87 #, fuzzy #| msgid "Duplicate Part" msgid "Allow Duplicate IPN" msgstr "Teil duplizieren" -#: common/models.py:81 +#: common/models.py:88 msgid "Allow multiple parts to share the same IPN" msgstr "" -#: common/models.py:87 +#: common/models.py:94 #, fuzzy #| msgid "Import BOM data" msgid "Copy Part BOM Data" msgstr "Stückliste importieren" -#: common/models.py:88 -msgid "Copy BOM data by default when duplicating a part" -msgstr "" - -#: common/models.py:94 -#, fuzzy -#| msgid "Parameters" -msgid "Copy Part Parameter Data" -msgstr "Parameter" - #: common/models.py:95 -msgid "Copy parameter data by default when duplicating a part" +msgid "Copy BOM data by default when duplicating a part" msgstr "" #: common/models.py:101 #, fuzzy #| msgid "Parameters" -msgid "Copy Part Test Data" +msgid "Copy Part Parameter Data" msgstr "Parameter" #: common/models.py:102 -msgid "Copy test data by default when duplicating a part" +msgid "Copy parameter data by default when duplicating a part" msgstr "" #: common/models.py:108 #, fuzzy +#| msgid "Parameters" +msgid "Copy Part Test Data" +msgstr "Parameter" + +#: common/models.py:109 +msgid "Copy test data by default when duplicating a part" +msgstr "" + +#: common/models.py:115 +#, fuzzy #| msgid "Edit Part Parameter Template" msgid "Copy Category Parameter Templates" msgstr "Teilparametervorlage bearbeiten" -#: common/models.py:109 +#: common/models.py:116 msgid "Copy category parameter templates when creating a part" msgstr "" -#: common/models.py:115 part/templates/part/detail.html:155 stock/forms.py:257 -#: templates/js/table_filters.js:23 templates/js/table_filters.js:270 +#: common/models.py:122 part/templates/part/detail.html:155 +#: report/models.py:159 stock/forms.py:257 templates/js/table_filters.js:23 +#: templates/js/table_filters.js:270 msgid "Template" msgstr "Vorlage" -#: common/models.py:116 +#: common/models.py:123 #, fuzzy #| msgid "Part is not a virtual part" msgid "Parts are templates by default" msgstr "Teil ist nicht virtuell" -#: common/models.py:122 part/models.py:794 part/templates/part/detail.html:165 +#: common/models.py:129 part/models.py:801 part/templates/part/detail.html:165 #: templates/js/table_filters.js:282 msgid "Assembly" msgstr "Baugruppe" -#: common/models.py:123 +#: common/models.py:130 #, fuzzy #| msgid "Part can be assembled from other parts" msgid "Parts can be assembled from other components by default" msgstr "Teil kann aus anderen Teilen angefertigt werden" -#: common/models.py:129 part/models.py:800 part/templates/part/detail.html:175 +#: common/models.py:136 part/models.py:807 part/templates/part/detail.html:175 #: templates/js/table_filters.js:286 msgid "Component" msgstr "Komponente" -#: common/models.py:130 +#: common/models.py:137 #, fuzzy #| msgid "Part can be used in assemblies" msgid "Parts can be used as sub-components by default" msgstr "Teil kann in Baugruppen benutzt werden" -#: common/models.py:136 part/models.py:811 part/templates/part/detail.html:195 +#: common/models.py:143 part/models.py:818 part/templates/part/detail.html:195 msgid "Purchaseable" msgstr "Kaufbar" -#: common/models.py:137 +#: common/models.py:144 msgid "Parts are purchaseable by default" msgstr "" -#: common/models.py:143 part/models.py:816 part/templates/part/detail.html:205 +#: common/models.py:150 part/models.py:823 part/templates/part/detail.html:205 #: templates/js/table_filters.js:294 msgid "Salable" msgstr "Verkäuflich" -#: common/models.py:144 +#: common/models.py:151 msgid "Parts are salable by default" msgstr "" -#: common/models.py:150 part/models.py:806 part/templates/part/detail.html:185 +#: common/models.py:157 part/models.py:813 part/templates/part/detail.html:185 #: templates/js/table_filters.js:31 templates/js/table_filters.js:298 msgid "Trackable" msgstr "nachverfolgbar" -#: common/models.py:151 +#: common/models.py:158 msgid "Parts are trackable by default" msgstr "" -#: common/models.py:157 part/models.py:826 part/templates/part/detail.html:145 +#: common/models.py:164 part/models.py:833 part/templates/part/detail.html:145 #: templates/js/table_filters.js:27 msgid "Virtual" msgstr "Virtuell" -#: common/models.py:158 +#: common/models.py:165 #, fuzzy #| msgid "Part is not a virtual part" msgid "Parts are virtual by default" msgstr "Teil ist nicht virtuell" -#: common/models.py:164 +#: common/models.py:171 #, fuzzy #| msgid "Stock Quantity" msgid "Show Quantity in Forms" msgstr "Bestand" -#: common/models.py:165 +#: common/models.py:172 msgid "Display available part quantity in some forms" msgstr "" -#: common/models.py:171 +#: common/models.py:178 #, fuzzy #| msgid "Stock Export Options" msgid "Stock Expiry" msgstr "Lagerbestandsexportoptionen" -#: common/models.py:172 +#: common/models.py:179 msgid "Enable stock expiry functionality" msgstr "" -#: common/models.py:178 +#: common/models.py:185 #, fuzzy #| msgid "Serialize Stock" msgid "Sell Expired Stock" msgstr "Lagerbestand erfassen" -#: common/models.py:179 +#: common/models.py:186 msgid "Allow sale of expired stock" msgstr "" -#: common/models.py:185 +#: common/models.py:192 #, fuzzy #| msgid "Stock Item" msgid "Stock Stale Time" msgstr "Lagerobjekt" -#: common/models.py:186 +#: common/models.py:193 msgid "Number of days stock items are considered stale before expiring" msgstr "" -#: common/models.py:188 part/templates/part/detail.html:116 +#: common/models.py:195 part/templates/part/detail.html:116 msgid "days" msgstr "" -#: common/models.py:193 +#: common/models.py:200 #, fuzzy #| msgid "Builds" msgid "Build Expired Stock" msgstr "Baue" -#: common/models.py:194 +#: common/models.py:201 msgid "Allow building with expired stock" msgstr "" -#: common/models.py:200 +#: common/models.py:207 msgid "Stock Ownership Control" msgstr "" -#: common/models.py:201 +#: common/models.py:208 msgid "Enable ownership control over stock locations and items" msgstr "" -#: common/models.py:207 +#: common/models.py:214 #, fuzzy #| msgid "Order Reference" msgid "Build Order Reference Prefix" msgstr "Bestellreferenz" -#: common/models.py:208 +#: common/models.py:215 #, fuzzy #| msgid "Order reference" msgid "Prefix value for build order reference" msgstr "Bestell-Referenz" -#: common/models.py:213 +#: common/models.py:220 #, fuzzy #| msgid "Order Reference" msgid "Build Order Reference Regex" msgstr "Bestellreferenz" -#: common/models.py:214 +#: common/models.py:221 msgid "Regular expression pattern for matching build order reference" msgstr "" -#: common/models.py:218 +#: common/models.py:225 #, fuzzy #| msgid "Sales Order Reference" msgid "Sales Order Reference Prefix" msgstr "Bestellungsreferenz" -#: common/models.py:219 +#: common/models.py:226 #, fuzzy #| msgid "Order reference" msgid "Prefix value for sales order reference" msgstr "Bestell-Referenz" -#: common/models.py:224 +#: common/models.py:231 #, fuzzy #| msgid "Order reference" msgid "Purchase Order Reference Prefix" msgstr "Bestell-Referenz" -#: common/models.py:225 +#: common/models.py:232 #, fuzzy #| msgid "Order reference" msgid "Prefix value for purchase order reference" msgstr "Bestell-Referenz" -#: common/models.py:448 +#: common/models.py:455 msgid "Settings key (must be unique - case insensitive" msgstr "" "Einstellungs-Schlüssel (muss einzigartig sein, Groß-/ Kleinschreibung wird " "nicht beachtet)" -#: common/models.py:450 +#: common/models.py:457 msgid "Settings value" msgstr "Einstellungs-Wert" -#: common/models.py:507 +#: common/models.py:514 msgid "Value must be a boolean value" msgstr "" -#: common/models.py:517 +#: common/models.py:524 #, fuzzy #| msgid "Must enter integer value" msgid "Value must be an integer value" msgstr "Nur Ganzzahl eingeben" -#: common/models.py:531 +#: common/models.py:538 msgid "Key string must be unique" msgstr "Schlüsseltext muss eindeutig sein" -#: common/models.py:604 company/forms.py:113 +#: common/models.py:611 company/forms.py:113 #, fuzzy #| msgid "Price Breaks" msgid "Price break quantity" msgstr "Preisstaffelung" -#: common/models.py:612 company/templates/company/supplier_part_pricing.html:80 +#: common/models.py:619 company/templates/company/supplier_part_pricing.html:80 #: part/templates/part/sale_prices.html:87 templates/js/bom.js:245 msgid "Price" msgstr "Preis" -#: common/models.py:613 +#: common/models.py:620 #, fuzzy #| msgid "Enter a valid quantity" msgid "Unit price at specified quantity" msgstr "Bitte eine gültige Anzahl eingeben" -#: common/models.py:636 +#: common/models.py:643 #, fuzzy #| msgid "Default Location" msgid "Default" @@ -1723,7 +1736,7 @@ msgid "Currency" msgstr "Währung bearbeiten" #: company/models.py:313 stock/models.py:366 -#: stock/templates/stock/item_base.html:214 +#: stock/templates/stock/item_base.html:218 msgid "Base Part" msgstr "Basisteil" @@ -1736,7 +1749,7 @@ msgstr "Teil auswählen" #: company/templates/company/supplier_part_detail.html:21 #: order/templates/order/order_base.html:89 #: order/templates/order/order_wizard/select_pos.html:30 part/bom.py:170 -#: stock/templates/stock/item_base.html:324 templates/js/company.js:48 +#: stock/templates/stock/item_base.html:328 templates/js/company.js:48 #: templates/js/company.js:164 templates/js/order.js:167 msgid "Supplier" msgstr "Zulieferer" @@ -1775,7 +1788,8 @@ msgstr "MPN" msgid "Manufacturer part number" msgstr "Hersteller-Teilenummer" -#: company/models.py:353 part/models.py:704 templates/js/company.js:208 +#: company/models.py:353 part/models.py:711 templates/js/company.js:208 +#: templates/js/part.js:451 msgid "Link" msgstr "Link" @@ -1841,7 +1855,7 @@ msgstr "Währung entfernen" #: company/templates/company/detail.html:62 #: order/templates/order/sales_order_base.html:89 stock/models.py:401 -#: stock/models.py:402 stock/templates/stock/item_base.html:241 +#: stock/models.py:402 stock/templates/stock/item_base.html:245 #: templates/js/company.js:40 templates/js/order.js:261 msgid "Customer" msgstr "Kunde" @@ -1857,7 +1871,7 @@ msgstr "Neues Zuliefererteil anlegen" #: company/templates/company/detail_part.html:18 #: order/templates/order/purchase_order_detail.html:68 -#: part/templates/part/supplier.html:14 templates/js/stock.js:1023 +#: part/templates/part/supplier.html:14 templates/js/stock.js:1041 msgid "New Supplier Part" msgstr "Neues Zulieferer-Teil" @@ -1885,7 +1899,7 @@ msgstr "Teile löschen" #: company/templates/company/detail_part.html:63 #: part/templates/part/bom.html:182 part/templates/part/category.html:116 -#: templates/js/stock.js:1017 +#: templates/js/stock.js:1035 msgid "New Part" msgstr "Neues Teil" @@ -1978,12 +1992,12 @@ msgstr "Neuer Auftrag" #: company/templates/company/supplier_part_base.html:6 #: company/templates/company/supplier_part_base.html:19 stock/models.py:375 -#: stock/templates/stock/item_base.html:329 templates/js/company.js:180 +#: stock/templates/stock/item_base.html:333 templates/js/company.js:180 msgid "Supplier Part" msgstr "Zulieferer-Teil" #: company/templates/company/supplier_part_base.html:26 -#: part/templates/part/orders.html:14 part/templates/part/part_base.html:66 +#: part/templates/part/orders.html:14 part/templates/part/part_base.html:69 msgid "Order part" msgstr "Teil bestellen" @@ -2056,7 +2070,7 @@ msgstr "Bepreisung" #: company/templates/company/tabs.html:12 part/templates/part/tabs.html:18 #: stock/templates/stock/location.html:29 templates/InvenTree/search.html:155 #: templates/InvenTree/settings/tabs.html:25 templates/js/part.js:192 -#: templates/js/part.js:418 templates/js/stock.js:519 templates/navbar.html:22 +#: templates/js/part.js:418 templates/js/stock.js:520 templates/navbar.html:22 msgid "Stock" msgstr "Lagerbestand" @@ -2065,7 +2079,7 @@ msgid "Orders" msgstr "Bestellungen" #: company/templates/company/tabs.html:9 -#: order/templates/order/receive_parts.html:14 part/models.py:317 +#: order/templates/order/receive_parts.html:14 part/models.py:321 #: part/templates/part/cat_link.html:7 part/templates/part/category.html:94 #: part/templates/part/category_tabs.html:6 #: templates/InvenTree/settings/tabs.html:22 templates/navbar.html:19 @@ -2138,7 +2152,7 @@ msgstr "Firma gelöscht" msgid "Edit Supplier Part" msgstr "Zuliefererteil bearbeiten" -#: company/views.py:295 templates/js/stock.js:1024 +#: company/views.py:295 templates/js/stock.js:1042 msgid "Create new Supplier Part" msgstr "Neues Zuliefererteil anlegen" @@ -2194,7 +2208,7 @@ msgstr "" msgid "Label template file" msgstr "" -#: label/models.py:90 report/models.py:162 +#: label/models.py:90 report/models.py:172 msgid "Enabled" msgstr "" @@ -2206,7 +2220,7 @@ msgstr "" msgid "Query filters (comma-separated list of key=value pairs" msgstr "" -#: label/models.py:138 label/models.py:191 +#: label/models.py:138 label/models.py:191 report/models.py:194 msgid "Filters" msgstr "" @@ -2247,7 +2261,7 @@ msgstr "" msgid "Enter sales order number" msgstr "Auftrag stornieren" -#: order/forms.py:140 order/models.py:437 +#: order/forms.py:140 order/models.py:438 msgid "" "Target date for order completion. Order will be overdue after this date." msgstr "" @@ -2268,7 +2282,7 @@ msgstr "Link auf externe Seite" msgid "Order notes" msgstr "Bestell-Notizen" -#: order/models.py:171 order/models.py:430 +#: order/models.py:171 order/models.py:431 #, fuzzy #| msgid "Purchase Order Details" msgid "Purchase order status" @@ -2315,7 +2329,7 @@ msgstr "Erstelldatum" msgid "Date order was completed" msgstr "Bestellung als vollständig markieren" -#: order/models.py:230 order/models.py:328 part/views.py:1506 +#: order/models.py:230 order/models.py:329 part/views.py:1506 #: stock/models.py:265 stock/models.py:881 msgid "Quantity must be greater than zero" msgstr "Anzahl muss größer Null sein" @@ -2324,82 +2338,82 @@ msgstr "Anzahl muss größer Null sein" msgid "Part supplier must match PO supplier" msgstr "Teile-Zulieferer muss dem Zulieferer des Kaufvertrags entsprechen" -#: order/models.py:323 +#: order/models.py:324 msgid "Lines can only be received against an order marked as 'Placed'" msgstr "Nur Teile aufgegebener Bestllungen können empfangen werden" -#: order/models.py:426 +#: order/models.py:427 msgid "Company to which the items are being sold" msgstr "" -#: order/models.py:432 +#: order/models.py:433 msgid "Customer order reference code" msgstr "Bestellreferenz" -#: order/models.py:490 +#: order/models.py:491 msgid "SalesOrder cannot be shipped as it is not currently pending" msgstr "Bestellung kann nicht versendet werden weil sie nicht anhängig ist" -#: order/models.py:577 +#: order/models.py:578 msgid "Item quantity" msgstr "Anzahl" -#: order/models.py:579 +#: order/models.py:580 msgid "Line item reference" msgstr "Position - Referenz" -#: order/models.py:581 +#: order/models.py:582 msgid "Line item notes" msgstr "Position - Notizen" -#: order/models.py:607 order/templates/order/order_base.html:9 +#: order/models.py:608 order/templates/order/order_base.html:9 #: order/templates/order/order_base.html:24 -#: stock/templates/stock/item_base.html:296 templates/js/order.js:145 +#: stock/templates/stock/item_base.html:300 templates/js/order.js:145 msgid "Purchase Order" msgstr "Kaufvertrag" -#: order/models.py:620 +#: order/models.py:621 msgid "Supplier part" msgstr "Zulieferer-Teil" -#: order/models.py:623 +#: order/models.py:624 msgid "Number of items received" msgstr "Empfangene Objekt-Anzahl" -#: order/models.py:630 stock/models.py:494 -#: stock/templates/stock/item_base.html:303 +#: order/models.py:631 stock/models.py:494 +#: stock/templates/stock/item_base.html:307 #, fuzzy #| msgid "Purchase Order" msgid "Purchase Price" msgstr "Kaufvertrag" -#: order/models.py:631 +#: order/models.py:632 #, fuzzy #| msgid "Purchase Order" msgid "Unit purchase price" msgstr "Kaufvertrag" -#: order/models.py:726 +#: order/models.py:727 msgid "Cannot allocate stock item to a line with a different part" msgstr "Kann Lagerobjekt keiner Zeile mit einem anderen Teil hinzufügen" -#: order/models.py:728 +#: order/models.py:729 msgid "Cannot allocate stock to a line without a part" msgstr "Kann Lagerobjekt keiner Zeile ohne Teil hinzufügen" -#: order/models.py:731 +#: order/models.py:732 msgid "Allocation quantity cannot exceed stock quantity" msgstr "zugewiesene Anzahl darf nicht die verfügbare Anzahl überschreiten" -#: order/models.py:741 +#: order/models.py:742 msgid "Quantity must be 1 for serialized stock item" msgstr "Anzahl muss 1 für Objekte mit Seriennummer sein" -#: order/models.py:757 +#: order/models.py:758 msgid "Select stock item to allocate" msgstr "Lagerobjekt für Zuordnung auswählen" -#: order/models.py:760 +#: order/models.py:761 msgid "Enter stock allocation quantity" msgstr "Zuordnungsanzahl eingeben" @@ -2542,7 +2556,7 @@ msgstr "Bestellpositionen" #: order/templates/order/purchase_order_detail.html:39 #: order/templates/order/purchase_order_detail.html:119 #: part/templates/part/category.html:173 part/templates/part/category.html:215 -#: templates/js/stock.js:657 templates/js/stock.js:1029 +#: templates/js/stock.js:661 templates/js/stock.js:1047 msgid "New Location" msgstr "Neuer Standort" @@ -2589,7 +2603,7 @@ msgid "Select parts to receive against this order" msgstr "" #: order/templates/order/receive_parts.html:21 -#: part/templates/part/part_base.html:145 templates/js/part.js:434 +#: part/templates/part/part_base.html:148 templates/js/part.js:434 msgid "On Order" msgstr "bestellt" @@ -2632,7 +2646,7 @@ msgstr "Auftragspositionen" #: order/templates/order/sales_order_detail.html:72 #: order/templates/order/sales_order_detail.html:154 stock/models.py:406 -#: stock/templates/stock/item_base.html:228 templates/js/build.js:418 +#: stock/templates/stock/item_base.html:232 templates/js/build.js:418 msgid "Serial Number" msgstr "Seriennummer" @@ -2854,12 +2868,12 @@ msgstr "Zuordnung bearbeiten" msgid "Remove allocation" msgstr "Zuordnung entfernen" -#: part/bom.py:138 part/models.py:722 part/templates/part/category.html:61 +#: part/bom.py:138 part/models.py:729 part/templates/part/category.html:61 #: part/templates/part/detail.html:87 msgid "Default Location" msgstr "Standard-Lagerort" -#: part/bom.py:139 part/templates/part/part_base.html:118 +#: part/bom.py:139 part/templates/part/part_base.html:121 msgid "Available Stock" msgstr "Verfügbarer Lagerbestand" @@ -2932,7 +2946,7 @@ msgstr "Neues Zulieferer-Teil" msgid "Include part supplier data in exported BOM" msgstr "" -#: part/forms.py:102 part/models.py:1781 +#: part/forms.py:102 part/models.py:1788 msgid "Parent Part" msgstr "Ausgangsteil" @@ -3026,204 +3040,204 @@ msgstr "Vorlagen-Name des Parameters muss eindeutig sein" msgid "Input quantity for price calculation" msgstr "Eintragsmenge zur Preisberechnung" -#: part/models.py:68 +#: part/models.py:72 msgid "Default location for parts in this category" msgstr "Standard-Standort für Teile dieser Kategorie" -#: part/models.py:71 +#: part/models.py:75 msgid "Default keywords for parts in this category" msgstr "Standard-Stichworte für Teile dieser Kategorie" -#: part/models.py:77 part/models.py:1826 +#: part/models.py:81 part/models.py:1833 #: part/templates/part/part_app_base.html:9 msgid "Part Category" msgstr "Teilkategorie" -#: part/models.py:78 part/templates/part/category.html:18 +#: part/models.py:82 part/templates/part/category.html:18 #: part/templates/part/category.html:89 templates/stats.html:39 #: users/models.py:32 msgid "Part Categories" msgstr "Teile-Kategorien" -#: part/models.py:409 part/models.py:419 +#: part/models.py:416 part/models.py:426 #, 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:516 +#: part/models.py:523 #, fuzzy #| msgid "No serial numbers found" msgid "Next available serial numbers are" msgstr "Keine Seriennummern gefunden" -#: part/models.py:520 +#: part/models.py:527 msgid "Next available serial number is" msgstr "" -#: part/models.py:525 +#: part/models.py:532 #, fuzzy #| msgid "Empty serial number string" msgid "Most recent serial number is" msgstr "Keine Seriennummer angegeben" -#: part/models.py:604 +#: part/models.py:611 msgid "Duplicate IPN not allowed in part settings" msgstr "" -#: part/models.py:615 +#: part/models.py:622 msgid "Part must be unique for name, IPN and revision" msgstr "Namen, Teile- und Revisionsnummern müssen eindeutig sein" -#: part/models.py:646 part/templates/part/detail.html:19 +#: part/models.py:653 part/templates/part/detail.html:19 msgid "Part name" msgstr "Name des Teils" -#: part/models.py:653 +#: part/models.py:660 #, fuzzy #| msgid "Template" msgid "Is Template" msgstr "Vorlage" -#: part/models.py:654 +#: part/models.py:661 msgid "Is this part a template part?" msgstr "Ist dieses Teil eine Vorlage?" -#: part/models.py:665 +#: part/models.py:672 msgid "Is this part a variant of another part?" msgstr "Ist dieses Teil eine Variante eines anderen Teils?" -#: part/models.py:666 part/templates/part/detail.html:57 +#: part/models.py:673 part/templates/part/detail.html:57 msgid "Variant Of" msgstr "Variante von" -#: part/models.py:672 +#: part/models.py:679 msgid "Part description" msgstr "Beschreibung des Teils" -#: part/models.py:677 part/templates/part/category.html:68 +#: part/models.py:684 part/templates/part/category.html:68 #: part/templates/part/detail.html:64 msgid "Keywords" msgstr "Schlüsselwörter" -#: part/models.py:678 +#: part/models.py:685 msgid "Part keywords to improve visibility in search results" msgstr "Schlüsselworte um die Sichtbarkeit in Suchergebnissen zu verbessern" -#: part/models.py:685 part/templates/part/detail.html:70 +#: part/models.py:692 part/templates/part/detail.html:70 #: part/templates/part/set_category.html:15 templates/js/part.js:405 msgid "Category" msgstr "Kategorie" -#: part/models.py:686 +#: part/models.py:693 msgid "Part category" msgstr "Teile-Kategorie" -#: part/models.py:691 part/templates/part/detail.html:25 -#: part/templates/part/part_base.html:95 templates/js/part.js:180 +#: part/models.py:698 part/templates/part/detail.html:25 +#: part/templates/part/part_base.html:98 templates/js/part.js:180 msgid "IPN" msgstr "IPN (Interne Produktnummer)" -#: part/models.py:692 +#: part/models.py:699 msgid "Internal Part Number" msgstr "Interne Teilenummer" -#: part/models.py:698 +#: part/models.py:705 msgid "Part revision or version number" msgstr "Revisions- oder Versionsnummer" -#: part/models.py:699 part/templates/part/detail.html:32 +#: part/models.py:706 part/templates/part/detail.html:32 #: templates/js/part.js:184 msgid "Revision" msgstr "Revision" -#: part/models.py:720 +#: part/models.py:727 msgid "Where is this item normally stored?" msgstr "Wo wird dieses Teil normalerweise gelagert?" -#: part/models.py:767 part/templates/part/detail.html:94 +#: part/models.py:774 part/templates/part/detail.html:94 msgid "Default Supplier" msgstr "Standard-Zulieferer" -#: part/models.py:768 +#: part/models.py:775 msgid "Default supplier part" msgstr "Standard-Zulieferer?" -#: part/models.py:775 +#: part/models.py:782 #, fuzzy #| msgid "Default Supplier" msgid "Default Expiry" msgstr "Standard-Zulieferer" -#: part/models.py:776 +#: part/models.py:783 msgid "Expiry time (in days) for stock items of this part" msgstr "" -#: part/models.py:781 part/templates/part/detail.html:108 +#: part/models.py:788 part/templates/part/detail.html:108 msgid "Minimum Stock" msgstr "Minimaler Lagerbestand" -#: part/models.py:782 +#: part/models.py:789 msgid "Minimum allowed stock level" msgstr "Minimal zulässiger Lagerbestand" -#: part/models.py:788 part/templates/part/detail.html:102 +#: part/models.py:795 part/templates/part/detail.html:102 #: part/templates/part/params.html:26 msgid "Units" msgstr "Einheiten" -#: part/models.py:789 +#: part/models.py:796 msgid "Stock keeping units for this part" msgstr "Stock Keeping Units (SKU) für dieses Teil" -#: part/models.py:795 +#: part/models.py:802 msgid "Can this part be built from other parts?" msgstr "Kann dieses Teil aus anderen Teilen angefertigt werden?" -#: part/models.py:801 +#: part/models.py:808 msgid "Can this part be used to build other parts?" msgstr "Kann dieses Teil zum Bau von anderen genutzt werden?" -#: part/models.py:807 +#: part/models.py:814 msgid "Does this part have tracking for unique items?" msgstr "Hat dieses Teil Tracking für einzelne Objekte?" -#: part/models.py:812 +#: part/models.py:819 msgid "Can this part be purchased from external suppliers?" msgstr "Kann dieses Teil von externen Zulieferern gekauft werden?" -#: part/models.py:817 +#: part/models.py:824 msgid "Can this part be sold to customers?" msgstr "Kann dieses Teil an Kunden verkauft werden?" -#: part/models.py:821 part/templates/part/detail.html:222 +#: part/models.py:828 part/templates/part/detail.html:222 #: templates/js/table_filters.js:19 templates/js/table_filters.js:55 #: templates/js/table_filters.js:196 templates/js/table_filters.js:265 msgid "Active" msgstr "Aktiv" -#: part/models.py:822 +#: part/models.py:829 msgid "Is this part active?" msgstr "Ist dieses Teil aktiv?" -#: part/models.py:827 +#: part/models.py:834 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:832 +#: part/models.py:839 msgid "Part notes - supports Markdown formatting" msgstr "Bemerkungen - unterstüzt Markdown-Formatierung" -#: part/models.py:835 +#: part/models.py:842 msgid "Stored BOM checksum" msgstr "Prüfsumme der Stückliste gespeichert" -#: part/models.py:1654 +#: part/models.py:1661 #, 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:1671 +#: part/models.py:1678 #, fuzzy #| msgid "" #| "A stock item with this serial number already exists for template part " @@ -3233,146 +3247,146 @@ msgstr "" "Ein Teil mit dieser Seriennummer existiert bereits für die Teilevorlage " "{part}" -#: part/models.py:1690 templates/js/part.js:567 templates/js/stock.js:103 +#: part/models.py:1697 templates/js/part.js:581 templates/js/stock.js:104 #, fuzzy #| msgid "Instance Name" msgid "Test Name" msgstr "Instanzname" -#: part/models.py:1691 +#: part/models.py:1698 #, fuzzy #| msgid "Serial number for this item" msgid "Enter a name for the test" msgstr "Seriennummer für dieses Teil" -#: part/models.py:1696 +#: part/models.py:1703 #, fuzzy #| msgid "Description" msgid "Test Description" msgstr "Beschreibung" -#: part/models.py:1697 +#: part/models.py:1704 #, fuzzy #| msgid "Brief description of the build" msgid "Enter description for this test" msgstr "Kurze Beschreibung des Baus" -#: part/models.py:1702 templates/js/part.js:576 +#: part/models.py:1709 templates/js/part.js:590 #: templates/js/table_filters.js:182 msgid "Required" msgstr "benötigt" -#: part/models.py:1703 +#: part/models.py:1710 msgid "Is this test required to pass?" msgstr "" -#: part/models.py:1708 templates/js/part.js:584 +#: part/models.py:1715 templates/js/part.js:598 #, fuzzy #| msgid "Required Parts" msgid "Requires Value" msgstr "benötigte Teile" -#: part/models.py:1709 +#: part/models.py:1716 msgid "Does this test require a value when adding a test result?" msgstr "" -#: part/models.py:1714 templates/js/part.js:591 +#: part/models.py:1721 templates/js/part.js:605 #, fuzzy #| msgid "Delete Attachment" msgid "Requires Attachment" msgstr "Anhang löschen" -#: part/models.py:1715 +#: part/models.py:1722 msgid "Does this test require a file attachment when adding a test result?" msgstr "" -#: part/models.py:1748 +#: part/models.py:1755 msgid "Parameter template name must be unique" msgstr "Vorlagen-Name des Parameters muss eindeutig sein" -#: part/models.py:1753 +#: part/models.py:1760 msgid "Parameter Name" msgstr "Name des Parameters" -#: part/models.py:1755 +#: part/models.py:1762 msgid "Parameter Units" msgstr "Parameter Einheit" -#: part/models.py:1783 part/models.py:1831 +#: part/models.py:1790 part/models.py:1838 #: templates/InvenTree/settings/category.html:62 msgid "Parameter Template" msgstr "Parameter Vorlage" -#: part/models.py:1785 +#: part/models.py:1792 msgid "Parameter Value" msgstr "Parameter Wert" -#: part/models.py:1835 +#: part/models.py:1842 #, fuzzy #| msgid "Parameter Value" msgid "Default Parameter Value" msgstr "Parameter Wert" -#: part/models.py:1862 +#: part/models.py:1869 msgid "Select parent part" msgstr "Ausgangsteil auswählen" -#: part/models.py:1870 +#: part/models.py:1877 msgid "Select part to be used in BOM" msgstr "Teil für die Nutzung in der Stückliste auswählen" -#: part/models.py:1876 +#: part/models.py:1883 msgid "BOM quantity for this BOM item" msgstr "Stücklisten-Anzahl für dieses Stücklisten-Teil" -#: part/models.py:1878 +#: part/models.py:1885 #, fuzzy #| msgid "Confim BOM item deletion" msgid "This BOM item is optional" msgstr "Löschung von BOM-Position bestätigen" -#: part/models.py:1881 +#: part/models.py:1888 msgid "Estimated build wastage quantity (absolute or percentage)" msgstr "Geschätzter Ausschuss (absolut oder prozentual)" -#: part/models.py:1884 +#: part/models.py:1891 msgid "BOM item reference" msgstr "Referenz des Objekts auf der Stückliste" -#: part/models.py:1887 +#: part/models.py:1894 msgid "BOM item notes" msgstr "Notizen zum Stücklisten-Objekt" -#: part/models.py:1889 +#: part/models.py:1896 msgid "BOM line checksum" msgstr "Prüfsumme der Stückliste" -#: part/models.py:1960 part/views.py:1512 part/views.py:1564 +#: part/models.py:1967 part/views.py:1512 part/views.py:1564 #: stock/models.py:255 #, 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:1969 part/models.py:1971 +#: part/models.py:1976 part/models.py:1978 #, fuzzy #| msgid "Supplier part description" msgid "Sub part must be specified" msgstr "Zuliefererbeschreibung des Teils" -#: part/models.py:1974 +#: part/models.py:1981 #, fuzzy #| msgid "New BOM Item" msgid "BOM Item" msgstr "Neue Stücklistenposition" -#: part/models.py:2095 +#: part/models.py:2102 #, fuzzy #| msgid "Select a part" msgid "Select Related Part" msgstr "Teil auswählen" -#: part/models.py:2127 +#: part/models.py:2134 msgid "" "Error creating relationship: check that the part is not related to itself " "and that the relationship is unique" @@ -3393,9 +3407,9 @@ msgstr "Bestellung" #: part/templates/part/allocation.html:45 #: stock/templates/stock/item_base.html:8 #: stock/templates/stock/item_base.html:89 -#: stock/templates/stock/item_base.html:311 +#: stock/templates/stock/item_base.html:315 #: stock/templates/stock/stock_adjust.html:16 templates/js/build.js:751 -#: templates/js/stock.js:862 templates/js/stock.js:1122 +#: templates/js/stock.js:880 templates/js/stock.js:1140 msgid "Stock Item" msgstr "Lagerobjekt" @@ -3495,7 +3509,7 @@ msgid "All selected BOM items will be deleted" msgstr "Ausgewählte Stücklistenpositionen entfernen" #: part/templates/part/bom.html:183 part/views.py:594 -#: templates/js/stock.js:1018 +#: templates/js/stock.js:1036 msgid "Create New Part" msgstr "Neues Teil anlegen" @@ -3680,7 +3694,7 @@ msgstr "Teilkategorie auswählen" msgid "Export Data" msgstr "Exportieren" -#: part/templates/part/category.html:174 templates/js/stock.js:658 +#: part/templates/part/category.html:174 templates/js/stock.js:662 #, fuzzy #| msgid "Create New Location" msgid "Create new location" @@ -3853,7 +3867,7 @@ msgid "New Parameter" msgstr "Neuer Parameter" #: part/templates/part/params.html:25 stock/models.py:1541 -#: templates/InvenTree/settings/header.html:8 templates/js/stock.js:123 +#: templates/InvenTree/settings/header.html:8 templates/js/stock.js:124 msgid "Value" msgstr "Wert" @@ -3889,79 +3903,79 @@ msgstr "Inaktiv" msgid "Star this part" msgstr "Teil favorisieren" -#: part/templates/part/part_base.html:49 -#: stock/templates/stock/item_base.html:125 -#: stock/templates/stock/location.html:43 +#: part/templates/part/part_base.html:51 +#: stock/templates/stock/item_base.html:127 +#: stock/templates/stock/location.html:45 #, fuzzy #| msgid "Source Location" msgid "Barcode actions" msgstr "Quell-Standort" -#: part/templates/part/part_base.html:51 -#: stock/templates/stock/item_base.html:127 -#: stock/templates/stock/location.html:45 +#: part/templates/part/part_base.html:53 +#: stock/templates/stock/item_base.html:129 +#: stock/templates/stock/location.html:47 #, fuzzy #| msgid "Part QR Code" msgid "Show QR Code" msgstr "Teil-QR-Code" -#: part/templates/part/part_base.html:52 -#: stock/templates/stock/item_base.html:143 -#: stock/templates/stock/location.html:46 +#: part/templates/part/part_base.html:54 +#: stock/templates/stock/item_base.html:147 +#: stock/templates/stock/location.html:48 msgid "Print Label" msgstr "" -#: part/templates/part/part_base.html:56 +#: part/templates/part/part_base.html:59 msgid "Show pricing information" msgstr "Kosteninformationen ansehen" -#: part/templates/part/part_base.html:60 +#: part/templates/part/part_base.html:63 #, fuzzy #| msgid "Count stock" msgid "Count part stock" msgstr "Bestand zählen" -#: part/templates/part/part_base.html:75 +#: part/templates/part/part_base.html:78 #, fuzzy #| msgid "Source Location" msgid "Part actions" msgstr "Quell-Standort" -#: part/templates/part/part_base.html:78 +#: part/templates/part/part_base.html:81 #, fuzzy #| msgid "Duplicate Part" msgid "Duplicate part" msgstr "Teil duplizieren" -#: part/templates/part/part_base.html:81 +#: part/templates/part/part_base.html:84 #, fuzzy #| msgid "Edit Template" msgid "Edit part" msgstr "Vorlage bearbeiten" -#: part/templates/part/part_base.html:84 +#: part/templates/part/part_base.html:87 #, fuzzy #| msgid "Delete Parts" msgid "Delete part" msgstr "Teile löschen" -#: part/templates/part/part_base.html:124 templates/js/table_filters.js:121 +#: part/templates/part/part_base.html:127 templates/js/table_filters.js:121 msgid "In Stock" msgstr "Auf Lager" -#: part/templates/part/part_base.html:131 +#: part/templates/part/part_base.html:134 msgid "Allocated to Build Orders" msgstr "Zu Bauaufträgen zugeordnet" -#: part/templates/part/part_base.html:138 +#: part/templates/part/part_base.html:141 msgid "Allocated to Sales Orders" msgstr "Zu Aufträgen zugeordnet" -#: part/templates/part/part_base.html:160 templates/js/bom.js:260 +#: part/templates/part/part_base.html:163 templates/js/bom.js:260 msgid "Can Build" msgstr "Herstellbar?" -#: part/templates/part/part_base.html:166 +#: part/templates/part/part_base.html:169 msgid "Underway" msgstr "unterwegs" @@ -4072,7 +4086,7 @@ msgstr "Stückliste" msgid "Used In" msgstr "Benutzt in" -#: part/templates/part/tabs.html:61 stock/templates/stock/item_base.html:369 +#: part/templates/part/tabs.html:61 stock/templates/stock/item_base.html:373 msgid "Tests" msgstr "" @@ -4361,37 +4375,37 @@ msgstr "BOM-Position beaarbeiten" msgid "Confim BOM item deletion" msgstr "Löschung von BOM-Position bestätigen" -#: report/models.py:147 +#: report/models.py:153 #, fuzzy #| msgid "Template part" msgid "Template name" msgstr "Vorlagenteil" -#: report/models.py:153 +#: report/models.py:160 msgid "Report template file" msgstr "" -#: report/models.py:157 +#: report/models.py:167 #, fuzzy #| msgid "Supplier part description" msgid "Report template description" msgstr "Zuliefererbeschreibung des Teils" -#: report/models.py:161 +#: report/models.py:173 #, fuzzy #| msgid "Supplier part description" msgid "Report template is enabled" msgstr "Zuliefererbeschreibung des Teils" -#: report/models.py:168 +#: report/models.py:195 msgid "Part query filters (comma-separated list of key=value pairs)" msgstr "" -#: report/models.py:230 +#: report/models.py:244 msgid "Report asset file" msgstr "" -#: report/models.py:233 +#: report/models.py:247 #, fuzzy #| msgid "Settings description" msgid "Asset file description" @@ -4537,7 +4551,7 @@ msgstr "Lagerort" msgid "Where is this stock item located?" msgstr "Wo wird dieses Teil normalerweise gelagert?" -#: stock/models.py:389 stock/templates/stock/item_base.html:249 +#: stock/models.py:389 stock/templates/stock/item_base.html:253 msgid "Installed In" msgstr "Installiert in" @@ -4577,8 +4591,8 @@ msgstr "Bestellung für dieses Teil" msgid "Destination Sales Order" msgstr "Zielauftrag" -#: stock/models.py:461 stock/templates/stock/item_base.html:336 -#: templates/js/stock.js:612 +#: stock/models.py:461 stock/templates/stock/item_base.html:340 +#: templates/js/stock.js:613 #, fuzzy #| msgid "Export" msgid "Expiry Date" @@ -4816,165 +4830,171 @@ msgstr "" "aufgebraucht ist." #: stock/templates/stock/item_base.html:91 -#: stock/templates/stock/item_base.html:340 templates/js/table_filters.js:111 +#: stock/templates/stock/item_base.html:344 templates/js/table_filters.js:111 msgid "Expired" msgstr "" #: stock/templates/stock/item_base.html:95 -#: stock/templates/stock/item_base.html:342 templates/js/table_filters.js:116 +#: stock/templates/stock/item_base.html:346 templates/js/table_filters.js:116 msgid "Stale" msgstr "" -#: stock/templates/stock/item_base.html:130 templates/js/barcode.js:283 -#: templates/js/barcode.js:288 +#: stock/templates/stock/item_base.html:132 templates/js/barcode.js:312 +#: templates/js/barcode.js:317 msgid "Unlink Barcode" msgstr "" -#: stock/templates/stock/item_base.html:132 +#: stock/templates/stock/item_base.html:134 msgid "Link Barcode" msgstr "" -#: stock/templates/stock/item_base.html:140 +#: stock/templates/stock/item_base.html:136 templates/stock_table.html:31 +#, fuzzy +#| msgid "Stock Location" +msgid "Scan to Location" +msgstr "Lagerort" + +#: stock/templates/stock/item_base.html:144 #, fuzzy #| msgid "Source Location" msgid "Printing actions" msgstr "Quell-Standort" -#: stock/templates/stock/item_base.html:146 +#: stock/templates/stock/item_base.html:150 #: stock/templates/stock/item_tests.html:25 msgid "Test Report" msgstr "" -#: stock/templates/stock/item_base.html:156 +#: stock/templates/stock/item_base.html:160 #, fuzzy #| msgid "Confirm stock adjustment" msgid "Stock adjustment actions" msgstr "Bestands-Anpassung bestätigen" -#: stock/templates/stock/item_base.html:160 -#: stock/templates/stock/location.html:57 templates/stock_table.html:40 +#: stock/templates/stock/item_base.html:164 +#: stock/templates/stock/location.html:60 templates/stock_table.html:53 msgid "Count stock" msgstr "Bestand zählen" -#: stock/templates/stock/item_base.html:161 templates/stock_table.html:38 +#: stock/templates/stock/item_base.html:165 templates/stock_table.html:51 msgid "Add stock" msgstr "Bestand hinzufügen" -#: stock/templates/stock/item_base.html:162 templates/stock_table.html:39 +#: stock/templates/stock/item_base.html:166 templates/stock_table.html:52 msgid "Remove stock" msgstr "Bestand entfernen" -#: stock/templates/stock/item_base.html:164 +#: stock/templates/stock/item_base.html:168 #, fuzzy #| msgid "Order stock" msgid "Transfer stock" msgstr "Bestand bestellen" -#: stock/templates/stock/item_base.html:166 +#: stock/templates/stock/item_base.html:170 #, fuzzy #| msgid "Serialize Stock" msgid "Serialize stock" msgstr "Lagerbestand erfassen" -#: stock/templates/stock/item_base.html:170 +#: stock/templates/stock/item_base.html:174 #, fuzzy #| msgid "Item assigned to customer?" msgid "Assign to customer" msgstr "Ist dieses Objekt einem Kunden zugeteilt?" -#: stock/templates/stock/item_base.html:173 +#: stock/templates/stock/item_base.html:177 #, fuzzy #| msgid "Count stock" msgid "Return to stock" msgstr "Bestand zählen" -#: stock/templates/stock/item_base.html:177 templates/js/stock.js:1159 +#: stock/templates/stock/item_base.html:181 templates/js/stock.js:1177 #, fuzzy #| msgid "Installed in Stock Item" msgid "Uninstall stock item" msgstr "In Lagerobjekt installiert" -#: stock/templates/stock/item_base.html:177 +#: stock/templates/stock/item_base.html:181 msgid "Uninstall" msgstr "" -#: stock/templates/stock/item_base.html:186 -#: stock/templates/stock/location.html:54 +#: stock/templates/stock/item_base.html:190 +#: stock/templates/stock/location.html:57 #, fuzzy #| msgid "Stock Locations" msgid "Stock actions" msgstr "Lagerobjekt-Standorte" -#: stock/templates/stock/item_base.html:189 +#: stock/templates/stock/item_base.html:193 #, fuzzy #| msgid "Count stock items" msgid "Convert to variant" msgstr "Lagerobjekte zählen" -#: stock/templates/stock/item_base.html:192 +#: stock/templates/stock/item_base.html:196 #, fuzzy #| msgid "Count stock items" msgid "Duplicate stock item" msgstr "Lagerobjekte zählen" -#: stock/templates/stock/item_base.html:194 +#: stock/templates/stock/item_base.html:198 #, fuzzy #| msgid "Edit Stock Item" msgid "Edit stock item" msgstr "Lagerobjekt bearbeiten" -#: stock/templates/stock/item_base.html:197 +#: stock/templates/stock/item_base.html:201 #, fuzzy #| msgid "Delete Stock Item" msgid "Delete stock item" msgstr "Lagerobjekt löschen" -#: stock/templates/stock/item_base.html:209 +#: stock/templates/stock/item_base.html:213 msgid "Stock Item Details" msgstr "Lagerbestands-Details" -#: stock/templates/stock/item_base.html:268 templates/js/build.js:442 +#: stock/templates/stock/item_base.html:272 templates/js/build.js:442 #, fuzzy #| msgid "No stock location set" msgid "No location set" msgstr "Kein Lagerort gesetzt" -#: stock/templates/stock/item_base.html:275 +#: stock/templates/stock/item_base.html:279 #, fuzzy #| msgid "Unique Identifier" msgid "Barcode Identifier" msgstr "Eindeutiger Bezeichner" -#: stock/templates/stock/item_base.html:289 templates/js/build.js:642 +#: stock/templates/stock/item_base.html:293 templates/js/build.js:642 #: templates/navbar.html:25 msgid "Build" msgstr "Bau" -#: stock/templates/stock/item_base.html:310 +#: stock/templates/stock/item_base.html:314 msgid "Parent Item" msgstr "Elternposition" -#: stock/templates/stock/item_base.html:340 +#: stock/templates/stock/item_base.html:344 #, fuzzy #| msgid "This stock item is allocated to Build" msgid "This StockItem expired on" msgstr "Dieses Lagerobjekt ist dem Bau zugewiesen" -#: stock/templates/stock/item_base.html:342 +#: stock/templates/stock/item_base.html:346 #, fuzzy #| msgid "Child Stock Items" msgid "This StockItem expires on" msgstr "Kind-Lagerobjekte" -#: stock/templates/stock/item_base.html:349 templates/js/stock.js:618 +#: stock/templates/stock/item_base.html:353 templates/js/stock.js:619 msgid "Last Updated" msgstr "Zuletzt aktualisiert" -#: stock/templates/stock/item_base.html:354 +#: stock/templates/stock/item_base.html:358 msgid "Last Stocktake" msgstr "Letzte Inventur" -#: stock/templates/stock/item_base.html:358 +#: stock/templates/stock/item_base.html:362 msgid "No stocktake performed" msgstr "Keine Inventur ausgeführt" @@ -5052,58 +5072,58 @@ msgstr "" msgid "All stock items" msgstr "Alle Lagerobjekte" -#: stock/templates/stock/location.html:47 +#: stock/templates/stock/location.html:49 #, fuzzy #| msgid "Child Stock Items" msgid "Check-in Items" msgstr "Kind-Lagerobjekte" -#: stock/templates/stock/location.html:63 +#: stock/templates/stock/location.html:66 #, fuzzy #| msgid "Location Description" msgid "Location actions" msgstr "Standort-Beschreibung" -#: stock/templates/stock/location.html:65 +#: stock/templates/stock/location.html:68 #, fuzzy #| msgid "Edit stock location" msgid "Edit location" msgstr "Lagerort bearbeiten" -#: stock/templates/stock/location.html:67 +#: stock/templates/stock/location.html:70 #, fuzzy #| msgid "Delete stock location" msgid "Delete location" msgstr "Lagerort löschen" -#: stock/templates/stock/location.html:78 +#: stock/templates/stock/location.html:81 msgid "Location Details" msgstr "Standort-Details" -#: stock/templates/stock/location.html:83 +#: stock/templates/stock/location.html:86 msgid "Location Path" msgstr "Standord-Pfad" -#: stock/templates/stock/location.html:88 +#: stock/templates/stock/location.html:91 msgid "Location Description" msgstr "Standort-Beschreibung" -#: stock/templates/stock/location.html:93 +#: stock/templates/stock/location.html:96 msgid "Sublocations" msgstr "Sub-Standorte" -#: stock/templates/stock/location.html:98 -#: stock/templates/stock/location.html:113 +#: stock/templates/stock/location.html:101 +#: stock/templates/stock/location.html:116 #: templates/InvenTree/search_stock_items.html:6 templates/stats.html:48 #: templates/stats.html:57 users/models.py:35 msgid "Stock Items" msgstr "Lagerobjekte" -#: stock/templates/stock/location.html:103 +#: stock/templates/stock/location.html:106 msgid "Stock Details" msgstr "Objekt-Details" -#: stock/templates/stock/location.html:108 +#: stock/templates/stock/location.html:111 #: templates/InvenTree/search_stock_location.html:6 templates/stats.html:52 #: users/models.py:34 msgid "Stock Locations" @@ -5466,13 +5486,13 @@ msgstr "Keine Ergebnisse gefunden" msgid "Enter a search query" msgstr "Auftrag stornieren" -#: templates/InvenTree/search.html:191 templates/js/stock.js:300 +#: templates/InvenTree/search.html:191 templates/js/stock.js:301 #, fuzzy #| msgid "Item assigned to customer?" msgid "Shipped to customer" msgstr "Ist dieses Objekt einem Kunden zugeteilt?" -#: templates/InvenTree/search.html:194 templates/js/stock.js:310 +#: templates/InvenTree/search.html:194 templates/js/stock.js:311 msgid "No stock location set" msgstr "Kein Lagerort gesetzt" @@ -5528,6 +5548,12 @@ msgstr "Vorlage löschen" msgid "Global InvenTree Settings" msgstr "InvenTree-Version" +#: templates/InvenTree/settings/global.html:24 +#, fuzzy +#| msgid "Source Location" +msgid "Barcode Settings" +msgstr "Quell-Standort" + #: templates/InvenTree/settings/header.html:7 #, fuzzy #| msgid "Settings" @@ -5589,7 +5615,7 @@ msgstr "Auftragsdetails" msgid "Stock Settings" msgstr "Lagerobjekt-Standorte" -#: templates/InvenTree/settings/stock.html:13 templates/stock_table.html:33 +#: templates/InvenTree/settings/stock.html:13 templates/stock_table.html:46 #, fuzzy #| msgid "Stock Locations" msgid "Stock Options" @@ -5774,91 +5800,113 @@ msgstr "Quell-Standort" msgid "Enter barcode data" msgstr "Keine Strichcodedaten bereitgestellt" -#: templates/js/barcode.js:42 templates/js/modals.js:856 -msgid "Invalid server response" +#: templates/js/barcode.js:30 +msgid "Enter optional notes for stock transfer" msgstr "" -#: templates/js/barcode.js:143 -#, fuzzy -#| msgid "No barcode data provided" -msgid "Scan barcode data below" -msgstr "Keine Strichcodedaten bereitgestellt" - -#: templates/js/barcode.js:217 templates/js/barcode.js:263 -#, fuzzy -#| msgid "Unknown barcode format" -msgid "Unknown response from server" -msgstr "Unbekanntes Strichcode-Format" - -#: templates/js/barcode.js:239 -#, fuzzy -#| msgid "Parent Stock Item" -msgid "Link Barcode to Stock Item" -msgstr "Eltern-Lagerobjekt" - -#: templates/js/barcode.js:285 -msgid "" -"This will remove the association between this stock item and the barcode" -msgstr "" - -#: templates/js/barcode.js:291 -msgid "Unlink" -msgstr "" - -#: templates/js/barcode.js:350 -#, fuzzy -#| msgid "Remove stock" -msgid "Remove stock item" -msgstr "Bestand entfernen" - -#: templates/js/barcode.js:397 +#: templates/js/barcode.js:40 #, fuzzy #| msgid "Entry notes" msgid "Enter notes" msgstr "Eintrags-Notizen" -#: templates/js/barcode.js:399 -msgid "Enter optional notes for stock transfer" +#: templates/js/barcode.js:68 +msgid "Server error" msgstr "" -#: templates/js/barcode.js:404 +#: templates/js/barcode.js:89 +#, fuzzy +#| msgid "Unknown barcode format" +msgid "Unknown response from server" +msgstr "Unbekanntes Strichcode-Format" + +#: templates/js/barcode.js:116 templates/js/modals.js:856 +msgid "Invalid server response" +msgstr "" + +#: templates/js/barcode.js:215 +#, fuzzy +#| msgid "No barcode data provided" +msgid "Scan barcode data below" +msgstr "Keine Strichcodedaten bereitgestellt" + +#: templates/js/barcode.js:273 +msgid "No URL in response" +msgstr "" + +#: templates/js/barcode.js:291 +#, fuzzy +#| msgid "Parent Stock Item" +msgid "Link Barcode to Stock Item" +msgstr "Eltern-Lagerobjekt" + +#: templates/js/barcode.js:314 +msgid "" +"This will remove the association between this stock item and the barcode" +msgstr "" + +#: templates/js/barcode.js:320 +msgid "Unlink" +msgstr "" + +#: templates/js/barcode.js:379 +#, fuzzy +#| msgid "Remove stock" +msgid "Remove stock item" +msgstr "Bestand entfernen" + +#: templates/js/barcode.js:421 #, fuzzy #| msgid "Include stock items in sub locations" msgid "Check Stock Items into Location" msgstr "Lagerobjekte in untergeordneten Lagerorten einschließen" -#: templates/js/barcode.js:408 +#: templates/js/barcode.js:425 templates/js/barcode.js:550 msgid "Check In" msgstr "" -#: templates/js/barcode.js:466 -msgid "Server error" -msgstr "" +#: templates/js/barcode.js:465 templates/js/barcode.js:589 +#, fuzzy +#| msgid "Order stock" +msgid "Error transferring stock" +msgstr "Bestand bestellen" -#: templates/js/barcode.js:485 +#: templates/js/barcode.js:484 #, fuzzy #| msgid "Stock Item Details" msgid "Stock Item already scanned" msgstr "Lagerbestands-Details" -#: templates/js/barcode.js:489 +#: templates/js/barcode.js:488 #, fuzzy #| msgid "Include stock items in sub locations" msgid "Stock Item already in this location" msgstr "Lagerobjekte in untergeordneten Lagerorten einschließen" -#: templates/js/barcode.js:496 +#: templates/js/barcode.js:495 #, fuzzy #| msgid "Added stock to {n} items" msgid "Added stock item" msgstr "Vorrat zu {n} Lagerobjekten hinzugefügt" -#: templates/js/barcode.js:503 +#: templates/js/barcode.js:502 #, fuzzy #| msgid "Create new Stock Item" msgid "Barcode does not match Stock Item" msgstr "Neues Lagerobjekt hinzufügen" +#: templates/js/barcode.js:545 +#, fuzzy +#| msgid "Include stock items in sub locations" +msgid "Check Into Location" +msgstr "Lagerobjekte in untergeordneten Lagerorten einschließen" + +#: templates/js/barcode.js:608 +#, fuzzy +#| msgid "Create new Stock Item" +msgid "Barcode does not match a valid location" +msgstr "Neues Lagerobjekt hinzufügen" + #: templates/js/bom.js:165 msgid "Open subassembly" msgstr "Unterbaugruppe öffnen" @@ -5937,7 +5985,7 @@ msgstr "Lagerbestand dem Bau zuweisen" msgid "Delete build output" msgstr "Bau entfernt" -#: templates/js/build.js:209 templates/stock_table.html:18 +#: templates/js/build.js:209 templates/stock_table.html:20 msgid "New Stock Item" msgstr "Neues Lagerobjekt" @@ -5959,7 +6007,7 @@ msgstr "Anzahl" msgid "Build stock" msgstr "Baue" -#: templates/js/build.js:582 templates/stock_table.html:42 +#: templates/js/build.js:582 templates/stock_table.html:55 msgid "Order stock" msgstr "Bestand bestellen" @@ -6181,7 +6229,7 @@ msgstr "Keine Bestellungen gefunden" msgid "Order is overdue" msgstr "Bau-Zuweisung ist vollständig" -#: templates/js/order.js:193 templates/js/stock.js:844 +#: templates/js/order.js:193 templates/js/stock.js:862 msgid "Date" msgstr "Datum" @@ -6219,12 +6267,12 @@ msgstr "Verkäufliches Teil" msgid "No variants found" msgstr "Keine Teile gefunden" -#: templates/js/part.js:291 templates/js/part.js:457 +#: templates/js/part.js:291 templates/js/part.js:471 msgid "No parts found" msgstr "Keine Teile gefunden" -#: templates/js/part.js:343 templates/js/stock.js:473 -#: templates/js/stock.js:1191 +#: templates/js/part.js:343 templates/js/stock.js:474 +#: templates/js/stock.js:1209 msgid "Select" msgstr "Auswählen" @@ -6240,33 +6288,33 @@ msgstr "Bestand niedrig" msgid "Building" msgstr "Im Bau" -#: templates/js/part.js:517 +#: templates/js/part.js:531 msgid "YES" msgstr "" -#: templates/js/part.js:519 +#: templates/js/part.js:533 msgid "NO" msgstr "" -#: templates/js/part.js:553 +#: templates/js/part.js:567 #, fuzzy #| msgid "No stock items matching query" msgid "No test templates matching query" msgstr "Keine zur Anfrage passenden Lagerobjekte" -#: templates/js/part.js:604 templates/js/stock.js:74 +#: templates/js/part.js:618 templates/js/stock.js:75 #, fuzzy #| msgid "Edit Sales Order" msgid "Edit test result" msgstr "Auftrag bearbeiten" -#: templates/js/part.js:605 templates/js/stock.js:75 +#: templates/js/part.js:619 templates/js/stock.js:76 #, fuzzy #| msgid "Delete attachment" msgid "Delete test result" msgstr "Anhang löschen" -#: templates/js/part.js:611 +#: templates/js/part.js:625 msgid "This test is defined for a parent part" msgstr "" @@ -6294,179 +6342,179 @@ msgstr "Keine Teile gefunden" msgid "No report templates found which match selected stock item(s)" msgstr "Ausgewählte Stücklistenpositionen entfernen" -#: templates/js/stock.js:37 +#: templates/js/stock.js:38 msgid "PASS" msgstr "" -#: templates/js/stock.js:39 +#: templates/js/stock.js:40 msgid "FAIL" msgstr "" -#: templates/js/stock.js:44 +#: templates/js/stock.js:45 msgid "NO RESULT" msgstr "" -#: templates/js/stock.js:70 +#: templates/js/stock.js:71 #, fuzzy #| msgid "Edit Sales Order" msgid "Add test result" msgstr "Auftrag bearbeiten" -#: templates/js/stock.js:89 +#: templates/js/stock.js:90 #, fuzzy #| msgid "No results found" msgid "No test results found" msgstr "Keine Ergebnisse gefunden" -#: templates/js/stock.js:131 +#: templates/js/stock.js:132 #, fuzzy #| msgid "Shipment Date" msgid "Test Date" msgstr "Versanddatum" -#: templates/js/stock.js:292 +#: templates/js/stock.js:293 msgid "In production" msgstr "" -#: templates/js/stock.js:296 +#: templates/js/stock.js:297 #, fuzzy #| msgid "Installed in Stock Item" msgid "Installed in Stock Item" msgstr "In Lagerobjekt installiert" -#: templates/js/stock.js:304 +#: templates/js/stock.js:305 #, fuzzy #| msgid "Item assigned to customer?" msgid "Assigned to Sales Order" msgstr "Ist dieses Objekt einem Kunden zugeteilt?" -#: templates/js/stock.js:324 +#: templates/js/stock.js:325 msgid "No stock items matching query" msgstr "Keine zur Anfrage passenden Lagerobjekte" -#: templates/js/stock.js:441 +#: templates/js/stock.js:442 #, fuzzy #| msgid "Include sublocations" msgid "Undefined location" msgstr "Unterlagerorte einschließen" -#: templates/js/stock.js:535 +#: templates/js/stock.js:536 #, fuzzy #| msgid "StockItem is lost" msgid "Stock item is in production" msgstr "Lagerobjekt verloren" -#: templates/js/stock.js:540 +#: templates/js/stock.js:541 #, fuzzy #| msgid "This stock item is allocated to Sales Order" msgid "Stock item assigned to sales order" msgstr "Dieses Lagerobjekt ist dem Auftrag zugewiesen" -#: templates/js/stock.js:543 +#: templates/js/stock.js:544 #, fuzzy #| msgid "StockItem has been allocated" msgid "Stock item assigned to customer" msgstr "Lagerobjekt wurde zugewiesen" -#: templates/js/stock.js:547 +#: templates/js/stock.js:548 #, fuzzy #| msgid "StockItem has been allocated" msgid "Stock item has expired" msgstr "Lagerobjekt wurde zugewiesen" -#: templates/js/stock.js:549 +#: templates/js/stock.js:550 #, fuzzy #| msgid "StockItem is lost" msgid "Stock item will expire soon" msgstr "Lagerobjekt verloren" -#: templates/js/stock.js:553 +#: templates/js/stock.js:554 #, fuzzy #| msgid "StockItem has been allocated" msgid "Stock item has been allocated" msgstr "Lagerobjekt wurde zugewiesen" -#: templates/js/stock.js:557 +#: templates/js/stock.js:558 #, 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.js:565 +#: templates/js/stock.js:566 #, fuzzy #| msgid "StockItem has been allocated" msgid "Stock item has been rejected" msgstr "Lagerobjekt wurde zugewiesen" -#: templates/js/stock.js:569 +#: templates/js/stock.js:570 #, fuzzy #| msgid "StockItem is lost" msgid "Stock item is lost" msgstr "Lagerobjekt verloren" -#: templates/js/stock.js:572 +#: templates/js/stock.js:573 #, fuzzy #| msgid "StockItem is lost" msgid "Stock item is destroyed" msgstr "Lagerobjekt verloren" -#: templates/js/stock.js:576 templates/js/table_filters.js:106 +#: templates/js/stock.js:577 templates/js/table_filters.js:106 #, fuzzy #| msgid "Delete" msgid "Depleted" msgstr "Löschen" -#: templates/js/stock.js:605 +#: templates/js/stock.js:606 #, fuzzy #| msgid "Last Stocktake" msgid "Stocktake" msgstr "Letzte Inventur" -#: templates/js/stock.js:760 +#: templates/js/stock.js:778 #, fuzzy #| msgid "Stock status" msgid "Stock Status" msgstr "Bestandsstatus" -#: templates/js/stock.js:775 +#: templates/js/stock.js:793 #, fuzzy #| msgid "Stock status" msgid "Set Stock Status" msgstr "Bestandsstatus" -#: templates/js/stock.js:789 +#: templates/js/stock.js:807 #, fuzzy #| msgid "Select part to build" msgid "Select Status Code" msgstr "Teil für den Bau wählen" -#: templates/js/stock.js:790 +#: templates/js/stock.js:808 #, fuzzy #| msgid "StockItem has been allocated" msgid "Status code must be selected" msgstr "Lagerobjekt wurde zugewiesen" -#: templates/js/stock.js:910 +#: templates/js/stock.js:928 msgid "No user information" msgstr "Keine Benutzerinformation" -#: templates/js/stock.js:1030 +#: templates/js/stock.js:1048 msgid "Create New Location" msgstr "Neuen Standort anlegen" -#: templates/js/stock.js:1129 +#: templates/js/stock.js:1147 #, fuzzy #| msgid "Serial Number" msgid "Serial" msgstr "Seriennummer" -#: templates/js/stock.js:1222 templates/js/table_filters.js:131 +#: templates/js/stock.js:1240 templates/js/table_filters.js:131 #, fuzzy #| msgid "Installed In" msgid "Installed" msgstr "Installiert in" -#: templates/js/stock.js:1247 +#: templates/js/stock.js:1265 #, fuzzy #| msgid "Installed In" msgid "Install item" @@ -6715,81 +6763,87 @@ msgstr "" msgid "Issues detected" msgstr "Bestellung aufgeben" -#: templates/stock_table.html:12 +#: templates/stock_table.html:14 #, fuzzy #| msgid "Edit Stock Location" msgid "Export Stock Information" msgstr "Lagerobjekt-Standort bearbeiten" -#: templates/stock_table.html:23 +#: templates/stock_table.html:27 +#, fuzzy +#| msgid "Source Location" +msgid "Barcode Actions" +msgstr "Quell-Standort" + +#: templates/stock_table.html:36 #, fuzzy #| msgid "Source Location" msgid "Printing Actions" msgstr "Quell-Standort" -#: templates/stock_table.html:27 +#: templates/stock_table.html:40 msgid "Print labels" msgstr "" -#: templates/stock_table.html:28 +#: templates/stock_table.html:41 #, fuzzy #| msgid "Parameter Template" msgid "Print test reports" msgstr "Parameter Vorlage" -#: templates/stock_table.html:38 +#: templates/stock_table.html:51 #, fuzzy #| msgid "Added stock to {n} items" msgid "Add to selected stock items" msgstr "Vorrat zu {n} Lagerobjekten hinzugefügt" -#: templates/stock_table.html:39 +#: templates/stock_table.html:52 #, fuzzy #| msgid "Remove selected BOM items" msgid "Remove from selected stock items" msgstr "Ausgewählte Stücklistenpositionen entfernen" -#: templates/stock_table.html:40 +#: templates/stock_table.html:53 #, fuzzy #| msgid "Delete Stock Item" msgid "Stocktake selected stock items" msgstr "Lagerobjekt löschen" -#: templates/stock_table.html:41 +#: templates/stock_table.html:54 #, fuzzy #| msgid "Delete Stock Item" msgid "Move selected stock items" msgstr "Lagerobjekt löschen" -#: templates/stock_table.html:41 +#: templates/stock_table.html:54 msgid "Move stock" msgstr "Bestand bewegen" -#: templates/stock_table.html:42 +#: templates/stock_table.html:55 #, fuzzy #| msgid "Remove selected BOM items" msgid "Order selected items" msgstr "Ausgewählte Stücklistenpositionen entfernen" -#: templates/stock_table.html:43 +#: templates/stock_table.html:56 #, fuzzy #| msgid "Settings" msgid "Change status" msgstr "Einstellungen" -#: templates/stock_table.html:43 +#: templates/stock_table.html:56 #, fuzzy #| msgid "Stock status" msgid "Change stock status" msgstr "Bestandsstatus" -#: templates/stock_table.html:46 +#: templates/stock_table.html:59 #, fuzzy #| msgid "Delete line item" msgid "Delete selected items" msgstr "Position löschen" -#: templates/stock_table.html:46 +#: templates/stock_table.html:59 msgid "Delete Stock" msgstr "Bestand löschen" diff --git a/InvenTree/locale/en/LC_MESSAGES/django.po b/InvenTree/locale/en/LC_MESSAGES/django.po index b983bde6a4..b12c0597d8 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: 2021-01-18 23:24+1100\n" +"POT-Creation-Date: 2021-01-28 22:37+1100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -54,7 +54,7 @@ msgstr "" msgid "Select Category" msgstr "" -#: InvenTree/helpers.py:361 order/models.py:232 order/models.py:330 +#: InvenTree/helpers.py:361 order/models.py:232 order/models.py:331 #: stock/views.py:1778 msgid "Invalid quantity provided" msgstr "" @@ -95,12 +95,13 @@ msgstr "" msgid "File comment" msgstr "" -#: InvenTree/models.py:68 templates/js/stock.js:901 +#: InvenTree/models.py:68 templates/js/stock.js:919 msgid "User" msgstr "" -#: InvenTree/models.py:106 label/models.py:68 part/models.py:647 -#: part/templates/part/params.html:24 templates/js/part.js:129 +#: InvenTree/models.py:106 label/models.py:68 part/models.py:654 +#: part/templates/part/params.html:24 report/models.py:152 +#: templates/js/part.js:129 msgid "Name" msgstr "" @@ -306,7 +307,7 @@ msgstr "" #: build/forms.py:78 build/templates/build/auto_allocate.html:17 #: build/templates/build/build_base.html:83 -#: build/templates/build/detail.html:29 common/models.py:603 +#: build/templates/build/detail.html:29 common/models.py:610 #: company/forms.py:112 company/templates/company/supplier_part_pricing.html:75 #: order/templates/order/order_wizard/select_parts.html:32 #: order/templates/order/purchase_order_detail.html:179 @@ -317,10 +318,10 @@ msgstr "" #: part/templates/part/sale_prices.html:82 stock/forms.py:306 #: stock/templates/stock/item_base.html:51 #: stock/templates/stock/item_base.html:57 -#: stock/templates/stock/item_base.html:234 -#: stock/templates/stock/stock_adjust.html:18 templates/js/barcode.js:338 -#: templates/js/bom.js:195 templates/js/build.js:420 templates/js/stock.js:892 -#: templates/js/stock.js:1131 +#: stock/templates/stock/item_base.html:238 +#: stock/templates/stock/stock_adjust.html:18 templates/js/barcode.js:367 +#: templates/js/bom.js:195 templates/js/build.js:420 templates/js/stock.js:910 +#: templates/js/stock.js:1149 msgid "Quantity" msgstr "" @@ -402,14 +403,14 @@ msgstr "" #: company/models.py:359 company/templates/company/detail.html:23 #: company/templates/company/supplier_part_base.html:61 #: company/templates/company/supplier_part_detail.html:27 label/models.py:75 -#: order/templates/order/purchase_order_detail.html:161 part/models.py:671 +#: order/templates/order/purchase_order_detail.html:161 part/models.py:678 #: part/templates/part/detail.html:51 part/templates/part/set_category.html:14 -#: templates/InvenTree/search.html:147 +#: report/models.py:166 templates/InvenTree/search.html:147 #: templates/InvenTree/settings/header.html:9 templates/js/bom.js:180 #: templates/js/bom.js:547 templates/js/build.js:664 templates/js/company.js:56 #: templates/js/order.js:180 templates/js/order.js:274 templates/js/part.js:188 -#: templates/js/part.js:271 templates/js/part.js:391 templates/js/part.js:572 -#: templates/js/stock.js:511 templates/js/stock.js:873 +#: templates/js/part.js:271 templates/js/part.js:391 templates/js/part.js:586 +#: templates/js/stock.js:512 templates/js/stock.js:891 msgid "Description" msgstr "" @@ -428,16 +429,16 @@ msgstr "" #: build/models.py:134 build/templates/build/auto_allocate.html:16 #: build/templates/build/build_base.html:78 -#: build/templates/build/detail.html:24 order/models.py:651 +#: build/templates/build/detail.html:24 order/models.py:652 #: order/templates/order/order_wizard/select_parts.html:30 #: order/templates/order/purchase_order_detail.html:148 -#: order/templates/order/receive_parts.html:19 part/models.py:316 +#: order/templates/order/receive_parts.html:19 part/models.py:320 #: part/templates/part/part_app_base.html:7 part/templates/part/related.html:26 #: part/templates/part/set_category.html:13 templates/InvenTree/search.html:133 -#: templates/js/barcode.js:336 templates/js/bom.js:153 templates/js/bom.js:532 +#: templates/js/barcode.js:365 templates/js/bom.js:153 templates/js/bom.js:532 #: templates/js/build.js:669 templates/js/company.js:138 -#: templates/js/part.js:252 templates/js/part.js:357 templates/js/stock.js:485 -#: templates/js/stock.js:1203 +#: templates/js/part.js:252 templates/js/part.js:357 templates/js/stock.js:486 +#: templates/js/stock.js:1221 msgid "Part" msgstr "" @@ -487,7 +488,7 @@ msgstr "" msgid "Number of stock items which have been completed" msgstr "" -#: build/models.py:186 part/templates/part/part_base.html:155 +#: build/models.py:186 part/templates/part/part_base.html:158 msgid "Build Status" msgstr "" @@ -503,30 +504,30 @@ msgstr "" msgid "Batch code for this build output" msgstr "" -#: build/models.py:205 order/models.py:436 +#: build/models.py:205 order/models.py:437 msgid "Target completion date" msgstr "" #: build/models.py:219 build/templates/build/detail.html:89 #: company/templates/company/supplier_part_base.html:68 #: company/templates/company/supplier_part_detail.html:24 -#: part/templates/part/detail.html:80 part/templates/part/part_base.html:102 -#: stock/models.py:412 stock/templates/stock/item_base.html:317 +#: part/templates/part/detail.html:80 part/templates/part/part_base.html:105 +#: stock/models.py:412 stock/templates/stock/item_base.html:321 msgid "External Link" msgstr "" -#: build/models.py:220 part/models.py:705 stock/models.py:414 +#: build/models.py:220 part/models.py:712 stock/models.py:414 msgid "Link to external URL" msgstr "" #: build/models.py:224 build/templates/build/tabs.html:23 company/models.py:366 #: company/templates/company/tabs.html:33 order/templates/order/po_tabs.html:18 #: order/templates/order/purchase_order_detail.html:213 -#: order/templates/order/so_tabs.html:23 part/models.py:831 +#: order/templates/order/so_tabs.html:23 part/models.py:838 #: part/templates/part/tabs.html:73 stock/forms.py:315 stock/forms.py:347 #: stock/forms.py:375 stock/models.py:484 stock/models.py:1554 -#: stock/templates/stock/tabs.html:26 templates/js/barcode.js:391 -#: templates/js/bom.js:293 templates/js/stock.js:127 templates/js/stock.js:623 +#: stock/templates/stock/tabs.html:26 templates/js/barcode.js:34 +#: templates/js/bom.js:293 templates/js/stock.js:128 templates/js/stock.js:624 msgid "Notes" msgstr "" @@ -534,65 +535,65 @@ msgstr "" msgid "Extra build notes" msgstr "" -#: build/models.py:610 +#: build/models.py:607 msgid "No build output specified" msgstr "" -#: build/models.py:613 +#: build/models.py:610 msgid "Build output is already completed" msgstr "" -#: build/models.py:616 +#: build/models.py:613 msgid "Build output does not match Build Order" msgstr "" -#: build/models.py:691 +#: build/models.py:688 msgid "Completed build output" msgstr "" -#: build/models.py:933 +#: build/models.py:930 msgid "BuildItem must be unique for build, stock_item and install_into" msgstr "" -#: build/models.py:955 +#: build/models.py:952 msgid "Build item must specify a build output" msgstr "" -#: build/models.py:960 +#: build/models.py:957 #, python-brace-format msgid "Selected stock item not found in BOM for part '{p}'" msgstr "" -#: build/models.py:964 +#: build/models.py:961 #, python-brace-format msgid "Allocated quantity ({n}) must not exceed available quantity ({q})" msgstr "" -#: build/models.py:971 order/models.py:735 +#: build/models.py:968 order/models.py:736 msgid "StockItem is over-allocated" msgstr "" -#: build/models.py:975 order/models.py:738 +#: build/models.py:972 order/models.py:739 msgid "Allocation quantity must be greater than zero" msgstr "" -#: build/models.py:979 +#: build/models.py:976 msgid "Quantity must be 1 for serialized stock" msgstr "" -#: build/models.py:1019 +#: build/models.py:1016 msgid "Build to allocate parts" msgstr "" -#: build/models.py:1026 +#: build/models.py:1023 msgid "Source stock item" msgstr "" -#: build/models.py:1038 +#: build/models.py:1035 msgid "Stock quantity to allocate to build" msgstr "" -#: build/models.py:1046 +#: build/models.py:1043 msgid "Destination stock item" msgstr "" @@ -658,10 +659,11 @@ msgid "" msgstr "" #: build/templates/build/auto_allocate.html:18 stock/forms.py:345 -#: stock/templates/stock/item_base.html:264 +#: stock/templates/stock/item_base.html:268 #: stock/templates/stock/stock_adjust.html:17 -#: templates/InvenTree/search.html:183 templates/js/barcode.js:337 -#: templates/js/build.js:434 templates/js/stock.js:597 +#: templates/InvenTree/search.html:183 templates/js/barcode.js:366 +#: templates/js/barcode.js:534 templates/js/build.js:434 +#: templates/js/stock.js:598 msgid "Location" msgstr "" @@ -725,10 +727,10 @@ msgstr "" #: build/templates/build/build_base.html:88 #: build/templates/build/detail.html:57 #: order/templates/order/receive_parts.html:24 -#: stock/templates/stock/item_base.html:363 templates/InvenTree/search.html:175 -#: templates/js/barcode.js:42 templates/js/build.js:697 +#: stock/templates/stock/item_base.html:367 templates/InvenTree/search.html:175 +#: templates/js/barcode.js:116 templates/js/build.js:697 #: templates/js/order.js:185 templates/js/order.js:279 -#: templates/js/stock.js:584 templates/js/stock.js:1139 +#: templates/js/stock.js:585 templates/js/stock.js:1157 msgid "Status" msgstr "" @@ -750,13 +752,13 @@ msgid "Progress" msgstr "" #: build/templates/build/build_base.html:120 -#: build/templates/build/detail.html:82 order/models.py:649 +#: build/templates/build/detail.html:82 order/models.py:650 #: 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:258 templates/js/order.js:240 +#: stock/templates/stock/item_base.html:262 templates/js/order.js:240 msgid "Sales Order" msgstr "" @@ -857,8 +859,8 @@ msgid "Destination location not specified" msgstr "" #: build/templates/build/detail.html:68 -#: stock/templates/stock/item_base.html:282 templates/js/stock.js:592 -#: templates/js/stock.js:1146 templates/js/table_filters.js:80 +#: stock/templates/stock/item_base.html:286 templates/js/stock.js:593 +#: templates/js/stock.js:1164 templates/js/table_filters.js:80 #: templates/js/table_filters.js:161 msgid "Batch" msgstr "" @@ -1112,233 +1114,242 @@ msgid "Default currency" msgstr "" #: common/models.py:75 -msgid "IPN Regex" +msgid "Barcode Support" msgstr "" #: common/models.py:76 +msgid "Enable barcode scanner support" +msgstr "" + +#: common/models.py:82 +msgid "IPN Regex" +msgstr "" + +#: common/models.py:83 msgid "Regular expression pattern for matching Part IPN" msgstr "" -#: common/models.py:80 +#: common/models.py:87 msgid "Allow Duplicate IPN" msgstr "" -#: common/models.py:81 +#: common/models.py:88 msgid "Allow multiple parts to share the same IPN" msgstr "" -#: common/models.py:87 +#: common/models.py:94 msgid "Copy Part BOM Data" msgstr "" -#: common/models.py:88 +#: common/models.py:95 msgid "Copy BOM data by default when duplicating a part" msgstr "" -#: common/models.py:94 +#: common/models.py:101 msgid "Copy Part Parameter Data" msgstr "" -#: common/models.py:95 +#: common/models.py:102 msgid "Copy parameter data by default when duplicating a part" msgstr "" -#: common/models.py:101 +#: common/models.py:108 msgid "Copy Part Test Data" msgstr "" -#: common/models.py:102 +#: common/models.py:109 msgid "Copy test data by default when duplicating a part" msgstr "" -#: common/models.py:108 +#: common/models.py:115 msgid "Copy Category Parameter Templates" msgstr "" -#: common/models.py:109 +#: common/models.py:116 msgid "Copy category parameter templates when creating a part" msgstr "" -#: common/models.py:115 part/templates/part/detail.html:155 stock/forms.py:257 -#: templates/js/table_filters.js:23 templates/js/table_filters.js:270 +#: common/models.py:122 part/templates/part/detail.html:155 +#: report/models.py:159 stock/forms.py:257 templates/js/table_filters.js:23 +#: templates/js/table_filters.js:270 msgid "Template" msgstr "" -#: common/models.py:116 +#: common/models.py:123 msgid "Parts are templates by default" msgstr "" -#: common/models.py:122 part/models.py:794 part/templates/part/detail.html:165 +#: common/models.py:129 part/models.py:801 part/templates/part/detail.html:165 #: templates/js/table_filters.js:282 msgid "Assembly" msgstr "" -#: common/models.py:123 +#: common/models.py:130 msgid "Parts can be assembled from other components by default" msgstr "" -#: common/models.py:129 part/models.py:800 part/templates/part/detail.html:175 +#: common/models.py:136 part/models.py:807 part/templates/part/detail.html:175 #: templates/js/table_filters.js:286 msgid "Component" msgstr "" -#: common/models.py:130 +#: common/models.py:137 msgid "Parts can be used as sub-components by default" msgstr "" -#: common/models.py:136 part/models.py:811 part/templates/part/detail.html:195 +#: common/models.py:143 part/models.py:818 part/templates/part/detail.html:195 msgid "Purchaseable" msgstr "" -#: common/models.py:137 +#: common/models.py:144 msgid "Parts are purchaseable by default" msgstr "" -#: common/models.py:143 part/models.py:816 part/templates/part/detail.html:205 +#: common/models.py:150 part/models.py:823 part/templates/part/detail.html:205 #: templates/js/table_filters.js:294 msgid "Salable" msgstr "" -#: common/models.py:144 +#: common/models.py:151 msgid "Parts are salable by default" msgstr "" -#: common/models.py:150 part/models.py:806 part/templates/part/detail.html:185 +#: common/models.py:157 part/models.py:813 part/templates/part/detail.html:185 #: templates/js/table_filters.js:31 templates/js/table_filters.js:298 msgid "Trackable" msgstr "" -#: common/models.py:151 +#: common/models.py:158 msgid "Parts are trackable by default" msgstr "" -#: common/models.py:157 part/models.py:826 part/templates/part/detail.html:145 +#: common/models.py:164 part/models.py:833 part/templates/part/detail.html:145 #: templates/js/table_filters.js:27 msgid "Virtual" msgstr "" -#: common/models.py:158 +#: common/models.py:165 msgid "Parts are virtual by default" msgstr "" -#: common/models.py:164 +#: common/models.py:171 msgid "Show Quantity in Forms" msgstr "" -#: common/models.py:165 +#: common/models.py:172 msgid "Display available part quantity in some forms" msgstr "" -#: common/models.py:171 +#: common/models.py:178 msgid "Stock Expiry" msgstr "" -#: common/models.py:172 +#: common/models.py:179 msgid "Enable stock expiry functionality" msgstr "" -#: common/models.py:178 +#: common/models.py:185 msgid "Sell Expired Stock" msgstr "" -#: common/models.py:179 +#: common/models.py:186 msgid "Allow sale of expired stock" msgstr "" -#: common/models.py:185 +#: common/models.py:192 msgid "Stock Stale Time" msgstr "" -#: common/models.py:186 +#: common/models.py:193 msgid "Number of days stock items are considered stale before expiring" msgstr "" -#: common/models.py:188 part/templates/part/detail.html:116 +#: common/models.py:195 part/templates/part/detail.html:116 msgid "days" msgstr "" -#: common/models.py:193 +#: common/models.py:200 msgid "Build Expired Stock" msgstr "" -#: common/models.py:194 +#: common/models.py:201 msgid "Allow building with expired stock" msgstr "" -#: common/models.py:200 +#: common/models.py:207 msgid "Stock Ownership Control" msgstr "" -#: common/models.py:201 +#: common/models.py:208 msgid "Enable ownership control over stock locations and items" msgstr "" -#: common/models.py:207 +#: common/models.py:214 msgid "Build Order Reference Prefix" msgstr "" -#: common/models.py:208 +#: common/models.py:215 msgid "Prefix value for build order reference" msgstr "" -#: common/models.py:213 +#: common/models.py:220 msgid "Build Order Reference Regex" msgstr "" -#: common/models.py:214 +#: common/models.py:221 msgid "Regular expression pattern for matching build order reference" msgstr "" -#: common/models.py:218 +#: common/models.py:225 msgid "Sales Order Reference Prefix" msgstr "" -#: common/models.py:219 +#: common/models.py:226 msgid "Prefix value for sales order reference" msgstr "" -#: common/models.py:224 +#: common/models.py:231 msgid "Purchase Order Reference Prefix" msgstr "" -#: common/models.py:225 +#: common/models.py:232 msgid "Prefix value for purchase order reference" msgstr "" -#: common/models.py:448 +#: common/models.py:455 msgid "Settings key (must be unique - case insensitive" msgstr "" -#: common/models.py:450 +#: common/models.py:457 msgid "Settings value" msgstr "" -#: common/models.py:507 +#: common/models.py:514 msgid "Value must be a boolean value" msgstr "" -#: common/models.py:517 +#: common/models.py:524 msgid "Value must be an integer value" msgstr "" -#: common/models.py:531 +#: common/models.py:538 msgid "Key string must be unique" msgstr "" -#: common/models.py:604 company/forms.py:113 +#: common/models.py:611 company/forms.py:113 msgid "Price break quantity" msgstr "" -#: common/models.py:612 company/templates/company/supplier_part_pricing.html:80 +#: common/models.py:619 company/templates/company/supplier_part_pricing.html:80 #: part/templates/part/sale_prices.html:87 templates/js/bom.js:245 msgid "Price" msgstr "" -#: common/models.py:613 +#: common/models.py:620 msgid "Unit price at specified quantity" msgstr "" -#: common/models.py:636 +#: common/models.py:643 msgid "Default" msgstr "" @@ -1440,7 +1451,7 @@ msgid "Currency" msgstr "" #: company/models.py:313 stock/models.py:366 -#: stock/templates/stock/item_base.html:214 +#: stock/templates/stock/item_base.html:218 msgid "Base Part" msgstr "" @@ -1453,7 +1464,7 @@ msgstr "" #: company/templates/company/supplier_part_detail.html:21 #: order/templates/order/order_base.html:89 #: order/templates/order/order_wizard/select_pos.html:30 part/bom.py:170 -#: stock/templates/stock/item_base.html:324 templates/js/company.js:48 +#: stock/templates/stock/item_base.html:328 templates/js/company.js:48 #: templates/js/company.js:164 templates/js/order.js:167 msgid "Supplier" msgstr "" @@ -1492,7 +1503,8 @@ msgstr "" msgid "Manufacturer part number" msgstr "" -#: company/models.py:353 part/models.py:704 templates/js/company.js:208 +#: company/models.py:353 part/models.py:711 templates/js/company.js:208 +#: templates/js/part.js:451 msgid "Link" msgstr "" @@ -1550,7 +1562,7 @@ msgstr "" #: company/templates/company/detail.html:62 #: order/templates/order/sales_order_base.html:89 stock/models.py:401 -#: stock/models.py:402 stock/templates/stock/item_base.html:241 +#: stock/models.py:402 stock/templates/stock/item_base.html:245 #: templates/js/company.js:40 templates/js/order.js:261 msgid "Customer" msgstr "" @@ -1566,7 +1578,7 @@ msgstr "" #: company/templates/company/detail_part.html:18 #: order/templates/order/purchase_order_detail.html:68 -#: part/templates/part/supplier.html:14 templates/js/stock.js:1023 +#: part/templates/part/supplier.html:14 templates/js/stock.js:1041 msgid "New Supplier Part" msgstr "" @@ -1590,7 +1602,7 @@ msgstr "" #: company/templates/company/detail_part.html:63 #: part/templates/part/bom.html:182 part/templates/part/category.html:116 -#: templates/js/stock.js:1017 +#: templates/js/stock.js:1035 msgid "New Part" msgstr "" @@ -1682,12 +1694,12 @@ msgstr "" #: company/templates/company/supplier_part_base.html:6 #: company/templates/company/supplier_part_base.html:19 stock/models.py:375 -#: stock/templates/stock/item_base.html:329 templates/js/company.js:180 +#: stock/templates/stock/item_base.html:333 templates/js/company.js:180 msgid "Supplier Part" msgstr "" #: company/templates/company/supplier_part_base.html:26 -#: part/templates/part/orders.html:14 part/templates/part/part_base.html:66 +#: part/templates/part/orders.html:14 part/templates/part/part_base.html:69 msgid "Order part" msgstr "" @@ -1754,7 +1766,7 @@ msgstr "" #: company/templates/company/tabs.html:12 part/templates/part/tabs.html:18 #: stock/templates/stock/location.html:29 templates/InvenTree/search.html:155 #: templates/InvenTree/settings/tabs.html:25 templates/js/part.js:192 -#: templates/js/part.js:418 templates/js/stock.js:519 templates/navbar.html:22 +#: templates/js/part.js:418 templates/js/stock.js:520 templates/navbar.html:22 msgid "Stock" msgstr "" @@ -1763,7 +1775,7 @@ msgid "Orders" msgstr "" #: company/templates/company/tabs.html:9 -#: order/templates/order/receive_parts.html:14 part/models.py:317 +#: order/templates/order/receive_parts.html:14 part/models.py:321 #: part/templates/part/cat_link.html:7 part/templates/part/category.html:94 #: part/templates/part/category_tabs.html:6 #: templates/InvenTree/settings/tabs.html:22 templates/navbar.html:19 @@ -1836,7 +1848,7 @@ msgstr "" msgid "Edit Supplier Part" msgstr "" -#: company/views.py:295 templates/js/stock.js:1024 +#: company/views.py:295 templates/js/stock.js:1042 msgid "Create new Supplier Part" msgstr "" @@ -1884,7 +1896,7 @@ msgstr "" msgid "Label template file" msgstr "" -#: label/models.py:90 report/models.py:162 +#: label/models.py:90 report/models.py:172 msgid "Enabled" msgstr "" @@ -1896,7 +1908,7 @@ msgstr "" msgid "Query filters (comma-separated list of key=value pairs" msgstr "" -#: label/models.py:138 label/models.py:191 +#: label/models.py:138 label/models.py:191 report/models.py:194 msgid "Filters" msgstr "" @@ -1933,7 +1945,7 @@ msgstr "" msgid "Enter sales order number" msgstr "" -#: order/forms.py:140 order/models.py:437 +#: order/forms.py:140 order/models.py:438 msgid "" "Target date for order completion. Order will be overdue after this date." msgstr "" @@ -1954,7 +1966,7 @@ msgstr "" msgid "Order notes" msgstr "" -#: order/models.py:171 order/models.py:430 +#: order/models.py:171 order/models.py:431 msgid "Purchase order status" msgstr "" @@ -1991,7 +2003,7 @@ msgstr "" msgid "Date order was completed" msgstr "" -#: order/models.py:230 order/models.py:328 part/views.py:1506 +#: order/models.py:230 order/models.py:329 part/views.py:1506 #: stock/models.py:265 stock/models.py:881 msgid "Quantity must be greater than zero" msgstr "" @@ -2000,78 +2012,78 @@ msgstr "" msgid "Part supplier must match PO supplier" msgstr "" -#: order/models.py:323 +#: order/models.py:324 msgid "Lines can only be received against an order marked as 'Placed'" msgstr "" -#: order/models.py:426 +#: order/models.py:427 msgid "Company to which the items are being sold" msgstr "" -#: order/models.py:432 +#: order/models.py:433 msgid "Customer order reference code" msgstr "" -#: order/models.py:490 +#: order/models.py:491 msgid "SalesOrder cannot be shipped as it is not currently pending" msgstr "" -#: order/models.py:577 +#: order/models.py:578 msgid "Item quantity" msgstr "" -#: order/models.py:579 +#: order/models.py:580 msgid "Line item reference" msgstr "" -#: order/models.py:581 +#: order/models.py:582 msgid "Line item notes" msgstr "" -#: order/models.py:607 order/templates/order/order_base.html:9 +#: order/models.py:608 order/templates/order/order_base.html:9 #: order/templates/order/order_base.html:24 -#: stock/templates/stock/item_base.html:296 templates/js/order.js:145 +#: stock/templates/stock/item_base.html:300 templates/js/order.js:145 msgid "Purchase Order" msgstr "" -#: order/models.py:620 +#: order/models.py:621 msgid "Supplier part" msgstr "" -#: order/models.py:623 +#: order/models.py:624 msgid "Number of items received" msgstr "" -#: order/models.py:630 stock/models.py:494 -#: stock/templates/stock/item_base.html:303 +#: order/models.py:631 stock/models.py:494 +#: stock/templates/stock/item_base.html:307 msgid "Purchase Price" msgstr "" -#: order/models.py:631 +#: order/models.py:632 msgid "Unit purchase price" msgstr "" -#: order/models.py:726 +#: order/models.py:727 msgid "Cannot allocate stock item to a line with a different part" msgstr "" -#: order/models.py:728 +#: order/models.py:729 msgid "Cannot allocate stock to a line without a part" msgstr "" -#: order/models.py:731 +#: order/models.py:732 msgid "Allocation quantity cannot exceed stock quantity" msgstr "" -#: order/models.py:741 +#: order/models.py:742 msgid "Quantity must be 1 for serialized stock item" msgstr "" -#: order/models.py:757 +#: order/models.py:758 msgid "Select stock item to allocate" msgstr "" -#: order/models.py:760 +#: order/models.py:761 msgid "Enter stock allocation quantity" msgstr "" @@ -2201,7 +2213,7 @@ msgstr "" #: order/templates/order/purchase_order_detail.html:39 #: order/templates/order/purchase_order_detail.html:119 #: part/templates/part/category.html:173 part/templates/part/category.html:215 -#: templates/js/stock.js:657 templates/js/stock.js:1029 +#: templates/js/stock.js:661 templates/js/stock.js:1047 msgid "New Location" msgstr "" @@ -2246,7 +2258,7 @@ msgid "Select parts to receive against this order" msgstr "" #: order/templates/order/receive_parts.html:21 -#: part/templates/part/part_base.html:145 templates/js/part.js:434 +#: part/templates/part/part_base.html:148 templates/js/part.js:434 msgid "On Order" msgstr "" @@ -2287,7 +2299,7 @@ msgstr "" #: order/templates/order/sales_order_detail.html:72 #: order/templates/order/sales_order_detail.html:154 stock/models.py:406 -#: stock/templates/stock/item_base.html:228 templates/js/build.js:418 +#: stock/templates/stock/item_base.html:232 templates/js/build.js:418 msgid "Serial Number" msgstr "" @@ -2497,12 +2509,12 @@ msgstr "" msgid "Remove allocation" msgstr "" -#: part/bom.py:138 part/models.py:722 part/templates/part/category.html:61 +#: part/bom.py:138 part/models.py:729 part/templates/part/category.html:61 #: part/templates/part/detail.html:87 msgid "Default Location" msgstr "" -#: part/bom.py:139 part/templates/part/part_base.html:118 +#: part/bom.py:139 part/templates/part/part_base.html:121 msgid "Available Stock" msgstr "" @@ -2567,7 +2579,7 @@ msgstr "" msgid "Include part supplier data in exported BOM" msgstr "" -#: part/forms.py:102 part/models.py:1781 +#: part/forms.py:102 part/models.py:1788 msgid "Parent Part" msgstr "" @@ -2639,313 +2651,313 @@ msgstr "" msgid "Input quantity for price calculation" msgstr "" -#: part/models.py:68 +#: part/models.py:72 msgid "Default location for parts in this category" msgstr "" -#: part/models.py:71 +#: part/models.py:75 msgid "Default keywords for parts in this category" msgstr "" -#: part/models.py:77 part/models.py:1826 +#: part/models.py:81 part/models.py:1833 #: part/templates/part/part_app_base.html:9 msgid "Part Category" msgstr "" -#: part/models.py:78 part/templates/part/category.html:18 +#: part/models.py:82 part/templates/part/category.html:18 #: part/templates/part/category.html:89 templates/stats.html:39 #: users/models.py:32 msgid "Part Categories" msgstr "" -#: part/models.py:409 part/models.py:419 +#: part/models.py:416 part/models.py:426 #, python-brace-format msgid "Part '{p1}' is used in BOM for '{p2}' (recursive)" msgstr "" -#: part/models.py:516 +#: part/models.py:523 msgid "Next available serial numbers are" msgstr "" -#: part/models.py:520 +#: part/models.py:527 msgid "Next available serial number is" msgstr "" -#: part/models.py:525 +#: part/models.py:532 msgid "Most recent serial number is" msgstr "" -#: part/models.py:604 +#: part/models.py:611 msgid "Duplicate IPN not allowed in part settings" msgstr "" -#: part/models.py:615 +#: part/models.py:622 msgid "Part must be unique for name, IPN and revision" msgstr "" -#: part/models.py:646 part/templates/part/detail.html:19 +#: part/models.py:653 part/templates/part/detail.html:19 msgid "Part name" msgstr "" -#: part/models.py:653 +#: part/models.py:660 msgid "Is Template" msgstr "" -#: part/models.py:654 +#: part/models.py:661 msgid "Is this part a template part?" msgstr "" -#: part/models.py:665 +#: part/models.py:672 msgid "Is this part a variant of another part?" msgstr "" -#: part/models.py:666 part/templates/part/detail.html:57 +#: part/models.py:673 part/templates/part/detail.html:57 msgid "Variant Of" msgstr "" -#: part/models.py:672 +#: part/models.py:679 msgid "Part description" msgstr "" -#: part/models.py:677 part/templates/part/category.html:68 +#: part/models.py:684 part/templates/part/category.html:68 #: part/templates/part/detail.html:64 msgid "Keywords" msgstr "" -#: part/models.py:678 +#: part/models.py:685 msgid "Part keywords to improve visibility in search results" msgstr "" -#: part/models.py:685 part/templates/part/detail.html:70 +#: part/models.py:692 part/templates/part/detail.html:70 #: part/templates/part/set_category.html:15 templates/js/part.js:405 msgid "Category" msgstr "" -#: part/models.py:686 +#: part/models.py:693 msgid "Part category" msgstr "" -#: part/models.py:691 part/templates/part/detail.html:25 -#: part/templates/part/part_base.html:95 templates/js/part.js:180 +#: part/models.py:698 part/templates/part/detail.html:25 +#: part/templates/part/part_base.html:98 templates/js/part.js:180 msgid "IPN" msgstr "" -#: part/models.py:692 +#: part/models.py:699 msgid "Internal Part Number" msgstr "" -#: part/models.py:698 +#: part/models.py:705 msgid "Part revision or version number" msgstr "" -#: part/models.py:699 part/templates/part/detail.html:32 +#: part/models.py:706 part/templates/part/detail.html:32 #: templates/js/part.js:184 msgid "Revision" msgstr "" -#: part/models.py:720 +#: part/models.py:727 msgid "Where is this item normally stored?" msgstr "" -#: part/models.py:767 part/templates/part/detail.html:94 +#: part/models.py:774 part/templates/part/detail.html:94 msgid "Default Supplier" msgstr "" -#: part/models.py:768 +#: part/models.py:775 msgid "Default supplier part" msgstr "" -#: part/models.py:775 +#: part/models.py:782 msgid "Default Expiry" msgstr "" -#: part/models.py:776 +#: part/models.py:783 msgid "Expiry time (in days) for stock items of this part" msgstr "" -#: part/models.py:781 part/templates/part/detail.html:108 +#: part/models.py:788 part/templates/part/detail.html:108 msgid "Minimum Stock" msgstr "" -#: part/models.py:782 +#: part/models.py:789 msgid "Minimum allowed stock level" msgstr "" -#: part/models.py:788 part/templates/part/detail.html:102 +#: part/models.py:795 part/templates/part/detail.html:102 #: part/templates/part/params.html:26 msgid "Units" msgstr "" -#: part/models.py:789 +#: part/models.py:796 msgid "Stock keeping units for this part" msgstr "" -#: part/models.py:795 +#: part/models.py:802 msgid "Can this part be built from other parts?" msgstr "" -#: part/models.py:801 +#: part/models.py:808 msgid "Can this part be used to build other parts?" msgstr "" -#: part/models.py:807 +#: part/models.py:814 msgid "Does this part have tracking for unique items?" msgstr "" -#: part/models.py:812 +#: part/models.py:819 msgid "Can this part be purchased from external suppliers?" msgstr "" -#: part/models.py:817 +#: part/models.py:824 msgid "Can this part be sold to customers?" msgstr "" -#: part/models.py:821 part/templates/part/detail.html:222 +#: part/models.py:828 part/templates/part/detail.html:222 #: templates/js/table_filters.js:19 templates/js/table_filters.js:55 #: templates/js/table_filters.js:196 templates/js/table_filters.js:265 msgid "Active" msgstr "" -#: part/models.py:822 +#: part/models.py:829 msgid "Is this part active?" msgstr "" -#: part/models.py:827 +#: part/models.py:834 msgid "Is this a virtual part, such as a software product or license?" msgstr "" -#: part/models.py:832 +#: part/models.py:839 msgid "Part notes - supports Markdown formatting" msgstr "" -#: part/models.py:835 +#: part/models.py:842 msgid "Stored BOM checksum" msgstr "" -#: part/models.py:1654 +#: part/models.py:1661 msgid "Test templates can only be created for trackable parts" msgstr "" -#: part/models.py:1671 +#: part/models.py:1678 msgid "Test with this name already exists for this part" msgstr "" -#: part/models.py:1690 templates/js/part.js:567 templates/js/stock.js:103 +#: part/models.py:1697 templates/js/part.js:581 templates/js/stock.js:104 msgid "Test Name" msgstr "" -#: part/models.py:1691 +#: part/models.py:1698 msgid "Enter a name for the test" msgstr "" -#: part/models.py:1696 +#: part/models.py:1703 msgid "Test Description" msgstr "" -#: part/models.py:1697 +#: part/models.py:1704 msgid "Enter description for this test" msgstr "" -#: part/models.py:1702 templates/js/part.js:576 +#: part/models.py:1709 templates/js/part.js:590 #: templates/js/table_filters.js:182 msgid "Required" msgstr "" -#: part/models.py:1703 +#: part/models.py:1710 msgid "Is this test required to pass?" msgstr "" -#: part/models.py:1708 templates/js/part.js:584 +#: part/models.py:1715 templates/js/part.js:598 msgid "Requires Value" msgstr "" -#: part/models.py:1709 +#: part/models.py:1716 msgid "Does this test require a value when adding a test result?" msgstr "" -#: part/models.py:1714 templates/js/part.js:591 +#: part/models.py:1721 templates/js/part.js:605 msgid "Requires Attachment" msgstr "" -#: part/models.py:1715 +#: part/models.py:1722 msgid "Does this test require a file attachment when adding a test result?" msgstr "" -#: part/models.py:1748 +#: part/models.py:1755 msgid "Parameter template name must be unique" msgstr "" -#: part/models.py:1753 +#: part/models.py:1760 msgid "Parameter Name" msgstr "" -#: part/models.py:1755 +#: part/models.py:1762 msgid "Parameter Units" msgstr "" -#: part/models.py:1783 part/models.py:1831 +#: part/models.py:1790 part/models.py:1838 #: templates/InvenTree/settings/category.html:62 msgid "Parameter Template" msgstr "" -#: part/models.py:1785 +#: part/models.py:1792 msgid "Parameter Value" msgstr "" -#: part/models.py:1835 +#: part/models.py:1842 msgid "Default Parameter Value" msgstr "" -#: part/models.py:1862 +#: part/models.py:1869 msgid "Select parent part" msgstr "" -#: part/models.py:1870 +#: part/models.py:1877 msgid "Select part to be used in BOM" msgstr "" -#: part/models.py:1876 +#: part/models.py:1883 msgid "BOM quantity for this BOM item" msgstr "" -#: part/models.py:1878 +#: part/models.py:1885 msgid "This BOM item is optional" msgstr "" -#: part/models.py:1881 +#: part/models.py:1888 msgid "Estimated build wastage quantity (absolute or percentage)" msgstr "" -#: part/models.py:1884 +#: part/models.py:1891 msgid "BOM item reference" msgstr "" -#: part/models.py:1887 +#: part/models.py:1894 msgid "BOM item notes" msgstr "" -#: part/models.py:1889 +#: part/models.py:1896 msgid "BOM line checksum" msgstr "" -#: part/models.py:1960 part/views.py:1512 part/views.py:1564 +#: part/models.py:1967 part/views.py:1512 part/views.py:1564 #: stock/models.py:255 msgid "Quantity must be integer value for trackable parts" msgstr "" -#: part/models.py:1969 part/models.py:1971 +#: part/models.py:1976 part/models.py:1978 msgid "Sub part must be specified" msgstr "" -#: part/models.py:1974 +#: part/models.py:1981 msgid "BOM Item" msgstr "" -#: part/models.py:2095 +#: part/models.py:2102 msgid "Select Related Part" msgstr "" -#: part/models.py:2127 +#: part/models.py:2134 msgid "" "Error creating relationship: check that the part is not related to itself " "and that the relationship is unique" @@ -2966,9 +2978,9 @@ msgstr "" #: part/templates/part/allocation.html:45 #: stock/templates/stock/item_base.html:8 #: stock/templates/stock/item_base.html:89 -#: stock/templates/stock/item_base.html:311 +#: stock/templates/stock/item_base.html:315 #: stock/templates/stock/stock_adjust.html:16 templates/js/build.js:751 -#: templates/js/stock.js:862 templates/js/stock.js:1122 +#: templates/js/stock.js:880 templates/js/stock.js:1140 msgid "Stock Item" msgstr "" @@ -3054,7 +3066,7 @@ msgid "All selected BOM items will be deleted" msgstr "" #: part/templates/part/bom.html:183 part/views.py:594 -#: templates/js/stock.js:1018 +#: templates/js/stock.js:1036 msgid "Create New Part" msgstr "" @@ -3203,7 +3215,7 @@ msgstr "" msgid "Export Data" msgstr "" -#: part/templates/part/category.html:174 templates/js/stock.js:658 +#: part/templates/part/category.html:174 templates/js/stock.js:662 msgid "Create new location" msgstr "" @@ -3348,7 +3360,7 @@ msgid "New Parameter" msgstr "" #: part/templates/part/params.html:25 stock/models.py:1541 -#: templates/InvenTree/settings/header.html:8 templates/js/stock.js:123 +#: templates/InvenTree/settings/header.html:8 templates/js/stock.js:124 msgid "Value" msgstr "" @@ -3382,65 +3394,65 @@ msgstr "" msgid "Star this part" msgstr "" -#: part/templates/part/part_base.html:49 -#: stock/templates/stock/item_base.html:125 -#: stock/templates/stock/location.html:43 -msgid "Barcode actions" -msgstr "" - #: part/templates/part/part_base.html:51 #: stock/templates/stock/item_base.html:127 #: stock/templates/stock/location.html:45 +msgid "Barcode actions" +msgstr "" + +#: part/templates/part/part_base.html:53 +#: stock/templates/stock/item_base.html:129 +#: stock/templates/stock/location.html:47 msgid "Show QR Code" msgstr "" -#: part/templates/part/part_base.html:52 -#: stock/templates/stock/item_base.html:143 -#: stock/templates/stock/location.html:46 +#: part/templates/part/part_base.html:54 +#: stock/templates/stock/item_base.html:147 +#: stock/templates/stock/location.html:48 msgid "Print Label" msgstr "" -#: part/templates/part/part_base.html:56 +#: part/templates/part/part_base.html:59 msgid "Show pricing information" msgstr "" -#: part/templates/part/part_base.html:60 +#: part/templates/part/part_base.html:63 msgid "Count part stock" msgstr "" -#: part/templates/part/part_base.html:75 +#: part/templates/part/part_base.html:78 msgid "Part actions" msgstr "" -#: part/templates/part/part_base.html:78 +#: part/templates/part/part_base.html:81 msgid "Duplicate part" msgstr "" -#: part/templates/part/part_base.html:81 +#: part/templates/part/part_base.html:84 msgid "Edit part" msgstr "" -#: part/templates/part/part_base.html:84 +#: part/templates/part/part_base.html:87 msgid "Delete part" msgstr "" -#: part/templates/part/part_base.html:124 templates/js/table_filters.js:121 +#: part/templates/part/part_base.html:127 templates/js/table_filters.js:121 msgid "In Stock" msgstr "" -#: part/templates/part/part_base.html:131 +#: part/templates/part/part_base.html:134 msgid "Allocated to Build Orders" msgstr "" -#: part/templates/part/part_base.html:138 +#: part/templates/part/part_base.html:141 msgid "Allocated to Sales Orders" msgstr "" -#: part/templates/part/part_base.html:160 templates/js/bom.js:260 +#: part/templates/part/part_base.html:163 templates/js/bom.js:260 msgid "Can Build" msgstr "" -#: part/templates/part/part_base.html:166 +#: part/templates/part/part_base.html:169 msgid "Underway" msgstr "" @@ -3533,7 +3545,7 @@ msgstr "" msgid "Used In" msgstr "" -#: part/templates/part/tabs.html:61 stock/templates/stock/item_base.html:369 +#: part/templates/part/tabs.html:61 stock/templates/stock/item_base.html:373 msgid "Tests" msgstr "" @@ -3782,31 +3794,31 @@ msgstr "" msgid "Confim BOM item deletion" msgstr "" -#: report/models.py:147 +#: report/models.py:153 msgid "Template name" msgstr "" -#: report/models.py:153 +#: report/models.py:160 msgid "Report template file" msgstr "" -#: report/models.py:157 +#: report/models.py:167 msgid "Report template description" msgstr "" -#: report/models.py:161 +#: report/models.py:173 msgid "Report template is enabled" msgstr "" -#: report/models.py:168 +#: report/models.py:195 msgid "Part query filters (comma-separated list of key=value pairs)" msgstr "" -#: report/models.py:230 +#: report/models.py:244 msgid "Report asset file" msgstr "" -#: report/models.py:233 +#: report/models.py:247 msgid "Asset file description" msgstr "" @@ -3927,7 +3939,7 @@ msgstr "" msgid "Where is this stock item located?" msgstr "" -#: stock/models.py:389 stock/templates/stock/item_base.html:249 +#: stock/models.py:389 stock/templates/stock/item_base.html:253 msgid "Installed In" msgstr "" @@ -3967,8 +3979,8 @@ msgstr "" msgid "Destination Sales Order" msgstr "" -#: stock/models.py:461 stock/templates/stock/item_base.html:336 -#: templates/js/stock.js:612 +#: stock/models.py:461 stock/templates/stock/item_base.html:340 +#: templates/js/stock.js:613 msgid "Expiry Date" msgstr "" @@ -4162,133 +4174,137 @@ msgid "" msgstr "" #: stock/templates/stock/item_base.html:91 -#: stock/templates/stock/item_base.html:340 templates/js/table_filters.js:111 +#: stock/templates/stock/item_base.html:344 templates/js/table_filters.js:111 msgid "Expired" msgstr "" #: stock/templates/stock/item_base.html:95 -#: stock/templates/stock/item_base.html:342 templates/js/table_filters.js:116 +#: stock/templates/stock/item_base.html:346 templates/js/table_filters.js:116 msgid "Stale" msgstr "" -#: stock/templates/stock/item_base.html:130 templates/js/barcode.js:283 -#: templates/js/barcode.js:288 +#: stock/templates/stock/item_base.html:132 templates/js/barcode.js:312 +#: templates/js/barcode.js:317 msgid "Unlink Barcode" msgstr "" -#: stock/templates/stock/item_base.html:132 +#: stock/templates/stock/item_base.html:134 msgid "Link Barcode" msgstr "" -#: stock/templates/stock/item_base.html:140 +#: stock/templates/stock/item_base.html:136 templates/stock_table.html:31 +msgid "Scan to Location" +msgstr "" + +#: stock/templates/stock/item_base.html:144 msgid "Printing actions" msgstr "" -#: stock/templates/stock/item_base.html:146 +#: stock/templates/stock/item_base.html:150 #: stock/templates/stock/item_tests.html:25 msgid "Test Report" msgstr "" -#: stock/templates/stock/item_base.html:156 +#: stock/templates/stock/item_base.html:160 msgid "Stock adjustment actions" msgstr "" -#: stock/templates/stock/item_base.html:160 -#: stock/templates/stock/location.html:57 templates/stock_table.html:40 +#: stock/templates/stock/item_base.html:164 +#: stock/templates/stock/location.html:60 templates/stock_table.html:53 msgid "Count stock" msgstr "" -#: stock/templates/stock/item_base.html:161 templates/stock_table.html:38 +#: stock/templates/stock/item_base.html:165 templates/stock_table.html:51 msgid "Add stock" msgstr "" -#: stock/templates/stock/item_base.html:162 templates/stock_table.html:39 +#: stock/templates/stock/item_base.html:166 templates/stock_table.html:52 msgid "Remove stock" msgstr "" -#: stock/templates/stock/item_base.html:164 +#: stock/templates/stock/item_base.html:168 msgid "Transfer stock" msgstr "" -#: stock/templates/stock/item_base.html:166 +#: stock/templates/stock/item_base.html:170 msgid "Serialize stock" msgstr "" -#: stock/templates/stock/item_base.html:170 +#: stock/templates/stock/item_base.html:174 msgid "Assign to customer" msgstr "" -#: stock/templates/stock/item_base.html:173 +#: stock/templates/stock/item_base.html:177 msgid "Return to stock" msgstr "" -#: stock/templates/stock/item_base.html:177 templates/js/stock.js:1159 +#: stock/templates/stock/item_base.html:181 templates/js/stock.js:1177 msgid "Uninstall stock item" msgstr "" -#: stock/templates/stock/item_base.html:177 +#: stock/templates/stock/item_base.html:181 msgid "Uninstall" msgstr "" -#: stock/templates/stock/item_base.html:186 -#: stock/templates/stock/location.html:54 +#: stock/templates/stock/item_base.html:190 +#: stock/templates/stock/location.html:57 msgid "Stock actions" msgstr "" -#: stock/templates/stock/item_base.html:189 +#: stock/templates/stock/item_base.html:193 msgid "Convert to variant" msgstr "" -#: stock/templates/stock/item_base.html:192 +#: stock/templates/stock/item_base.html:196 msgid "Duplicate stock item" msgstr "" -#: stock/templates/stock/item_base.html:194 +#: stock/templates/stock/item_base.html:198 msgid "Edit stock item" msgstr "" -#: stock/templates/stock/item_base.html:197 +#: stock/templates/stock/item_base.html:201 msgid "Delete stock item" msgstr "" -#: stock/templates/stock/item_base.html:209 +#: stock/templates/stock/item_base.html:213 msgid "Stock Item Details" msgstr "" -#: stock/templates/stock/item_base.html:268 templates/js/build.js:442 +#: stock/templates/stock/item_base.html:272 templates/js/build.js:442 msgid "No location set" msgstr "" -#: stock/templates/stock/item_base.html:275 +#: stock/templates/stock/item_base.html:279 msgid "Barcode Identifier" msgstr "" -#: stock/templates/stock/item_base.html:289 templates/js/build.js:642 +#: stock/templates/stock/item_base.html:293 templates/js/build.js:642 #: templates/navbar.html:25 msgid "Build" msgstr "" -#: stock/templates/stock/item_base.html:310 +#: stock/templates/stock/item_base.html:314 msgid "Parent Item" msgstr "" -#: stock/templates/stock/item_base.html:340 +#: stock/templates/stock/item_base.html:344 msgid "This StockItem expired on" msgstr "" -#: stock/templates/stock/item_base.html:342 +#: stock/templates/stock/item_base.html:346 msgid "This StockItem expires on" msgstr "" -#: stock/templates/stock/item_base.html:349 templates/js/stock.js:618 +#: stock/templates/stock/item_base.html:353 templates/js/stock.js:619 msgid "Last Updated" msgstr "" -#: stock/templates/stock/item_base.html:354 +#: stock/templates/stock/item_base.html:358 msgid "Last Stocktake" msgstr "" -#: stock/templates/stock/item_base.html:358 +#: stock/templates/stock/item_base.html:362 msgid "No stocktake performed" msgstr "" @@ -4354,50 +4370,50 @@ msgstr "" msgid "All stock items" msgstr "" -#: stock/templates/stock/location.html:47 +#: stock/templates/stock/location.html:49 msgid "Check-in Items" msgstr "" -#: stock/templates/stock/location.html:63 +#: stock/templates/stock/location.html:66 msgid "Location actions" msgstr "" -#: stock/templates/stock/location.html:65 +#: stock/templates/stock/location.html:68 msgid "Edit location" msgstr "" -#: stock/templates/stock/location.html:67 +#: stock/templates/stock/location.html:70 msgid "Delete location" msgstr "" -#: stock/templates/stock/location.html:78 +#: stock/templates/stock/location.html:81 msgid "Location Details" msgstr "" -#: stock/templates/stock/location.html:83 +#: stock/templates/stock/location.html:86 msgid "Location Path" msgstr "" -#: stock/templates/stock/location.html:88 +#: stock/templates/stock/location.html:91 msgid "Location Description" msgstr "" -#: stock/templates/stock/location.html:93 +#: stock/templates/stock/location.html:96 msgid "Sublocations" msgstr "" -#: stock/templates/stock/location.html:98 -#: stock/templates/stock/location.html:113 +#: stock/templates/stock/location.html:101 +#: stock/templates/stock/location.html:116 #: templates/InvenTree/search_stock_items.html:6 templates/stats.html:48 #: templates/stats.html:57 users/models.py:35 msgid "Stock Items" msgstr "" -#: stock/templates/stock/location.html:103 +#: stock/templates/stock/location.html:106 msgid "Stock Details" msgstr "" -#: stock/templates/stock/location.html:108 +#: stock/templates/stock/location.html:111 #: templates/InvenTree/search_stock_location.html:6 templates/stats.html:52 #: users/models.py:34 msgid "Stock Locations" @@ -4698,11 +4714,11 @@ msgstr "" msgid "Enter a search query" msgstr "" -#: templates/InvenTree/search.html:191 templates/js/stock.js:300 +#: templates/InvenTree/search.html:191 templates/js/stock.js:301 msgid "Shipped to customer" msgstr "" -#: templates/InvenTree/search.html:194 templates/js/stock.js:310 +#: templates/InvenTree/search.html:194 templates/js/stock.js:311 msgid "No stock location set" msgstr "" @@ -4744,6 +4760,10 @@ msgstr "" msgid "Global InvenTree Settings" msgstr "" +#: templates/InvenTree/settings/global.html:24 +msgid "Barcode Settings" +msgstr "" + #: templates/InvenTree/settings/header.html:7 msgid "Setting" msgstr "" @@ -4789,7 +4809,7 @@ msgstr "" msgid "Stock Settings" msgstr "" -#: templates/InvenTree/settings/stock.html:13 templates/stock_table.html:33 +#: templates/InvenTree/settings/stock.html:13 templates/stock_table.html:46 msgid "Stock Options" msgstr "" @@ -4940,71 +4960,87 @@ msgstr "" msgid "Enter barcode data" msgstr "" -#: templates/js/barcode.js:42 templates/js/modals.js:856 -msgid "Invalid server response" +#: templates/js/barcode.js:30 +msgid "Enter optional notes for stock transfer" msgstr "" -#: templates/js/barcode.js:143 -msgid "Scan barcode data below" +#: templates/js/barcode.js:40 +msgid "Enter notes" msgstr "" -#: templates/js/barcode.js:217 templates/js/barcode.js:263 +#: templates/js/barcode.js:68 +msgid "Server error" +msgstr "" + +#: templates/js/barcode.js:89 msgid "Unknown response from server" msgstr "" -#: templates/js/barcode.js:239 +#: templates/js/barcode.js:116 templates/js/modals.js:856 +msgid "Invalid server response" +msgstr "" + +#: templates/js/barcode.js:215 +msgid "Scan barcode data below" +msgstr "" + +#: templates/js/barcode.js:273 +msgid "No URL in response" +msgstr "" + +#: templates/js/barcode.js:291 msgid "Link Barcode to Stock Item" msgstr "" -#: templates/js/barcode.js:285 +#: templates/js/barcode.js:314 msgid "" "This will remove the association between this stock item and the barcode" msgstr "" -#: templates/js/barcode.js:291 +#: templates/js/barcode.js:320 msgid "Unlink" msgstr "" -#: templates/js/barcode.js:350 +#: templates/js/barcode.js:379 msgid "Remove stock item" msgstr "" -#: templates/js/barcode.js:397 -msgid "Enter notes" -msgstr "" - -#: templates/js/barcode.js:399 -msgid "Enter optional notes for stock transfer" -msgstr "" - -#: templates/js/barcode.js:404 +#: templates/js/barcode.js:421 msgid "Check Stock Items into Location" msgstr "" -#: templates/js/barcode.js:408 +#: templates/js/barcode.js:425 templates/js/barcode.js:550 msgid "Check In" msgstr "" -#: templates/js/barcode.js:466 -msgid "Server error" +#: templates/js/barcode.js:465 templates/js/barcode.js:589 +msgid "Error transferring stock" msgstr "" -#: templates/js/barcode.js:485 +#: templates/js/barcode.js:484 msgid "Stock Item already scanned" msgstr "" -#: templates/js/barcode.js:489 +#: templates/js/barcode.js:488 msgid "Stock Item already in this location" msgstr "" -#: templates/js/barcode.js:496 +#: templates/js/barcode.js:495 msgid "Added stock item" msgstr "" -#: templates/js/barcode.js:503 +#: templates/js/barcode.js:502 msgid "Barcode does not match Stock Item" msgstr "" +#: templates/js/barcode.js:545 +msgid "Check Into Location" +msgstr "" + +#: templates/js/barcode.js:608 +msgid "Barcode does not match a valid location" +msgstr "" + #: templates/js/bom.js:165 msgid "Open subassembly" msgstr "" @@ -5069,7 +5105,7 @@ msgstr "" msgid "Delete build output" msgstr "" -#: templates/js/build.js:209 templates/stock_table.html:18 +#: templates/js/build.js:209 templates/stock_table.html:20 msgid "New Stock Item" msgstr "" @@ -5085,7 +5121,7 @@ msgstr "" msgid "Build stock" msgstr "" -#: templates/js/build.js:582 templates/stock_table.html:42 +#: templates/js/build.js:582 templates/stock_table.html:55 msgid "Order stock" msgstr "" @@ -5271,7 +5307,7 @@ msgstr "" msgid "Order is overdue" msgstr "" -#: templates/js/order.js:193 templates/js/stock.js:844 +#: templates/js/order.js:193 templates/js/stock.js:862 msgid "Date" msgstr "" @@ -5303,12 +5339,12 @@ msgstr "" msgid "No variants found" msgstr "" -#: templates/js/part.js:291 templates/js/part.js:457 +#: templates/js/part.js:291 templates/js/part.js:471 msgid "No parts found" msgstr "" -#: templates/js/part.js:343 templates/js/stock.js:473 -#: templates/js/stock.js:1191 +#: templates/js/part.js:343 templates/js/stock.js:474 +#: templates/js/stock.js:1209 msgid "Select" msgstr "" @@ -5324,27 +5360,27 @@ msgstr "" msgid "Building" msgstr "" -#: templates/js/part.js:517 +#: templates/js/part.js:531 msgid "YES" msgstr "" -#: templates/js/part.js:519 +#: templates/js/part.js:533 msgid "NO" msgstr "" -#: templates/js/part.js:553 +#: templates/js/part.js:567 msgid "No test templates matching query" msgstr "" -#: templates/js/part.js:604 templates/js/stock.js:74 +#: templates/js/part.js:618 templates/js/stock.js:75 msgid "Edit test result" msgstr "" -#: templates/js/part.js:605 templates/js/stock.js:75 +#: templates/js/part.js:619 templates/js/stock.js:76 msgid "Delete test result" msgstr "" -#: templates/js/part.js:611 +#: templates/js/part.js:625 msgid "This test is defined for a parent part" msgstr "" @@ -5364,131 +5400,131 @@ msgstr "" msgid "No report templates found which match selected stock item(s)" msgstr "" -#: templates/js/stock.js:37 +#: templates/js/stock.js:38 msgid "PASS" msgstr "" -#: templates/js/stock.js:39 +#: templates/js/stock.js:40 msgid "FAIL" msgstr "" -#: templates/js/stock.js:44 +#: templates/js/stock.js:45 msgid "NO RESULT" msgstr "" -#: templates/js/stock.js:70 +#: templates/js/stock.js:71 msgid "Add test result" msgstr "" -#: templates/js/stock.js:89 +#: templates/js/stock.js:90 msgid "No test results found" msgstr "" -#: templates/js/stock.js:131 +#: templates/js/stock.js:132 msgid "Test Date" msgstr "" -#: templates/js/stock.js:292 +#: templates/js/stock.js:293 msgid "In production" msgstr "" -#: templates/js/stock.js:296 +#: templates/js/stock.js:297 msgid "Installed in Stock Item" msgstr "" -#: templates/js/stock.js:304 +#: templates/js/stock.js:305 msgid "Assigned to Sales Order" msgstr "" -#: templates/js/stock.js:324 +#: templates/js/stock.js:325 msgid "No stock items matching query" msgstr "" -#: templates/js/stock.js:441 +#: templates/js/stock.js:442 msgid "Undefined location" msgstr "" -#: templates/js/stock.js:535 +#: templates/js/stock.js:536 msgid "Stock item is in production" msgstr "" -#: templates/js/stock.js:540 +#: templates/js/stock.js:541 msgid "Stock item assigned to sales order" msgstr "" -#: templates/js/stock.js:543 +#: templates/js/stock.js:544 msgid "Stock item assigned to customer" msgstr "" -#: templates/js/stock.js:547 +#: templates/js/stock.js:548 msgid "Stock item has expired" msgstr "" -#: templates/js/stock.js:549 +#: templates/js/stock.js:550 msgid "Stock item will expire soon" msgstr "" -#: templates/js/stock.js:553 +#: templates/js/stock.js:554 msgid "Stock item has been allocated" msgstr "" -#: templates/js/stock.js:557 +#: templates/js/stock.js:558 msgid "Stock item has been installed in another item" msgstr "" -#: templates/js/stock.js:565 +#: templates/js/stock.js:566 msgid "Stock item has been rejected" msgstr "" -#: templates/js/stock.js:569 +#: templates/js/stock.js:570 msgid "Stock item is lost" msgstr "" -#: templates/js/stock.js:572 +#: templates/js/stock.js:573 msgid "Stock item is destroyed" msgstr "" -#: templates/js/stock.js:576 templates/js/table_filters.js:106 +#: templates/js/stock.js:577 templates/js/table_filters.js:106 msgid "Depleted" msgstr "" -#: templates/js/stock.js:605 +#: templates/js/stock.js:606 msgid "Stocktake" msgstr "" -#: templates/js/stock.js:760 +#: templates/js/stock.js:778 msgid "Stock Status" msgstr "" -#: templates/js/stock.js:775 +#: templates/js/stock.js:793 msgid "Set Stock Status" msgstr "" -#: templates/js/stock.js:789 +#: templates/js/stock.js:807 msgid "Select Status Code" msgstr "" -#: templates/js/stock.js:790 +#: templates/js/stock.js:808 msgid "Status code must be selected" msgstr "" -#: templates/js/stock.js:910 +#: templates/js/stock.js:928 msgid "No user information" msgstr "" -#: templates/js/stock.js:1030 +#: templates/js/stock.js:1048 msgid "Create New Location" msgstr "" -#: templates/js/stock.js:1129 +#: templates/js/stock.js:1147 msgid "Serial" msgstr "" -#: templates/js/stock.js:1222 templates/js/table_filters.js:131 +#: templates/js/stock.js:1240 templates/js/table_filters.js:131 msgid "Installed" msgstr "" -#: templates/js/stock.js:1247 +#: templates/js/stock.js:1265 msgid "Install item" msgstr "" @@ -5697,59 +5733,63 @@ msgstr "" msgid "Issues detected" msgstr "" -#: templates/stock_table.html:12 +#: templates/stock_table.html:14 msgid "Export Stock Information" msgstr "" -#: templates/stock_table.html:23 +#: templates/stock_table.html:27 +msgid "Barcode Actions" +msgstr "" + +#: templates/stock_table.html:36 msgid "Printing Actions" msgstr "" -#: templates/stock_table.html:27 +#: templates/stock_table.html:40 msgid "Print labels" msgstr "" -#: templates/stock_table.html:28 +#: templates/stock_table.html:41 msgid "Print test reports" msgstr "" -#: templates/stock_table.html:38 +#: templates/stock_table.html:51 msgid "Add to selected stock items" msgstr "" -#: templates/stock_table.html:39 +#: templates/stock_table.html:52 msgid "Remove from selected stock items" msgstr "" -#: templates/stock_table.html:40 +#: templates/stock_table.html:53 msgid "Stocktake selected stock items" msgstr "" -#: templates/stock_table.html:41 +#: templates/stock_table.html:54 msgid "Move selected stock items" msgstr "" -#: templates/stock_table.html:41 +#: templates/stock_table.html:54 msgid "Move stock" msgstr "" -#: templates/stock_table.html:42 +#: templates/stock_table.html:55 msgid "Order selected items" msgstr "" -#: templates/stock_table.html:43 +#: templates/stock_table.html:56 msgid "Change status" msgstr "" -#: templates/stock_table.html:43 +#: templates/stock_table.html:56 msgid "Change stock status" msgstr "" -#: templates/stock_table.html:46 +#: templates/stock_table.html:59 msgid "Delete selected items" msgstr "" -#: templates/stock_table.html:46 +#: templates/stock_table.html:59 msgid "Delete Stock" msgstr "" diff --git a/InvenTree/locale/es/LC_MESSAGES/django.po b/InvenTree/locale/es/LC_MESSAGES/django.po index b983bde6a4..b12c0597d8 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: 2021-01-18 23:24+1100\n" +"POT-Creation-Date: 2021-01-28 22:37+1100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -54,7 +54,7 @@ msgstr "" msgid "Select Category" msgstr "" -#: InvenTree/helpers.py:361 order/models.py:232 order/models.py:330 +#: InvenTree/helpers.py:361 order/models.py:232 order/models.py:331 #: stock/views.py:1778 msgid "Invalid quantity provided" msgstr "" @@ -95,12 +95,13 @@ msgstr "" msgid "File comment" msgstr "" -#: InvenTree/models.py:68 templates/js/stock.js:901 +#: InvenTree/models.py:68 templates/js/stock.js:919 msgid "User" msgstr "" -#: InvenTree/models.py:106 label/models.py:68 part/models.py:647 -#: part/templates/part/params.html:24 templates/js/part.js:129 +#: InvenTree/models.py:106 label/models.py:68 part/models.py:654 +#: part/templates/part/params.html:24 report/models.py:152 +#: templates/js/part.js:129 msgid "Name" msgstr "" @@ -306,7 +307,7 @@ msgstr "" #: build/forms.py:78 build/templates/build/auto_allocate.html:17 #: build/templates/build/build_base.html:83 -#: build/templates/build/detail.html:29 common/models.py:603 +#: build/templates/build/detail.html:29 common/models.py:610 #: company/forms.py:112 company/templates/company/supplier_part_pricing.html:75 #: order/templates/order/order_wizard/select_parts.html:32 #: order/templates/order/purchase_order_detail.html:179 @@ -317,10 +318,10 @@ msgstr "" #: part/templates/part/sale_prices.html:82 stock/forms.py:306 #: stock/templates/stock/item_base.html:51 #: stock/templates/stock/item_base.html:57 -#: stock/templates/stock/item_base.html:234 -#: stock/templates/stock/stock_adjust.html:18 templates/js/barcode.js:338 -#: templates/js/bom.js:195 templates/js/build.js:420 templates/js/stock.js:892 -#: templates/js/stock.js:1131 +#: stock/templates/stock/item_base.html:238 +#: stock/templates/stock/stock_adjust.html:18 templates/js/barcode.js:367 +#: templates/js/bom.js:195 templates/js/build.js:420 templates/js/stock.js:910 +#: templates/js/stock.js:1149 msgid "Quantity" msgstr "" @@ -402,14 +403,14 @@ msgstr "" #: company/models.py:359 company/templates/company/detail.html:23 #: company/templates/company/supplier_part_base.html:61 #: company/templates/company/supplier_part_detail.html:27 label/models.py:75 -#: order/templates/order/purchase_order_detail.html:161 part/models.py:671 +#: order/templates/order/purchase_order_detail.html:161 part/models.py:678 #: part/templates/part/detail.html:51 part/templates/part/set_category.html:14 -#: templates/InvenTree/search.html:147 +#: report/models.py:166 templates/InvenTree/search.html:147 #: templates/InvenTree/settings/header.html:9 templates/js/bom.js:180 #: templates/js/bom.js:547 templates/js/build.js:664 templates/js/company.js:56 #: templates/js/order.js:180 templates/js/order.js:274 templates/js/part.js:188 -#: templates/js/part.js:271 templates/js/part.js:391 templates/js/part.js:572 -#: templates/js/stock.js:511 templates/js/stock.js:873 +#: templates/js/part.js:271 templates/js/part.js:391 templates/js/part.js:586 +#: templates/js/stock.js:512 templates/js/stock.js:891 msgid "Description" msgstr "" @@ -428,16 +429,16 @@ msgstr "" #: build/models.py:134 build/templates/build/auto_allocate.html:16 #: build/templates/build/build_base.html:78 -#: build/templates/build/detail.html:24 order/models.py:651 +#: build/templates/build/detail.html:24 order/models.py:652 #: order/templates/order/order_wizard/select_parts.html:30 #: order/templates/order/purchase_order_detail.html:148 -#: order/templates/order/receive_parts.html:19 part/models.py:316 +#: order/templates/order/receive_parts.html:19 part/models.py:320 #: part/templates/part/part_app_base.html:7 part/templates/part/related.html:26 #: part/templates/part/set_category.html:13 templates/InvenTree/search.html:133 -#: templates/js/barcode.js:336 templates/js/bom.js:153 templates/js/bom.js:532 +#: templates/js/barcode.js:365 templates/js/bom.js:153 templates/js/bom.js:532 #: templates/js/build.js:669 templates/js/company.js:138 -#: templates/js/part.js:252 templates/js/part.js:357 templates/js/stock.js:485 -#: templates/js/stock.js:1203 +#: templates/js/part.js:252 templates/js/part.js:357 templates/js/stock.js:486 +#: templates/js/stock.js:1221 msgid "Part" msgstr "" @@ -487,7 +488,7 @@ msgstr "" msgid "Number of stock items which have been completed" msgstr "" -#: build/models.py:186 part/templates/part/part_base.html:155 +#: build/models.py:186 part/templates/part/part_base.html:158 msgid "Build Status" msgstr "" @@ -503,30 +504,30 @@ msgstr "" msgid "Batch code for this build output" msgstr "" -#: build/models.py:205 order/models.py:436 +#: build/models.py:205 order/models.py:437 msgid "Target completion date" msgstr "" #: build/models.py:219 build/templates/build/detail.html:89 #: company/templates/company/supplier_part_base.html:68 #: company/templates/company/supplier_part_detail.html:24 -#: part/templates/part/detail.html:80 part/templates/part/part_base.html:102 -#: stock/models.py:412 stock/templates/stock/item_base.html:317 +#: part/templates/part/detail.html:80 part/templates/part/part_base.html:105 +#: stock/models.py:412 stock/templates/stock/item_base.html:321 msgid "External Link" msgstr "" -#: build/models.py:220 part/models.py:705 stock/models.py:414 +#: build/models.py:220 part/models.py:712 stock/models.py:414 msgid "Link to external URL" msgstr "" #: build/models.py:224 build/templates/build/tabs.html:23 company/models.py:366 #: company/templates/company/tabs.html:33 order/templates/order/po_tabs.html:18 #: order/templates/order/purchase_order_detail.html:213 -#: order/templates/order/so_tabs.html:23 part/models.py:831 +#: order/templates/order/so_tabs.html:23 part/models.py:838 #: part/templates/part/tabs.html:73 stock/forms.py:315 stock/forms.py:347 #: stock/forms.py:375 stock/models.py:484 stock/models.py:1554 -#: stock/templates/stock/tabs.html:26 templates/js/barcode.js:391 -#: templates/js/bom.js:293 templates/js/stock.js:127 templates/js/stock.js:623 +#: stock/templates/stock/tabs.html:26 templates/js/barcode.js:34 +#: templates/js/bom.js:293 templates/js/stock.js:128 templates/js/stock.js:624 msgid "Notes" msgstr "" @@ -534,65 +535,65 @@ msgstr "" msgid "Extra build notes" msgstr "" -#: build/models.py:610 +#: build/models.py:607 msgid "No build output specified" msgstr "" -#: build/models.py:613 +#: build/models.py:610 msgid "Build output is already completed" msgstr "" -#: build/models.py:616 +#: build/models.py:613 msgid "Build output does not match Build Order" msgstr "" -#: build/models.py:691 +#: build/models.py:688 msgid "Completed build output" msgstr "" -#: build/models.py:933 +#: build/models.py:930 msgid "BuildItem must be unique for build, stock_item and install_into" msgstr "" -#: build/models.py:955 +#: build/models.py:952 msgid "Build item must specify a build output" msgstr "" -#: build/models.py:960 +#: build/models.py:957 #, python-brace-format msgid "Selected stock item not found in BOM for part '{p}'" msgstr "" -#: build/models.py:964 +#: build/models.py:961 #, python-brace-format msgid "Allocated quantity ({n}) must not exceed available quantity ({q})" msgstr "" -#: build/models.py:971 order/models.py:735 +#: build/models.py:968 order/models.py:736 msgid "StockItem is over-allocated" msgstr "" -#: build/models.py:975 order/models.py:738 +#: build/models.py:972 order/models.py:739 msgid "Allocation quantity must be greater than zero" msgstr "" -#: build/models.py:979 +#: build/models.py:976 msgid "Quantity must be 1 for serialized stock" msgstr "" -#: build/models.py:1019 +#: build/models.py:1016 msgid "Build to allocate parts" msgstr "" -#: build/models.py:1026 +#: build/models.py:1023 msgid "Source stock item" msgstr "" -#: build/models.py:1038 +#: build/models.py:1035 msgid "Stock quantity to allocate to build" msgstr "" -#: build/models.py:1046 +#: build/models.py:1043 msgid "Destination stock item" msgstr "" @@ -658,10 +659,11 @@ msgid "" msgstr "" #: build/templates/build/auto_allocate.html:18 stock/forms.py:345 -#: stock/templates/stock/item_base.html:264 +#: stock/templates/stock/item_base.html:268 #: stock/templates/stock/stock_adjust.html:17 -#: templates/InvenTree/search.html:183 templates/js/barcode.js:337 -#: templates/js/build.js:434 templates/js/stock.js:597 +#: templates/InvenTree/search.html:183 templates/js/barcode.js:366 +#: templates/js/barcode.js:534 templates/js/build.js:434 +#: templates/js/stock.js:598 msgid "Location" msgstr "" @@ -725,10 +727,10 @@ msgstr "" #: build/templates/build/build_base.html:88 #: build/templates/build/detail.html:57 #: order/templates/order/receive_parts.html:24 -#: stock/templates/stock/item_base.html:363 templates/InvenTree/search.html:175 -#: templates/js/barcode.js:42 templates/js/build.js:697 +#: stock/templates/stock/item_base.html:367 templates/InvenTree/search.html:175 +#: templates/js/barcode.js:116 templates/js/build.js:697 #: templates/js/order.js:185 templates/js/order.js:279 -#: templates/js/stock.js:584 templates/js/stock.js:1139 +#: templates/js/stock.js:585 templates/js/stock.js:1157 msgid "Status" msgstr "" @@ -750,13 +752,13 @@ msgid "Progress" msgstr "" #: build/templates/build/build_base.html:120 -#: build/templates/build/detail.html:82 order/models.py:649 +#: build/templates/build/detail.html:82 order/models.py:650 #: 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:258 templates/js/order.js:240 +#: stock/templates/stock/item_base.html:262 templates/js/order.js:240 msgid "Sales Order" msgstr "" @@ -857,8 +859,8 @@ msgid "Destination location not specified" msgstr "" #: build/templates/build/detail.html:68 -#: stock/templates/stock/item_base.html:282 templates/js/stock.js:592 -#: templates/js/stock.js:1146 templates/js/table_filters.js:80 +#: stock/templates/stock/item_base.html:286 templates/js/stock.js:593 +#: templates/js/stock.js:1164 templates/js/table_filters.js:80 #: templates/js/table_filters.js:161 msgid "Batch" msgstr "" @@ -1112,233 +1114,242 @@ msgid "Default currency" msgstr "" #: common/models.py:75 -msgid "IPN Regex" +msgid "Barcode Support" msgstr "" #: common/models.py:76 +msgid "Enable barcode scanner support" +msgstr "" + +#: common/models.py:82 +msgid "IPN Regex" +msgstr "" + +#: common/models.py:83 msgid "Regular expression pattern for matching Part IPN" msgstr "" -#: common/models.py:80 +#: common/models.py:87 msgid "Allow Duplicate IPN" msgstr "" -#: common/models.py:81 +#: common/models.py:88 msgid "Allow multiple parts to share the same IPN" msgstr "" -#: common/models.py:87 +#: common/models.py:94 msgid "Copy Part BOM Data" msgstr "" -#: common/models.py:88 +#: common/models.py:95 msgid "Copy BOM data by default when duplicating a part" msgstr "" -#: common/models.py:94 +#: common/models.py:101 msgid "Copy Part Parameter Data" msgstr "" -#: common/models.py:95 +#: common/models.py:102 msgid "Copy parameter data by default when duplicating a part" msgstr "" -#: common/models.py:101 +#: common/models.py:108 msgid "Copy Part Test Data" msgstr "" -#: common/models.py:102 +#: common/models.py:109 msgid "Copy test data by default when duplicating a part" msgstr "" -#: common/models.py:108 +#: common/models.py:115 msgid "Copy Category Parameter Templates" msgstr "" -#: common/models.py:109 +#: common/models.py:116 msgid "Copy category parameter templates when creating a part" msgstr "" -#: common/models.py:115 part/templates/part/detail.html:155 stock/forms.py:257 -#: templates/js/table_filters.js:23 templates/js/table_filters.js:270 +#: common/models.py:122 part/templates/part/detail.html:155 +#: report/models.py:159 stock/forms.py:257 templates/js/table_filters.js:23 +#: templates/js/table_filters.js:270 msgid "Template" msgstr "" -#: common/models.py:116 +#: common/models.py:123 msgid "Parts are templates by default" msgstr "" -#: common/models.py:122 part/models.py:794 part/templates/part/detail.html:165 +#: common/models.py:129 part/models.py:801 part/templates/part/detail.html:165 #: templates/js/table_filters.js:282 msgid "Assembly" msgstr "" -#: common/models.py:123 +#: common/models.py:130 msgid "Parts can be assembled from other components by default" msgstr "" -#: common/models.py:129 part/models.py:800 part/templates/part/detail.html:175 +#: common/models.py:136 part/models.py:807 part/templates/part/detail.html:175 #: templates/js/table_filters.js:286 msgid "Component" msgstr "" -#: common/models.py:130 +#: common/models.py:137 msgid "Parts can be used as sub-components by default" msgstr "" -#: common/models.py:136 part/models.py:811 part/templates/part/detail.html:195 +#: common/models.py:143 part/models.py:818 part/templates/part/detail.html:195 msgid "Purchaseable" msgstr "" -#: common/models.py:137 +#: common/models.py:144 msgid "Parts are purchaseable by default" msgstr "" -#: common/models.py:143 part/models.py:816 part/templates/part/detail.html:205 +#: common/models.py:150 part/models.py:823 part/templates/part/detail.html:205 #: templates/js/table_filters.js:294 msgid "Salable" msgstr "" -#: common/models.py:144 +#: common/models.py:151 msgid "Parts are salable by default" msgstr "" -#: common/models.py:150 part/models.py:806 part/templates/part/detail.html:185 +#: common/models.py:157 part/models.py:813 part/templates/part/detail.html:185 #: templates/js/table_filters.js:31 templates/js/table_filters.js:298 msgid "Trackable" msgstr "" -#: common/models.py:151 +#: common/models.py:158 msgid "Parts are trackable by default" msgstr "" -#: common/models.py:157 part/models.py:826 part/templates/part/detail.html:145 +#: common/models.py:164 part/models.py:833 part/templates/part/detail.html:145 #: templates/js/table_filters.js:27 msgid "Virtual" msgstr "" -#: common/models.py:158 +#: common/models.py:165 msgid "Parts are virtual by default" msgstr "" -#: common/models.py:164 +#: common/models.py:171 msgid "Show Quantity in Forms" msgstr "" -#: common/models.py:165 +#: common/models.py:172 msgid "Display available part quantity in some forms" msgstr "" -#: common/models.py:171 +#: common/models.py:178 msgid "Stock Expiry" msgstr "" -#: common/models.py:172 +#: common/models.py:179 msgid "Enable stock expiry functionality" msgstr "" -#: common/models.py:178 +#: common/models.py:185 msgid "Sell Expired Stock" msgstr "" -#: common/models.py:179 +#: common/models.py:186 msgid "Allow sale of expired stock" msgstr "" -#: common/models.py:185 +#: common/models.py:192 msgid "Stock Stale Time" msgstr "" -#: common/models.py:186 +#: common/models.py:193 msgid "Number of days stock items are considered stale before expiring" msgstr "" -#: common/models.py:188 part/templates/part/detail.html:116 +#: common/models.py:195 part/templates/part/detail.html:116 msgid "days" msgstr "" -#: common/models.py:193 +#: common/models.py:200 msgid "Build Expired Stock" msgstr "" -#: common/models.py:194 +#: common/models.py:201 msgid "Allow building with expired stock" msgstr "" -#: common/models.py:200 +#: common/models.py:207 msgid "Stock Ownership Control" msgstr "" -#: common/models.py:201 +#: common/models.py:208 msgid "Enable ownership control over stock locations and items" msgstr "" -#: common/models.py:207 +#: common/models.py:214 msgid "Build Order Reference Prefix" msgstr "" -#: common/models.py:208 +#: common/models.py:215 msgid "Prefix value for build order reference" msgstr "" -#: common/models.py:213 +#: common/models.py:220 msgid "Build Order Reference Regex" msgstr "" -#: common/models.py:214 +#: common/models.py:221 msgid "Regular expression pattern for matching build order reference" msgstr "" -#: common/models.py:218 +#: common/models.py:225 msgid "Sales Order Reference Prefix" msgstr "" -#: common/models.py:219 +#: common/models.py:226 msgid "Prefix value for sales order reference" msgstr "" -#: common/models.py:224 +#: common/models.py:231 msgid "Purchase Order Reference Prefix" msgstr "" -#: common/models.py:225 +#: common/models.py:232 msgid "Prefix value for purchase order reference" msgstr "" -#: common/models.py:448 +#: common/models.py:455 msgid "Settings key (must be unique - case insensitive" msgstr "" -#: common/models.py:450 +#: common/models.py:457 msgid "Settings value" msgstr "" -#: common/models.py:507 +#: common/models.py:514 msgid "Value must be a boolean value" msgstr "" -#: common/models.py:517 +#: common/models.py:524 msgid "Value must be an integer value" msgstr "" -#: common/models.py:531 +#: common/models.py:538 msgid "Key string must be unique" msgstr "" -#: common/models.py:604 company/forms.py:113 +#: common/models.py:611 company/forms.py:113 msgid "Price break quantity" msgstr "" -#: common/models.py:612 company/templates/company/supplier_part_pricing.html:80 +#: common/models.py:619 company/templates/company/supplier_part_pricing.html:80 #: part/templates/part/sale_prices.html:87 templates/js/bom.js:245 msgid "Price" msgstr "" -#: common/models.py:613 +#: common/models.py:620 msgid "Unit price at specified quantity" msgstr "" -#: common/models.py:636 +#: common/models.py:643 msgid "Default" msgstr "" @@ -1440,7 +1451,7 @@ msgid "Currency" msgstr "" #: company/models.py:313 stock/models.py:366 -#: stock/templates/stock/item_base.html:214 +#: stock/templates/stock/item_base.html:218 msgid "Base Part" msgstr "" @@ -1453,7 +1464,7 @@ msgstr "" #: company/templates/company/supplier_part_detail.html:21 #: order/templates/order/order_base.html:89 #: order/templates/order/order_wizard/select_pos.html:30 part/bom.py:170 -#: stock/templates/stock/item_base.html:324 templates/js/company.js:48 +#: stock/templates/stock/item_base.html:328 templates/js/company.js:48 #: templates/js/company.js:164 templates/js/order.js:167 msgid "Supplier" msgstr "" @@ -1492,7 +1503,8 @@ msgstr "" msgid "Manufacturer part number" msgstr "" -#: company/models.py:353 part/models.py:704 templates/js/company.js:208 +#: company/models.py:353 part/models.py:711 templates/js/company.js:208 +#: templates/js/part.js:451 msgid "Link" msgstr "" @@ -1550,7 +1562,7 @@ msgstr "" #: company/templates/company/detail.html:62 #: order/templates/order/sales_order_base.html:89 stock/models.py:401 -#: stock/models.py:402 stock/templates/stock/item_base.html:241 +#: stock/models.py:402 stock/templates/stock/item_base.html:245 #: templates/js/company.js:40 templates/js/order.js:261 msgid "Customer" msgstr "" @@ -1566,7 +1578,7 @@ msgstr "" #: company/templates/company/detail_part.html:18 #: order/templates/order/purchase_order_detail.html:68 -#: part/templates/part/supplier.html:14 templates/js/stock.js:1023 +#: part/templates/part/supplier.html:14 templates/js/stock.js:1041 msgid "New Supplier Part" msgstr "" @@ -1590,7 +1602,7 @@ msgstr "" #: company/templates/company/detail_part.html:63 #: part/templates/part/bom.html:182 part/templates/part/category.html:116 -#: templates/js/stock.js:1017 +#: templates/js/stock.js:1035 msgid "New Part" msgstr "" @@ -1682,12 +1694,12 @@ msgstr "" #: company/templates/company/supplier_part_base.html:6 #: company/templates/company/supplier_part_base.html:19 stock/models.py:375 -#: stock/templates/stock/item_base.html:329 templates/js/company.js:180 +#: stock/templates/stock/item_base.html:333 templates/js/company.js:180 msgid "Supplier Part" msgstr "" #: company/templates/company/supplier_part_base.html:26 -#: part/templates/part/orders.html:14 part/templates/part/part_base.html:66 +#: part/templates/part/orders.html:14 part/templates/part/part_base.html:69 msgid "Order part" msgstr "" @@ -1754,7 +1766,7 @@ msgstr "" #: company/templates/company/tabs.html:12 part/templates/part/tabs.html:18 #: stock/templates/stock/location.html:29 templates/InvenTree/search.html:155 #: templates/InvenTree/settings/tabs.html:25 templates/js/part.js:192 -#: templates/js/part.js:418 templates/js/stock.js:519 templates/navbar.html:22 +#: templates/js/part.js:418 templates/js/stock.js:520 templates/navbar.html:22 msgid "Stock" msgstr "" @@ -1763,7 +1775,7 @@ msgid "Orders" msgstr "" #: company/templates/company/tabs.html:9 -#: order/templates/order/receive_parts.html:14 part/models.py:317 +#: order/templates/order/receive_parts.html:14 part/models.py:321 #: part/templates/part/cat_link.html:7 part/templates/part/category.html:94 #: part/templates/part/category_tabs.html:6 #: templates/InvenTree/settings/tabs.html:22 templates/navbar.html:19 @@ -1836,7 +1848,7 @@ msgstr "" msgid "Edit Supplier Part" msgstr "" -#: company/views.py:295 templates/js/stock.js:1024 +#: company/views.py:295 templates/js/stock.js:1042 msgid "Create new Supplier Part" msgstr "" @@ -1884,7 +1896,7 @@ msgstr "" msgid "Label template file" msgstr "" -#: label/models.py:90 report/models.py:162 +#: label/models.py:90 report/models.py:172 msgid "Enabled" msgstr "" @@ -1896,7 +1908,7 @@ msgstr "" msgid "Query filters (comma-separated list of key=value pairs" msgstr "" -#: label/models.py:138 label/models.py:191 +#: label/models.py:138 label/models.py:191 report/models.py:194 msgid "Filters" msgstr "" @@ -1933,7 +1945,7 @@ msgstr "" msgid "Enter sales order number" msgstr "" -#: order/forms.py:140 order/models.py:437 +#: order/forms.py:140 order/models.py:438 msgid "" "Target date for order completion. Order will be overdue after this date." msgstr "" @@ -1954,7 +1966,7 @@ msgstr "" msgid "Order notes" msgstr "" -#: order/models.py:171 order/models.py:430 +#: order/models.py:171 order/models.py:431 msgid "Purchase order status" msgstr "" @@ -1991,7 +2003,7 @@ msgstr "" msgid "Date order was completed" msgstr "" -#: order/models.py:230 order/models.py:328 part/views.py:1506 +#: order/models.py:230 order/models.py:329 part/views.py:1506 #: stock/models.py:265 stock/models.py:881 msgid "Quantity must be greater than zero" msgstr "" @@ -2000,78 +2012,78 @@ msgstr "" msgid "Part supplier must match PO supplier" msgstr "" -#: order/models.py:323 +#: order/models.py:324 msgid "Lines can only be received against an order marked as 'Placed'" msgstr "" -#: order/models.py:426 +#: order/models.py:427 msgid "Company to which the items are being sold" msgstr "" -#: order/models.py:432 +#: order/models.py:433 msgid "Customer order reference code" msgstr "" -#: order/models.py:490 +#: order/models.py:491 msgid "SalesOrder cannot be shipped as it is not currently pending" msgstr "" -#: order/models.py:577 +#: order/models.py:578 msgid "Item quantity" msgstr "" -#: order/models.py:579 +#: order/models.py:580 msgid "Line item reference" msgstr "" -#: order/models.py:581 +#: order/models.py:582 msgid "Line item notes" msgstr "" -#: order/models.py:607 order/templates/order/order_base.html:9 +#: order/models.py:608 order/templates/order/order_base.html:9 #: order/templates/order/order_base.html:24 -#: stock/templates/stock/item_base.html:296 templates/js/order.js:145 +#: stock/templates/stock/item_base.html:300 templates/js/order.js:145 msgid "Purchase Order" msgstr "" -#: order/models.py:620 +#: order/models.py:621 msgid "Supplier part" msgstr "" -#: order/models.py:623 +#: order/models.py:624 msgid "Number of items received" msgstr "" -#: order/models.py:630 stock/models.py:494 -#: stock/templates/stock/item_base.html:303 +#: order/models.py:631 stock/models.py:494 +#: stock/templates/stock/item_base.html:307 msgid "Purchase Price" msgstr "" -#: order/models.py:631 +#: order/models.py:632 msgid "Unit purchase price" msgstr "" -#: order/models.py:726 +#: order/models.py:727 msgid "Cannot allocate stock item to a line with a different part" msgstr "" -#: order/models.py:728 +#: order/models.py:729 msgid "Cannot allocate stock to a line without a part" msgstr "" -#: order/models.py:731 +#: order/models.py:732 msgid "Allocation quantity cannot exceed stock quantity" msgstr "" -#: order/models.py:741 +#: order/models.py:742 msgid "Quantity must be 1 for serialized stock item" msgstr "" -#: order/models.py:757 +#: order/models.py:758 msgid "Select stock item to allocate" msgstr "" -#: order/models.py:760 +#: order/models.py:761 msgid "Enter stock allocation quantity" msgstr "" @@ -2201,7 +2213,7 @@ msgstr "" #: order/templates/order/purchase_order_detail.html:39 #: order/templates/order/purchase_order_detail.html:119 #: part/templates/part/category.html:173 part/templates/part/category.html:215 -#: templates/js/stock.js:657 templates/js/stock.js:1029 +#: templates/js/stock.js:661 templates/js/stock.js:1047 msgid "New Location" msgstr "" @@ -2246,7 +2258,7 @@ msgid "Select parts to receive against this order" msgstr "" #: order/templates/order/receive_parts.html:21 -#: part/templates/part/part_base.html:145 templates/js/part.js:434 +#: part/templates/part/part_base.html:148 templates/js/part.js:434 msgid "On Order" msgstr "" @@ -2287,7 +2299,7 @@ msgstr "" #: order/templates/order/sales_order_detail.html:72 #: order/templates/order/sales_order_detail.html:154 stock/models.py:406 -#: stock/templates/stock/item_base.html:228 templates/js/build.js:418 +#: stock/templates/stock/item_base.html:232 templates/js/build.js:418 msgid "Serial Number" msgstr "" @@ -2497,12 +2509,12 @@ msgstr "" msgid "Remove allocation" msgstr "" -#: part/bom.py:138 part/models.py:722 part/templates/part/category.html:61 +#: part/bom.py:138 part/models.py:729 part/templates/part/category.html:61 #: part/templates/part/detail.html:87 msgid "Default Location" msgstr "" -#: part/bom.py:139 part/templates/part/part_base.html:118 +#: part/bom.py:139 part/templates/part/part_base.html:121 msgid "Available Stock" msgstr "" @@ -2567,7 +2579,7 @@ msgstr "" msgid "Include part supplier data in exported BOM" msgstr "" -#: part/forms.py:102 part/models.py:1781 +#: part/forms.py:102 part/models.py:1788 msgid "Parent Part" msgstr "" @@ -2639,313 +2651,313 @@ msgstr "" msgid "Input quantity for price calculation" msgstr "" -#: part/models.py:68 +#: part/models.py:72 msgid "Default location for parts in this category" msgstr "" -#: part/models.py:71 +#: part/models.py:75 msgid "Default keywords for parts in this category" msgstr "" -#: part/models.py:77 part/models.py:1826 +#: part/models.py:81 part/models.py:1833 #: part/templates/part/part_app_base.html:9 msgid "Part Category" msgstr "" -#: part/models.py:78 part/templates/part/category.html:18 +#: part/models.py:82 part/templates/part/category.html:18 #: part/templates/part/category.html:89 templates/stats.html:39 #: users/models.py:32 msgid "Part Categories" msgstr "" -#: part/models.py:409 part/models.py:419 +#: part/models.py:416 part/models.py:426 #, python-brace-format msgid "Part '{p1}' is used in BOM for '{p2}' (recursive)" msgstr "" -#: part/models.py:516 +#: part/models.py:523 msgid "Next available serial numbers are" msgstr "" -#: part/models.py:520 +#: part/models.py:527 msgid "Next available serial number is" msgstr "" -#: part/models.py:525 +#: part/models.py:532 msgid "Most recent serial number is" msgstr "" -#: part/models.py:604 +#: part/models.py:611 msgid "Duplicate IPN not allowed in part settings" msgstr "" -#: part/models.py:615 +#: part/models.py:622 msgid "Part must be unique for name, IPN and revision" msgstr "" -#: part/models.py:646 part/templates/part/detail.html:19 +#: part/models.py:653 part/templates/part/detail.html:19 msgid "Part name" msgstr "" -#: part/models.py:653 +#: part/models.py:660 msgid "Is Template" msgstr "" -#: part/models.py:654 +#: part/models.py:661 msgid "Is this part a template part?" msgstr "" -#: part/models.py:665 +#: part/models.py:672 msgid "Is this part a variant of another part?" msgstr "" -#: part/models.py:666 part/templates/part/detail.html:57 +#: part/models.py:673 part/templates/part/detail.html:57 msgid "Variant Of" msgstr "" -#: part/models.py:672 +#: part/models.py:679 msgid "Part description" msgstr "" -#: part/models.py:677 part/templates/part/category.html:68 +#: part/models.py:684 part/templates/part/category.html:68 #: part/templates/part/detail.html:64 msgid "Keywords" msgstr "" -#: part/models.py:678 +#: part/models.py:685 msgid "Part keywords to improve visibility in search results" msgstr "" -#: part/models.py:685 part/templates/part/detail.html:70 +#: part/models.py:692 part/templates/part/detail.html:70 #: part/templates/part/set_category.html:15 templates/js/part.js:405 msgid "Category" msgstr "" -#: part/models.py:686 +#: part/models.py:693 msgid "Part category" msgstr "" -#: part/models.py:691 part/templates/part/detail.html:25 -#: part/templates/part/part_base.html:95 templates/js/part.js:180 +#: part/models.py:698 part/templates/part/detail.html:25 +#: part/templates/part/part_base.html:98 templates/js/part.js:180 msgid "IPN" msgstr "" -#: part/models.py:692 +#: part/models.py:699 msgid "Internal Part Number" msgstr "" -#: part/models.py:698 +#: part/models.py:705 msgid "Part revision or version number" msgstr "" -#: part/models.py:699 part/templates/part/detail.html:32 +#: part/models.py:706 part/templates/part/detail.html:32 #: templates/js/part.js:184 msgid "Revision" msgstr "" -#: part/models.py:720 +#: part/models.py:727 msgid "Where is this item normally stored?" msgstr "" -#: part/models.py:767 part/templates/part/detail.html:94 +#: part/models.py:774 part/templates/part/detail.html:94 msgid "Default Supplier" msgstr "" -#: part/models.py:768 +#: part/models.py:775 msgid "Default supplier part" msgstr "" -#: part/models.py:775 +#: part/models.py:782 msgid "Default Expiry" msgstr "" -#: part/models.py:776 +#: part/models.py:783 msgid "Expiry time (in days) for stock items of this part" msgstr "" -#: part/models.py:781 part/templates/part/detail.html:108 +#: part/models.py:788 part/templates/part/detail.html:108 msgid "Minimum Stock" msgstr "" -#: part/models.py:782 +#: part/models.py:789 msgid "Minimum allowed stock level" msgstr "" -#: part/models.py:788 part/templates/part/detail.html:102 +#: part/models.py:795 part/templates/part/detail.html:102 #: part/templates/part/params.html:26 msgid "Units" msgstr "" -#: part/models.py:789 +#: part/models.py:796 msgid "Stock keeping units for this part" msgstr "" -#: part/models.py:795 +#: part/models.py:802 msgid "Can this part be built from other parts?" msgstr "" -#: part/models.py:801 +#: part/models.py:808 msgid "Can this part be used to build other parts?" msgstr "" -#: part/models.py:807 +#: part/models.py:814 msgid "Does this part have tracking for unique items?" msgstr "" -#: part/models.py:812 +#: part/models.py:819 msgid "Can this part be purchased from external suppliers?" msgstr "" -#: part/models.py:817 +#: part/models.py:824 msgid "Can this part be sold to customers?" msgstr "" -#: part/models.py:821 part/templates/part/detail.html:222 +#: part/models.py:828 part/templates/part/detail.html:222 #: templates/js/table_filters.js:19 templates/js/table_filters.js:55 #: templates/js/table_filters.js:196 templates/js/table_filters.js:265 msgid "Active" msgstr "" -#: part/models.py:822 +#: part/models.py:829 msgid "Is this part active?" msgstr "" -#: part/models.py:827 +#: part/models.py:834 msgid "Is this a virtual part, such as a software product or license?" msgstr "" -#: part/models.py:832 +#: part/models.py:839 msgid "Part notes - supports Markdown formatting" msgstr "" -#: part/models.py:835 +#: part/models.py:842 msgid "Stored BOM checksum" msgstr "" -#: part/models.py:1654 +#: part/models.py:1661 msgid "Test templates can only be created for trackable parts" msgstr "" -#: part/models.py:1671 +#: part/models.py:1678 msgid "Test with this name already exists for this part" msgstr "" -#: part/models.py:1690 templates/js/part.js:567 templates/js/stock.js:103 +#: part/models.py:1697 templates/js/part.js:581 templates/js/stock.js:104 msgid "Test Name" msgstr "" -#: part/models.py:1691 +#: part/models.py:1698 msgid "Enter a name for the test" msgstr "" -#: part/models.py:1696 +#: part/models.py:1703 msgid "Test Description" msgstr "" -#: part/models.py:1697 +#: part/models.py:1704 msgid "Enter description for this test" msgstr "" -#: part/models.py:1702 templates/js/part.js:576 +#: part/models.py:1709 templates/js/part.js:590 #: templates/js/table_filters.js:182 msgid "Required" msgstr "" -#: part/models.py:1703 +#: part/models.py:1710 msgid "Is this test required to pass?" msgstr "" -#: part/models.py:1708 templates/js/part.js:584 +#: part/models.py:1715 templates/js/part.js:598 msgid "Requires Value" msgstr "" -#: part/models.py:1709 +#: part/models.py:1716 msgid "Does this test require a value when adding a test result?" msgstr "" -#: part/models.py:1714 templates/js/part.js:591 +#: part/models.py:1721 templates/js/part.js:605 msgid "Requires Attachment" msgstr "" -#: part/models.py:1715 +#: part/models.py:1722 msgid "Does this test require a file attachment when adding a test result?" msgstr "" -#: part/models.py:1748 +#: part/models.py:1755 msgid "Parameter template name must be unique" msgstr "" -#: part/models.py:1753 +#: part/models.py:1760 msgid "Parameter Name" msgstr "" -#: part/models.py:1755 +#: part/models.py:1762 msgid "Parameter Units" msgstr "" -#: part/models.py:1783 part/models.py:1831 +#: part/models.py:1790 part/models.py:1838 #: templates/InvenTree/settings/category.html:62 msgid "Parameter Template" msgstr "" -#: part/models.py:1785 +#: part/models.py:1792 msgid "Parameter Value" msgstr "" -#: part/models.py:1835 +#: part/models.py:1842 msgid "Default Parameter Value" msgstr "" -#: part/models.py:1862 +#: part/models.py:1869 msgid "Select parent part" msgstr "" -#: part/models.py:1870 +#: part/models.py:1877 msgid "Select part to be used in BOM" msgstr "" -#: part/models.py:1876 +#: part/models.py:1883 msgid "BOM quantity for this BOM item" msgstr "" -#: part/models.py:1878 +#: part/models.py:1885 msgid "This BOM item is optional" msgstr "" -#: part/models.py:1881 +#: part/models.py:1888 msgid "Estimated build wastage quantity (absolute or percentage)" msgstr "" -#: part/models.py:1884 +#: part/models.py:1891 msgid "BOM item reference" msgstr "" -#: part/models.py:1887 +#: part/models.py:1894 msgid "BOM item notes" msgstr "" -#: part/models.py:1889 +#: part/models.py:1896 msgid "BOM line checksum" msgstr "" -#: part/models.py:1960 part/views.py:1512 part/views.py:1564 +#: part/models.py:1967 part/views.py:1512 part/views.py:1564 #: stock/models.py:255 msgid "Quantity must be integer value for trackable parts" msgstr "" -#: part/models.py:1969 part/models.py:1971 +#: part/models.py:1976 part/models.py:1978 msgid "Sub part must be specified" msgstr "" -#: part/models.py:1974 +#: part/models.py:1981 msgid "BOM Item" msgstr "" -#: part/models.py:2095 +#: part/models.py:2102 msgid "Select Related Part" msgstr "" -#: part/models.py:2127 +#: part/models.py:2134 msgid "" "Error creating relationship: check that the part is not related to itself " "and that the relationship is unique" @@ -2966,9 +2978,9 @@ msgstr "" #: part/templates/part/allocation.html:45 #: stock/templates/stock/item_base.html:8 #: stock/templates/stock/item_base.html:89 -#: stock/templates/stock/item_base.html:311 +#: stock/templates/stock/item_base.html:315 #: stock/templates/stock/stock_adjust.html:16 templates/js/build.js:751 -#: templates/js/stock.js:862 templates/js/stock.js:1122 +#: templates/js/stock.js:880 templates/js/stock.js:1140 msgid "Stock Item" msgstr "" @@ -3054,7 +3066,7 @@ msgid "All selected BOM items will be deleted" msgstr "" #: part/templates/part/bom.html:183 part/views.py:594 -#: templates/js/stock.js:1018 +#: templates/js/stock.js:1036 msgid "Create New Part" msgstr "" @@ -3203,7 +3215,7 @@ msgstr "" msgid "Export Data" msgstr "" -#: part/templates/part/category.html:174 templates/js/stock.js:658 +#: part/templates/part/category.html:174 templates/js/stock.js:662 msgid "Create new location" msgstr "" @@ -3348,7 +3360,7 @@ msgid "New Parameter" msgstr "" #: part/templates/part/params.html:25 stock/models.py:1541 -#: templates/InvenTree/settings/header.html:8 templates/js/stock.js:123 +#: templates/InvenTree/settings/header.html:8 templates/js/stock.js:124 msgid "Value" msgstr "" @@ -3382,65 +3394,65 @@ msgstr "" msgid "Star this part" msgstr "" -#: part/templates/part/part_base.html:49 -#: stock/templates/stock/item_base.html:125 -#: stock/templates/stock/location.html:43 -msgid "Barcode actions" -msgstr "" - #: part/templates/part/part_base.html:51 #: stock/templates/stock/item_base.html:127 #: stock/templates/stock/location.html:45 +msgid "Barcode actions" +msgstr "" + +#: part/templates/part/part_base.html:53 +#: stock/templates/stock/item_base.html:129 +#: stock/templates/stock/location.html:47 msgid "Show QR Code" msgstr "" -#: part/templates/part/part_base.html:52 -#: stock/templates/stock/item_base.html:143 -#: stock/templates/stock/location.html:46 +#: part/templates/part/part_base.html:54 +#: stock/templates/stock/item_base.html:147 +#: stock/templates/stock/location.html:48 msgid "Print Label" msgstr "" -#: part/templates/part/part_base.html:56 +#: part/templates/part/part_base.html:59 msgid "Show pricing information" msgstr "" -#: part/templates/part/part_base.html:60 +#: part/templates/part/part_base.html:63 msgid "Count part stock" msgstr "" -#: part/templates/part/part_base.html:75 +#: part/templates/part/part_base.html:78 msgid "Part actions" msgstr "" -#: part/templates/part/part_base.html:78 +#: part/templates/part/part_base.html:81 msgid "Duplicate part" msgstr "" -#: part/templates/part/part_base.html:81 +#: part/templates/part/part_base.html:84 msgid "Edit part" msgstr "" -#: part/templates/part/part_base.html:84 +#: part/templates/part/part_base.html:87 msgid "Delete part" msgstr "" -#: part/templates/part/part_base.html:124 templates/js/table_filters.js:121 +#: part/templates/part/part_base.html:127 templates/js/table_filters.js:121 msgid "In Stock" msgstr "" -#: part/templates/part/part_base.html:131 +#: part/templates/part/part_base.html:134 msgid "Allocated to Build Orders" msgstr "" -#: part/templates/part/part_base.html:138 +#: part/templates/part/part_base.html:141 msgid "Allocated to Sales Orders" msgstr "" -#: part/templates/part/part_base.html:160 templates/js/bom.js:260 +#: part/templates/part/part_base.html:163 templates/js/bom.js:260 msgid "Can Build" msgstr "" -#: part/templates/part/part_base.html:166 +#: part/templates/part/part_base.html:169 msgid "Underway" msgstr "" @@ -3533,7 +3545,7 @@ msgstr "" msgid "Used In" msgstr "" -#: part/templates/part/tabs.html:61 stock/templates/stock/item_base.html:369 +#: part/templates/part/tabs.html:61 stock/templates/stock/item_base.html:373 msgid "Tests" msgstr "" @@ -3782,31 +3794,31 @@ msgstr "" msgid "Confim BOM item deletion" msgstr "" -#: report/models.py:147 +#: report/models.py:153 msgid "Template name" msgstr "" -#: report/models.py:153 +#: report/models.py:160 msgid "Report template file" msgstr "" -#: report/models.py:157 +#: report/models.py:167 msgid "Report template description" msgstr "" -#: report/models.py:161 +#: report/models.py:173 msgid "Report template is enabled" msgstr "" -#: report/models.py:168 +#: report/models.py:195 msgid "Part query filters (comma-separated list of key=value pairs)" msgstr "" -#: report/models.py:230 +#: report/models.py:244 msgid "Report asset file" msgstr "" -#: report/models.py:233 +#: report/models.py:247 msgid "Asset file description" msgstr "" @@ -3927,7 +3939,7 @@ msgstr "" msgid "Where is this stock item located?" msgstr "" -#: stock/models.py:389 stock/templates/stock/item_base.html:249 +#: stock/models.py:389 stock/templates/stock/item_base.html:253 msgid "Installed In" msgstr "" @@ -3967,8 +3979,8 @@ msgstr "" msgid "Destination Sales Order" msgstr "" -#: stock/models.py:461 stock/templates/stock/item_base.html:336 -#: templates/js/stock.js:612 +#: stock/models.py:461 stock/templates/stock/item_base.html:340 +#: templates/js/stock.js:613 msgid "Expiry Date" msgstr "" @@ -4162,133 +4174,137 @@ msgid "" msgstr "" #: stock/templates/stock/item_base.html:91 -#: stock/templates/stock/item_base.html:340 templates/js/table_filters.js:111 +#: stock/templates/stock/item_base.html:344 templates/js/table_filters.js:111 msgid "Expired" msgstr "" #: stock/templates/stock/item_base.html:95 -#: stock/templates/stock/item_base.html:342 templates/js/table_filters.js:116 +#: stock/templates/stock/item_base.html:346 templates/js/table_filters.js:116 msgid "Stale" msgstr "" -#: stock/templates/stock/item_base.html:130 templates/js/barcode.js:283 -#: templates/js/barcode.js:288 +#: stock/templates/stock/item_base.html:132 templates/js/barcode.js:312 +#: templates/js/barcode.js:317 msgid "Unlink Barcode" msgstr "" -#: stock/templates/stock/item_base.html:132 +#: stock/templates/stock/item_base.html:134 msgid "Link Barcode" msgstr "" -#: stock/templates/stock/item_base.html:140 +#: stock/templates/stock/item_base.html:136 templates/stock_table.html:31 +msgid "Scan to Location" +msgstr "" + +#: stock/templates/stock/item_base.html:144 msgid "Printing actions" msgstr "" -#: stock/templates/stock/item_base.html:146 +#: stock/templates/stock/item_base.html:150 #: stock/templates/stock/item_tests.html:25 msgid "Test Report" msgstr "" -#: stock/templates/stock/item_base.html:156 +#: stock/templates/stock/item_base.html:160 msgid "Stock adjustment actions" msgstr "" -#: stock/templates/stock/item_base.html:160 -#: stock/templates/stock/location.html:57 templates/stock_table.html:40 +#: stock/templates/stock/item_base.html:164 +#: stock/templates/stock/location.html:60 templates/stock_table.html:53 msgid "Count stock" msgstr "" -#: stock/templates/stock/item_base.html:161 templates/stock_table.html:38 +#: stock/templates/stock/item_base.html:165 templates/stock_table.html:51 msgid "Add stock" msgstr "" -#: stock/templates/stock/item_base.html:162 templates/stock_table.html:39 +#: stock/templates/stock/item_base.html:166 templates/stock_table.html:52 msgid "Remove stock" msgstr "" -#: stock/templates/stock/item_base.html:164 +#: stock/templates/stock/item_base.html:168 msgid "Transfer stock" msgstr "" -#: stock/templates/stock/item_base.html:166 +#: stock/templates/stock/item_base.html:170 msgid "Serialize stock" msgstr "" -#: stock/templates/stock/item_base.html:170 +#: stock/templates/stock/item_base.html:174 msgid "Assign to customer" msgstr "" -#: stock/templates/stock/item_base.html:173 +#: stock/templates/stock/item_base.html:177 msgid "Return to stock" msgstr "" -#: stock/templates/stock/item_base.html:177 templates/js/stock.js:1159 +#: stock/templates/stock/item_base.html:181 templates/js/stock.js:1177 msgid "Uninstall stock item" msgstr "" -#: stock/templates/stock/item_base.html:177 +#: stock/templates/stock/item_base.html:181 msgid "Uninstall" msgstr "" -#: stock/templates/stock/item_base.html:186 -#: stock/templates/stock/location.html:54 +#: stock/templates/stock/item_base.html:190 +#: stock/templates/stock/location.html:57 msgid "Stock actions" msgstr "" -#: stock/templates/stock/item_base.html:189 +#: stock/templates/stock/item_base.html:193 msgid "Convert to variant" msgstr "" -#: stock/templates/stock/item_base.html:192 +#: stock/templates/stock/item_base.html:196 msgid "Duplicate stock item" msgstr "" -#: stock/templates/stock/item_base.html:194 +#: stock/templates/stock/item_base.html:198 msgid "Edit stock item" msgstr "" -#: stock/templates/stock/item_base.html:197 +#: stock/templates/stock/item_base.html:201 msgid "Delete stock item" msgstr "" -#: stock/templates/stock/item_base.html:209 +#: stock/templates/stock/item_base.html:213 msgid "Stock Item Details" msgstr "" -#: stock/templates/stock/item_base.html:268 templates/js/build.js:442 +#: stock/templates/stock/item_base.html:272 templates/js/build.js:442 msgid "No location set" msgstr "" -#: stock/templates/stock/item_base.html:275 +#: stock/templates/stock/item_base.html:279 msgid "Barcode Identifier" msgstr "" -#: stock/templates/stock/item_base.html:289 templates/js/build.js:642 +#: stock/templates/stock/item_base.html:293 templates/js/build.js:642 #: templates/navbar.html:25 msgid "Build" msgstr "" -#: stock/templates/stock/item_base.html:310 +#: stock/templates/stock/item_base.html:314 msgid "Parent Item" msgstr "" -#: stock/templates/stock/item_base.html:340 +#: stock/templates/stock/item_base.html:344 msgid "This StockItem expired on" msgstr "" -#: stock/templates/stock/item_base.html:342 +#: stock/templates/stock/item_base.html:346 msgid "This StockItem expires on" msgstr "" -#: stock/templates/stock/item_base.html:349 templates/js/stock.js:618 +#: stock/templates/stock/item_base.html:353 templates/js/stock.js:619 msgid "Last Updated" msgstr "" -#: stock/templates/stock/item_base.html:354 +#: stock/templates/stock/item_base.html:358 msgid "Last Stocktake" msgstr "" -#: stock/templates/stock/item_base.html:358 +#: stock/templates/stock/item_base.html:362 msgid "No stocktake performed" msgstr "" @@ -4354,50 +4370,50 @@ msgstr "" msgid "All stock items" msgstr "" -#: stock/templates/stock/location.html:47 +#: stock/templates/stock/location.html:49 msgid "Check-in Items" msgstr "" -#: stock/templates/stock/location.html:63 +#: stock/templates/stock/location.html:66 msgid "Location actions" msgstr "" -#: stock/templates/stock/location.html:65 +#: stock/templates/stock/location.html:68 msgid "Edit location" msgstr "" -#: stock/templates/stock/location.html:67 +#: stock/templates/stock/location.html:70 msgid "Delete location" msgstr "" -#: stock/templates/stock/location.html:78 +#: stock/templates/stock/location.html:81 msgid "Location Details" msgstr "" -#: stock/templates/stock/location.html:83 +#: stock/templates/stock/location.html:86 msgid "Location Path" msgstr "" -#: stock/templates/stock/location.html:88 +#: stock/templates/stock/location.html:91 msgid "Location Description" msgstr "" -#: stock/templates/stock/location.html:93 +#: stock/templates/stock/location.html:96 msgid "Sublocations" msgstr "" -#: stock/templates/stock/location.html:98 -#: stock/templates/stock/location.html:113 +#: stock/templates/stock/location.html:101 +#: stock/templates/stock/location.html:116 #: templates/InvenTree/search_stock_items.html:6 templates/stats.html:48 #: templates/stats.html:57 users/models.py:35 msgid "Stock Items" msgstr "" -#: stock/templates/stock/location.html:103 +#: stock/templates/stock/location.html:106 msgid "Stock Details" msgstr "" -#: stock/templates/stock/location.html:108 +#: stock/templates/stock/location.html:111 #: templates/InvenTree/search_stock_location.html:6 templates/stats.html:52 #: users/models.py:34 msgid "Stock Locations" @@ -4698,11 +4714,11 @@ msgstr "" msgid "Enter a search query" msgstr "" -#: templates/InvenTree/search.html:191 templates/js/stock.js:300 +#: templates/InvenTree/search.html:191 templates/js/stock.js:301 msgid "Shipped to customer" msgstr "" -#: templates/InvenTree/search.html:194 templates/js/stock.js:310 +#: templates/InvenTree/search.html:194 templates/js/stock.js:311 msgid "No stock location set" msgstr "" @@ -4744,6 +4760,10 @@ msgstr "" msgid "Global InvenTree Settings" msgstr "" +#: templates/InvenTree/settings/global.html:24 +msgid "Barcode Settings" +msgstr "" + #: templates/InvenTree/settings/header.html:7 msgid "Setting" msgstr "" @@ -4789,7 +4809,7 @@ msgstr "" msgid "Stock Settings" msgstr "" -#: templates/InvenTree/settings/stock.html:13 templates/stock_table.html:33 +#: templates/InvenTree/settings/stock.html:13 templates/stock_table.html:46 msgid "Stock Options" msgstr "" @@ -4940,71 +4960,87 @@ msgstr "" msgid "Enter barcode data" msgstr "" -#: templates/js/barcode.js:42 templates/js/modals.js:856 -msgid "Invalid server response" +#: templates/js/barcode.js:30 +msgid "Enter optional notes for stock transfer" msgstr "" -#: templates/js/barcode.js:143 -msgid "Scan barcode data below" +#: templates/js/barcode.js:40 +msgid "Enter notes" msgstr "" -#: templates/js/barcode.js:217 templates/js/barcode.js:263 +#: templates/js/barcode.js:68 +msgid "Server error" +msgstr "" + +#: templates/js/barcode.js:89 msgid "Unknown response from server" msgstr "" -#: templates/js/barcode.js:239 +#: templates/js/barcode.js:116 templates/js/modals.js:856 +msgid "Invalid server response" +msgstr "" + +#: templates/js/barcode.js:215 +msgid "Scan barcode data below" +msgstr "" + +#: templates/js/barcode.js:273 +msgid "No URL in response" +msgstr "" + +#: templates/js/barcode.js:291 msgid "Link Barcode to Stock Item" msgstr "" -#: templates/js/barcode.js:285 +#: templates/js/barcode.js:314 msgid "" "This will remove the association between this stock item and the barcode" msgstr "" -#: templates/js/barcode.js:291 +#: templates/js/barcode.js:320 msgid "Unlink" msgstr "" -#: templates/js/barcode.js:350 +#: templates/js/barcode.js:379 msgid "Remove stock item" msgstr "" -#: templates/js/barcode.js:397 -msgid "Enter notes" -msgstr "" - -#: templates/js/barcode.js:399 -msgid "Enter optional notes for stock transfer" -msgstr "" - -#: templates/js/barcode.js:404 +#: templates/js/barcode.js:421 msgid "Check Stock Items into Location" msgstr "" -#: templates/js/barcode.js:408 +#: templates/js/barcode.js:425 templates/js/barcode.js:550 msgid "Check In" msgstr "" -#: templates/js/barcode.js:466 -msgid "Server error" +#: templates/js/barcode.js:465 templates/js/barcode.js:589 +msgid "Error transferring stock" msgstr "" -#: templates/js/barcode.js:485 +#: templates/js/barcode.js:484 msgid "Stock Item already scanned" msgstr "" -#: templates/js/barcode.js:489 +#: templates/js/barcode.js:488 msgid "Stock Item already in this location" msgstr "" -#: templates/js/barcode.js:496 +#: templates/js/barcode.js:495 msgid "Added stock item" msgstr "" -#: templates/js/barcode.js:503 +#: templates/js/barcode.js:502 msgid "Barcode does not match Stock Item" msgstr "" +#: templates/js/barcode.js:545 +msgid "Check Into Location" +msgstr "" + +#: templates/js/barcode.js:608 +msgid "Barcode does not match a valid location" +msgstr "" + #: templates/js/bom.js:165 msgid "Open subassembly" msgstr "" @@ -5069,7 +5105,7 @@ msgstr "" msgid "Delete build output" msgstr "" -#: templates/js/build.js:209 templates/stock_table.html:18 +#: templates/js/build.js:209 templates/stock_table.html:20 msgid "New Stock Item" msgstr "" @@ -5085,7 +5121,7 @@ msgstr "" msgid "Build stock" msgstr "" -#: templates/js/build.js:582 templates/stock_table.html:42 +#: templates/js/build.js:582 templates/stock_table.html:55 msgid "Order stock" msgstr "" @@ -5271,7 +5307,7 @@ msgstr "" msgid "Order is overdue" msgstr "" -#: templates/js/order.js:193 templates/js/stock.js:844 +#: templates/js/order.js:193 templates/js/stock.js:862 msgid "Date" msgstr "" @@ -5303,12 +5339,12 @@ msgstr "" msgid "No variants found" msgstr "" -#: templates/js/part.js:291 templates/js/part.js:457 +#: templates/js/part.js:291 templates/js/part.js:471 msgid "No parts found" msgstr "" -#: templates/js/part.js:343 templates/js/stock.js:473 -#: templates/js/stock.js:1191 +#: templates/js/part.js:343 templates/js/stock.js:474 +#: templates/js/stock.js:1209 msgid "Select" msgstr "" @@ -5324,27 +5360,27 @@ msgstr "" msgid "Building" msgstr "" -#: templates/js/part.js:517 +#: templates/js/part.js:531 msgid "YES" msgstr "" -#: templates/js/part.js:519 +#: templates/js/part.js:533 msgid "NO" msgstr "" -#: templates/js/part.js:553 +#: templates/js/part.js:567 msgid "No test templates matching query" msgstr "" -#: templates/js/part.js:604 templates/js/stock.js:74 +#: templates/js/part.js:618 templates/js/stock.js:75 msgid "Edit test result" msgstr "" -#: templates/js/part.js:605 templates/js/stock.js:75 +#: templates/js/part.js:619 templates/js/stock.js:76 msgid "Delete test result" msgstr "" -#: templates/js/part.js:611 +#: templates/js/part.js:625 msgid "This test is defined for a parent part" msgstr "" @@ -5364,131 +5400,131 @@ msgstr "" msgid "No report templates found which match selected stock item(s)" msgstr "" -#: templates/js/stock.js:37 +#: templates/js/stock.js:38 msgid "PASS" msgstr "" -#: templates/js/stock.js:39 +#: templates/js/stock.js:40 msgid "FAIL" msgstr "" -#: templates/js/stock.js:44 +#: templates/js/stock.js:45 msgid "NO RESULT" msgstr "" -#: templates/js/stock.js:70 +#: templates/js/stock.js:71 msgid "Add test result" msgstr "" -#: templates/js/stock.js:89 +#: templates/js/stock.js:90 msgid "No test results found" msgstr "" -#: templates/js/stock.js:131 +#: templates/js/stock.js:132 msgid "Test Date" msgstr "" -#: templates/js/stock.js:292 +#: templates/js/stock.js:293 msgid "In production" msgstr "" -#: templates/js/stock.js:296 +#: templates/js/stock.js:297 msgid "Installed in Stock Item" msgstr "" -#: templates/js/stock.js:304 +#: templates/js/stock.js:305 msgid "Assigned to Sales Order" msgstr "" -#: templates/js/stock.js:324 +#: templates/js/stock.js:325 msgid "No stock items matching query" msgstr "" -#: templates/js/stock.js:441 +#: templates/js/stock.js:442 msgid "Undefined location" msgstr "" -#: templates/js/stock.js:535 +#: templates/js/stock.js:536 msgid "Stock item is in production" msgstr "" -#: templates/js/stock.js:540 +#: templates/js/stock.js:541 msgid "Stock item assigned to sales order" msgstr "" -#: templates/js/stock.js:543 +#: templates/js/stock.js:544 msgid "Stock item assigned to customer" msgstr "" -#: templates/js/stock.js:547 +#: templates/js/stock.js:548 msgid "Stock item has expired" msgstr "" -#: templates/js/stock.js:549 +#: templates/js/stock.js:550 msgid "Stock item will expire soon" msgstr "" -#: templates/js/stock.js:553 +#: templates/js/stock.js:554 msgid "Stock item has been allocated" msgstr "" -#: templates/js/stock.js:557 +#: templates/js/stock.js:558 msgid "Stock item has been installed in another item" msgstr "" -#: templates/js/stock.js:565 +#: templates/js/stock.js:566 msgid "Stock item has been rejected" msgstr "" -#: templates/js/stock.js:569 +#: templates/js/stock.js:570 msgid "Stock item is lost" msgstr "" -#: templates/js/stock.js:572 +#: templates/js/stock.js:573 msgid "Stock item is destroyed" msgstr "" -#: templates/js/stock.js:576 templates/js/table_filters.js:106 +#: templates/js/stock.js:577 templates/js/table_filters.js:106 msgid "Depleted" msgstr "" -#: templates/js/stock.js:605 +#: templates/js/stock.js:606 msgid "Stocktake" msgstr "" -#: templates/js/stock.js:760 +#: templates/js/stock.js:778 msgid "Stock Status" msgstr "" -#: templates/js/stock.js:775 +#: templates/js/stock.js:793 msgid "Set Stock Status" msgstr "" -#: templates/js/stock.js:789 +#: templates/js/stock.js:807 msgid "Select Status Code" msgstr "" -#: templates/js/stock.js:790 +#: templates/js/stock.js:808 msgid "Status code must be selected" msgstr "" -#: templates/js/stock.js:910 +#: templates/js/stock.js:928 msgid "No user information" msgstr "" -#: templates/js/stock.js:1030 +#: templates/js/stock.js:1048 msgid "Create New Location" msgstr "" -#: templates/js/stock.js:1129 +#: templates/js/stock.js:1147 msgid "Serial" msgstr "" -#: templates/js/stock.js:1222 templates/js/table_filters.js:131 +#: templates/js/stock.js:1240 templates/js/table_filters.js:131 msgid "Installed" msgstr "" -#: templates/js/stock.js:1247 +#: templates/js/stock.js:1265 msgid "Install item" msgstr "" @@ -5697,59 +5733,63 @@ msgstr "" msgid "Issues detected" msgstr "" -#: templates/stock_table.html:12 +#: templates/stock_table.html:14 msgid "Export Stock Information" msgstr "" -#: templates/stock_table.html:23 +#: templates/stock_table.html:27 +msgid "Barcode Actions" +msgstr "" + +#: templates/stock_table.html:36 msgid "Printing Actions" msgstr "" -#: templates/stock_table.html:27 +#: templates/stock_table.html:40 msgid "Print labels" msgstr "" -#: templates/stock_table.html:28 +#: templates/stock_table.html:41 msgid "Print test reports" msgstr "" -#: templates/stock_table.html:38 +#: templates/stock_table.html:51 msgid "Add to selected stock items" msgstr "" -#: templates/stock_table.html:39 +#: templates/stock_table.html:52 msgid "Remove from selected stock items" msgstr "" -#: templates/stock_table.html:40 +#: templates/stock_table.html:53 msgid "Stocktake selected stock items" msgstr "" -#: templates/stock_table.html:41 +#: templates/stock_table.html:54 msgid "Move selected stock items" msgstr "" -#: templates/stock_table.html:41 +#: templates/stock_table.html:54 msgid "Move stock" msgstr "" -#: templates/stock_table.html:42 +#: templates/stock_table.html:55 msgid "Order selected items" msgstr "" -#: templates/stock_table.html:43 +#: templates/stock_table.html:56 msgid "Change status" msgstr "" -#: templates/stock_table.html:43 +#: templates/stock_table.html:56 msgid "Change stock status" msgstr "" -#: templates/stock_table.html:46 +#: templates/stock_table.html:59 msgid "Delete selected items" msgstr "" -#: templates/stock_table.html:46 +#: templates/stock_table.html:59 msgid "Delete Stock" msgstr "" From 489a15704c0c3a9604457d1e4bba8b915ae9d698 Mon Sep 17 00:00:00 2001 From: Oliver Walters Date: Thu, 28 Jan 2021 22:41:20 +1100 Subject: [PATCH 13/15] Refactoring --- InvenTree/templates/js/barcode.js | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/InvenTree/templates/js/barcode.js b/InvenTree/templates/js/barcode.js index 7a04aaa11d..d91eb85e68 100644 --- a/InvenTree/templates/js/barcode.js +++ b/InvenTree/templates/js/barcode.js @@ -1,12 +1,14 @@ {% load i18n %} -function makeBarcodeInput(placeholderText='') { +function makeBarcodeInput(placeholderText='', hintText='') { /* * Generate HTML for a barcode input */ placeholderText = placeholderText || '{% trans "Scan barcode data here using wedge scanner" %}'; + hintText = hintText || '{% trans "Enter barcode data" %}'; + var html = `
    @@ -17,7 +19,7 @@ function makeBarcodeInput(placeholderText='') {
    -
    {% trans "Enter barcode data" %}
    +
    ${hintText}
    `; @@ -28,6 +30,7 @@ function makeBarcodeInput(placeholderText='') { function makeNotesField(options={}) { var tooltip = options.tooltip || '{% trans "Enter optional notes for stock transfer" %}'; + var placeholder = options.placeholder || '{% trans "Enter notes" %}'; return `
    @@ -37,7 +40,7 @@ function makeNotesField(options={}) { - +
    ${tooltip}
    From fc193c26d0f781537f153d3d4755e24d2d5ad63f Mon Sep 17 00:00:00 2001 From: Oliver Walters Date: Thu, 28 Jan 2021 22:43:41 +1100 Subject: [PATCH 14/15] Delete unused function --- InvenTree/templates/js/barcode.js | 6 ------ 1 file changed, 6 deletions(-) diff --git a/InvenTree/templates/js/barcode.js b/InvenTree/templates/js/barcode.js index d91eb85e68..990adc1a0b 100644 --- a/InvenTree/templates/js/barcode.js +++ b/InvenTree/templates/js/barcode.js @@ -120,12 +120,6 @@ function showInvalidResponseError(modal, response, status) { } -function clearBarcodeError(modal, message) { - - $(modal + ' #barcode-error-message').html(''); -} - - function enableBarcodeInput(modal, enabled=true) { var barcode = $(modal + ' #barcode'); From 62501ecb93bda2f8425b892762da58a7cbffc2f4 Mon Sep 17 00:00:00 2001 From: Oliver Walters Date: Fri, 29 Jan 2021 09:48:16 +1100 Subject: [PATCH 15/15] Hide main QR button if setting is disabled --- InvenTree/templates/base.html | 4 ++++ InvenTree/templates/navbar.html | 13 +++++++++---- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/InvenTree/templates/base.html b/InvenTree/templates/base.html index f7ee1b2f19..995cd6929d 100644 --- a/InvenTree/templates/base.html +++ b/InvenTree/templates/base.html @@ -2,6 +2,8 @@ {% load i18n %} {% load inventree_extras %} +{% settings_value 'BARCODE_ENABLE' as barcodes %} + @@ -145,9 +147,11 @@ $(document).ready(function () { showCachedAlerts(); + {% if barcodes %} $('#barcode-scan').click(function() { barcodeScanDialog(); }); + {% endif %} }); diff --git a/InvenTree/templates/navbar.html b/InvenTree/templates/navbar.html index 9dafd5769e..6e3fe024ca 100644 --- a/InvenTree/templates/navbar.html +++ b/InvenTree/templates/navbar.html @@ -1,5 +1,9 @@ {% load static %} +{% load inventree_extras %} {% load i18n %} + +{% settings_value 'BARCODE_ENABLE' as barcodes %} + \ No newline at end of file +