diff --git a/.github/workflows/coverage.yaml b/.github/workflows/coverage.yaml
new file mode 100644
index 0000000000..85362ae917
--- /dev/null
+++ b/.github/workflows/coverage.yaml
@@ -0,0 +1,46 @@
+# Perform CI checks, and calculate code coverage
+
+name: SQLite
+
+on: ["push", "pull_request"]
+
+jobs:
+
+ # Run tests on SQLite database
+ # These tests are used for code coverage analysis
+ coverage:
+ runs-on: ubuntu-latest
+
+ env:
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+ INVENTREE_DB_NAME: './test_db.sqlite'
+ INVENTREE_DB_ENGINE: django.db.backends.sqlite3
+ INVENTREE_DEBUG: info
+
+ steps:
+ - name: Checkout Code
+ uses: actions/checkout@v2
+ - name: Setup Python
+ uses: actions/setup-python@v2
+ with:
+ python-version: 3.7
+ - name: Install Dependencies
+ run: |
+ sudo apt-get update
+ pip3 install invoke
+ invoke install
+ - name: Coverage Tests
+ run: |
+ invoke coverage
+ - name: Data Import Export
+ run: |
+ invoke migrate
+ invoke import-fixtures
+ invoke export-records -f data.json
+ rm test_db.sqlite
+ invoke migrate
+ invoke import-records -f data.json
+ - name: Check Migration Files
+ run: python3 ci/check_migration_files.py
+ - name: Upload Coverage Report
+ run: coveralls
diff --git a/.github/workflows/mariadb.yaml b/.github/workflows/mariadb.yaml
new file mode 100644
index 0000000000..2ae02c2bd0
--- /dev/null
+++ b/.github/workflows/mariadb.yaml
@@ -0,0 +1,46 @@
+name: MariaDB
+
+on: ["push", "pull_request"]
+
+jobs:
+
+ test:
+ runs-on: ubuntu-latest
+
+ env:
+ # Database backend configuration
+ INVENTREE_DB_ENGINE: django.db.backends.mysql
+ INVENTREE_DB_NAME: inventree
+ INVENTREE_DB_USER: root
+ INVENTREE_DB_PASSWORD: password
+ INVENTREE_DB_HOST: '127.0.0.1'
+ INVENTREE_DB_PORT: 3306
+ INVENTREE_DEBUG: info
+
+ services:
+ mariadb:
+ image: mariadb:latest
+ env:
+ MYSQL_ALLOW_EMPTY_PASSWORD: yes
+ MYSQL_DATABASE: inventree
+ MYSQL_USER: inventree
+ MYSQL_PASSWORD: password
+ MYSQL_ROOT_PASSWORD: password
+ ports:
+ - 3306:3306
+
+ steps:
+ - name: Checkout Code
+ uses: actions/checkout@v2
+ - name: Setup Python
+ uses: actions/setup-python@v2
+ with:
+ python-version: 3.7
+ - name: Install Dependencies
+ run: |
+ sudo apt-get install mysql-server libmysqlclient-dev
+ pip3 install invoke
+ pip3 install mysqlclient
+ invoke install
+ - name: Run Tests
+ run: invoke test
diff --git a/.github/workflows/mysql.yaml b/.github/workflows/mysql.yaml
new file mode 100644
index 0000000000..7d3ee8d6ae
--- /dev/null
+++ b/.github/workflows/mysql.yaml
@@ -0,0 +1,49 @@
+# MySQL Unit Testing
+
+name: MySQL
+
+on: ["push", "pull_request"]
+
+jobs:
+
+ test:
+ runs-on: ubuntu-latest
+
+ env:
+ # Database backend configuration
+ INVENTREE_DB_ENGINE: django.db.backends.mysql
+ INVENTREE_DB_NAME: inventree
+ INVENTREE_DB_USER: root
+ INVENTREE_DB_PASSWORD: password
+ INVENTREE_DB_HOST: '127.0.0.1'
+ INVENTREE_DB_PORT: 3306
+ INVENTREE_DEBUG: info
+
+ services:
+ mysql:
+ image: mysql:latest
+ env:
+ MYSQL_ALLOW_EMPTY_PASSWORD: yes
+ MYSQL_DATABASE: inventree
+ MYSQL_USER: inventree
+ MYSQL_PASSWORD: password
+ MYSQL_ROOT_PASSWORD: password
+ options: --health-cmd="mysqladmin ping" --health-interval=5s --health-timeout=2s --health-retries=3
+ ports:
+ - 3306:3306
+
+ steps:
+ - name: Checkout Code
+ uses: actions/checkout@v2
+ - name: Setup Python
+ uses: actions/setup-python@v2
+ with:
+ python-version: 3.7
+ - name: Install Dependencies
+ run: |
+ sudo apt-get install mysql-server libmysqlclient-dev
+ pip3 install invoke
+ pip3 install mysqlclient
+ invoke install
+ - name: Run Tests
+ run: invoke test
\ No newline at end of file
diff --git a/.github/workflows/postgresql.yaml b/.github/workflows/postgresql.yaml
new file mode 100644
index 0000000000..aab05205cc
--- /dev/null
+++ b/.github/workflows/postgresql.yaml
@@ -0,0 +1,45 @@
+# PostgreSQL Unit Testing
+
+name: PostgreSQL
+
+on: ["push", "pull_request"]
+
+jobs:
+
+ test:
+ runs-on: ubuntu-latest
+
+ env:
+ # Database backend configuration
+ INVENTREE_DB_ENGINE: django.db.backends.postgresql
+ INVENTREE_DB_NAME: inventree
+ INVENTREE_DB_USER: inventree
+ INVENTREE_DB_PASSWORD: password
+ INVENTREE_DB_HOST: '127.0.0.1'
+ INVENTREE_DB_PORT: 5432
+ INVENTREE_DEBUG: info
+
+ services:
+ postgres:
+ image: postgres
+ env:
+ POSTGRES_USER: inventree
+ POSTGRES_PASSWORD: password
+ ports:
+ - 5432:5432
+
+ steps:
+ - name: Checkout Code
+ uses: actions/checkout@v2
+ - name: Setup Python
+ uses: actions/setup-python@v2
+ with:
+ python-version: 3.7
+ - name: Install Dependencies
+ run: |
+ sudo apt-get install libpq-dev
+ pip3 install invoke
+ pip3 install psycopg2
+ invoke install
+ - name: Run Tests
+ run: invoke test
\ No newline at end of file
diff --git a/.github/workflows/style.yaml b/.github/workflows/style.yaml
index 90dae47857..31da3ec61a 100644
--- a/.github/workflows/style.yaml
+++ b/.github/workflows/style.yaml
@@ -1,11 +1,27 @@
name: Style Checks
-on: push
+on: ["push", "pull_request"]
jobs:
- pep:
+ style:
runs-on: ubuntu-latest
+ strategy:
+ max-parallel: 4
+ matrix:
+ python-version: [3.7]
+
steps:
- name: Checkout code
- uses: actions/checkout@v2
\ No newline at end of file
+ uses: actions/checkout@v2
+ - name: Set up Python ${{ matrix.python-version }}
+ uses: actions/setup-python@v2
+ with:
+ python-version: ${{ matrix.python-version }}
+ - name: Install deps
+ run: |
+ pip install flake8==3.8.3
+ pip install pep8-naming==0.11.1
+ - name: flake8
+ run: |
+ flake8 InvenTree
diff --git a/.travis.yml b/.travis.yml
deleted file mode 100644
index fdf3be5bc7..0000000000
--- a/.travis.yml
+++ /dev/null
@@ -1,55 +0,0 @@
-dist: xenial
-
-services:
- - mysql
- - postgresql
-
-language: python
-python:
- - 3.6
- - 3.7
-
-addons:
- apt-packages:
- - sqlite3
-
-before_install:
- - sudo useradd --create-home inventree
- - sudo mkdir /home/inventree/media /home/media/static /home/media/backup
- - sudo apt-get update
- - sudo apt-get install gettext
- - sudo apt-get install mysql-server libmysqlclient-dev
- - sudo apt-get install libpq-dev
- - pip3 install invoke
- - pip3 install mysqlclient
- - pip3 install psycopg2
- - invoke install
- - invoke migrate
- - cd InvenTree && python3 manage.py createsuperuser --username InvenTreeAdmin --email admin@inventree.com --noinput && cd ..
- - psql -c 'create database inventree_test_db;' -U postgres
- - mysql -e 'CREATE DATABASE inventree_test_db;'
-
-script:
- - cd InvenTree && python3 manage.py makemigrations && cd ..
- - python3 ci/check_migration_files.py
- # Run unit testing / code coverage tests
- - invoke coverage
- # Run unit test for SQL database backend
- - cd InvenTree && python3 manage.py test --settings=InvenTree.ci_mysql && cd ..
- # Run unit test for PostgreSQL database backend
- - cd InvenTree && python3 manage.py test --settings=InvenTree.ci_postgresql && cd ..
- - invoke translate
- - invoke style
- # Create an empty database and fill it with test data
- - rm inventree_default_db.sqlite3
- - invoke migrate
- - invoke import-fixtures
- # Export database records
- - invoke export-records -f data.json
- # Create a new empty database and import the saved data
- - rm inventree_default_db.sqlite3
- - invoke migrate
- - invoke import-records -f data.json
-
-after_success:
- - coveralls
\ No newline at end of file
diff --git a/InvenTree/InvenTree/ci_mysql.py b/InvenTree/InvenTree/ci_mysql.py
deleted file mode 100644
index 0a61866082..0000000000
--- a/InvenTree/InvenTree/ci_mysql.py
+++ /dev/null
@@ -1,18 +0,0 @@
-"""
-Configuration file for running tests against a MySQL database.
-"""
-
-from InvenTree.settings import *
-
-# Override the 'test' database
-if 'test' in sys.argv:
- print('InvenTree: Running tests - Using MySQL test database')
-
- DATABASES['default'] = {
- # Ensure mysql backend is being used
- 'ENGINE': 'django.db.backends.mysql',
- 'NAME': 'inventree_test_db',
- 'USER': 'travis',
- 'PASSWORD': '',
- 'HOST': '127.0.0.1'
- }
diff --git a/InvenTree/InvenTree/ci_postgresql.py b/InvenTree/InvenTree/ci_postgresql.py
deleted file mode 100644
index e235658b96..0000000000
--- a/InvenTree/InvenTree/ci_postgresql.py
+++ /dev/null
@@ -1,17 +0,0 @@
-"""
-Configuration file for running tests against a MySQL database.
-"""
-
-from InvenTree.settings import *
-
-# Override the 'test' database
-if 'test' in sys.argv:
- print('InvenTree: Running tests - Using PostGreSQL test database')
-
- DATABASES['default'] = {
- # Ensure postgresql backend is being used
- 'ENGINE': 'django.db.backends.postgresql',
- 'NAME': 'inventree_test_db',
- 'USER': 'postgres',
- 'PASSWORD': '',
- }
diff --git a/InvenTree/InvenTree/settings.py b/InvenTree/InvenTree/settings.py
index 2822202f13..f49c5d1f75 100644
--- a/InvenTree/InvenTree/settings.py
+++ b/InvenTree/InvenTree/settings.py
@@ -335,87 +335,71 @@ MARKDOWNIFY_BLEACH = False
DATABASES = {}
"""
-When running unit tests, enforce usage of sqlite3 database,
-so that the tests can be run in RAM without any setup requirements
+Configure the database backend based on the user-specified values.
+
+- Primarily this configuration happens in the config.yaml file
+- However there may be reason to configure the DB via environmental variables
+- The following code lets the user "mix and match" database configuration
"""
-if TESTING:
- logger.info('InvenTree: Running tests - Using sqlite3 memory database')
- DATABASES['default'] = {
- # Ensure sqlite3 backend is being used
- 'ENGINE': 'django.db.backends.sqlite3',
- # Doesn't matter what the database is called, it is executed in RAM
- 'NAME': 'ram_test_db.sqlite3',
- }
-# Database backend selection
-else:
- """
- Configure the database backend based on the user-specified values.
-
- - Primarily this configuration happens in the config.yaml file
- - However there may be reason to configure the DB via environmental variables
- - The following code lets the user "mix and match" database configuration
- """
+logger.info("Configuring database backend:")
- logger.info("Configuring database backend:")
+# Extract database configuration from the config.yaml file
+db_config = CONFIG.get('database', {})
- # Extract database configuration from the config.yaml file
- db_config = CONFIG.get('database', {})
+if not db_config:
+ db_config = {}
- # Default action if db_config not specified in yaml file
- if not db_config:
- db_config = {}
+# Environment variables take preference over config file!
- # If a particular database option is not specified in the config file,
- # look for it in the environmental variables
- # e.g. INVENTREE_DB_NAME / INVENTREE_DB_USER / etc
+db_keys = ['ENGINE', 'NAME', 'USER', 'PASSWORD', 'HOST', 'PORT']
- db_keys = ['ENGINE', 'NAME', 'USER', 'PASSWORD', 'HOST', 'PORT']
+for key in db_keys:
+ # First, check the environment variables
+ env_key = f"INVENTREE_DB_{key}"
+ env_var = os.environ.get(env_key, None)
- for key in db_keys:
- if key not in db_config:
- logger.debug(f" - Missing {key} value: Looking for environment variable INVENTREE_DB_{key}")
- env_key = f'INVENTREE_DB_{key}'
- env_var = os.environ.get(env_key, None)
+ if env_var:
+ logger.info(f"{env_key}={env_var}")
+ # Override configuration value
+ db_config[key] = env_var
- if env_var is not None:
- logger.info(f'Using environment variable INVENTREE_DB_{key}')
- db_config[key] = env_var
- else:
- logger.debug(f' INVENTREE_DB_{key} not found in environment variables')
+# Check that required database configuration options are specified
+reqiured_keys = ['ENGINE', 'NAME']
- # Check that required database configuration options are specified
- reqiured_keys = ['ENGINE', 'NAME']
+for key in reqiured_keys:
+ if key not in db_config:
+ error_msg = f'Missing required database configuration value {key} in config.yaml'
+ logger.error(error_msg)
- for key in reqiured_keys:
- if key not in db_config:
- error_msg = f'Missing required database configuration value {key} in config.yaml'
- logger.error(error_msg)
+ print('Error: ' + error_msg)
+ sys.exit(-1)
- print('Error: ' + error_msg)
- sys.exit(-1)
+"""
+Special considerations for the database 'ENGINE' setting.
+It can be specified in config.yaml (or envvar) as either (for example):
+- sqlite3
+- django.db.backends.sqlite3
+- django.db.backends.postgresql
+"""
- """
- Special considerations for the database 'ENGINE' setting.
- It can be specified in config.yaml (or envvar) as either (for example):
- - sqlite3
- - django.db.backends.sqlite3
- - django.db.backends.postgresql
- """
+db_engine = db_config['ENGINE']
- db_engine = db_config['ENGINE']
+if db_engine.lower() in ['sqlite3', 'postgresql', 'mysql']:
+ # Prepend the required python module string
+ db_engine = f'django.db.backends.{db_engine.lower()}'
+ db_config['ENGINE'] = db_engine
- if db_engine.lower() in ['sqlite3', 'postgresql', 'mysql']:
- # Prepend the required python module string
- db_engine = f'django.db.backends.{db_engine.lower()}'
- db_config['ENGINE'] = db_engine
+db_name = db_config['NAME']
+db_host = db_config.get('HOST', "''")
- db_name = db_config['NAME']
+print("InvenTree Database Configuration")
+print("================================")
+print(f"ENGINE: {db_engine}")
+print(f"NAME: {db_name}")
+print(f"HOST: {db_host}")
- logger.info(f"Database ENGINE: '{db_engine}'")
- logger.info(f"Database NAME: '{db_name}'")
-
- DATABASES['default'] = db_config
+DATABASES['default'] = db_config
CACHES = {
'default': {
diff --git a/InvenTree/InvenTree/static/css/inventree.css b/InvenTree/InvenTree/static/css/inventree.css
index 1c10897b6c..153931f974 100644
--- a/InvenTree/InvenTree/static/css/inventree.css
+++ b/InvenTree/InvenTree/static/css/inventree.css
@@ -586,6 +586,8 @@
.breadcrump {
margin-bottom: 5px;
+ margin-left: 5px;
+ margin-right: 10px;
}
.inventree-body {
@@ -624,6 +626,53 @@
z-index: 11000;
}
+.modal-close {
+ position: absolute;
+ top: 15px;
+ right: 35px;
+ color: #f1f1f1;
+ font-size: 40px;
+ font-weight: bold;
+ transition: 0.25s;
+}
+
+.modal-close:hover,
+.modal-close:focus {
+ color: #bbb;
+ text-decoration: none;
+ cursor: pointer;
+}
+
+.modal-image-content {
+ margin: auto;
+ display: block;
+ width: 80%;
+ max-width: 700px;
+ text-align: center;
+ color: #ccc;
+ padding: 10px 0;
+}
+
+@media only screen and (max-width: 700px){
+ .modal-image-content {
+ width: 100%;
+ }
+}
+
+.modal-image {
+ display: none;
+ position: fixed;
+ z-index: 10000;
+ padding-top: 100px;
+ left: 0;
+ top: 0;
+ width: 100%;
+ height: 100%;
+ overflow: auto;
+ background-color: rgb(0,0,0); /* Fallback color */
+ background-color: rgba(0,0,0,0.85); /* Black w/ opacity */
+}
+
.js-modal-form .checkbox {
margin-left: 0px;
}
diff --git a/InvenTree/build/forms.py b/InvenTree/build/forms.py
index 061ae0d16d..4892fa631f 100644
--- a/InvenTree/build/forms.py
+++ b/InvenTree/build/forms.py
@@ -95,7 +95,7 @@ class BuildOutputCreateForm(HelperForm):
confirm = forms.BooleanField(
required=True,
label=_('Confirm'),
- help_text=_('Confirm creation of build outut'),
+ help_text=_('Confirm creation of build output'),
)
class Meta:
diff --git a/InvenTree/build/templates/build/notes.html b/InvenTree/build/templates/build/notes.html
index a7a4677c96..ede15651ab 100644
--- a/InvenTree/build/templates/build/notes.html
+++ b/InvenTree/build/templates/build/notes.html
@@ -10,6 +10,9 @@
{% block heading %}
{% trans "Build Notes" %}
+{% if roles.build.change and not editing %}
+
+{% endif %}
{% endblock %}
{% block details %}
@@ -20,14 +23,13 @@
{{ form }}
-
+ {% trans "Save" %}
{{ form.media }}
{% else %}
-
{{ build.notes | markdownify }}
{% endif %}
diff --git a/InvenTree/common/models.py b/InvenTree/common/models.py
index 23e0773605..6d74ace343 100644
--- a/InvenTree/common/models.py
+++ b/InvenTree/common/models.py
@@ -78,6 +78,13 @@ class InvenTreeSetting(models.Model):
'choices': djmoney.settings.CURRENCY_CHOICES,
},
+ 'INVENTREE_DOWNLOAD_FROM_URL': {
+ 'name': _('Download from URL'),
+ 'description': _('Allow download of remote images and files from external URL'),
+ 'validator': bool,
+ 'default': False,
+ },
+
'BARCODE_ENABLE': {
'name': _('Barcode Support'),
'description': _('Enable barcode scanner support'),
@@ -97,6 +104,13 @@ class InvenTreeSetting(models.Model):
'validator': bool,
},
+ 'PART_ALLOW_EDIT_IPN': {
+ 'name': _('Allow Editing IPN'),
+ 'description': _('Allow changing the IPN value while editing a part'),
+ 'default': True,
+ 'validator': bool,
+ },
+
'PART_COPY_BOM': {
'name': _('Copy Part BOM Data'),
'description': _('Copy BOM data by default when duplicating a part'),
diff --git a/InvenTree/company/apps.py b/InvenTree/company/apps.py
index 2777425ab4..3fa3197183 100644
--- a/InvenTree/company/apps.py
+++ b/InvenTree/company/apps.py
@@ -7,6 +7,7 @@ from django.apps import AppConfig
from django.db.utils import OperationalError, ProgrammingError
from django.conf import settings
+from PIL import UnidentifiedImageError
logger = logging.getLogger(__name__)
@@ -38,9 +39,11 @@ class CompanyConfig(AppConfig):
try:
company.image.render_variations(replace=False)
except FileNotFoundError:
- logger.warning("Image file missing")
+ logger.warning(f"Image file '{company.image}' missing")
company.image = None
company.save()
+ except UnidentifiedImageError:
+ logger.warning(f"Image file '{company.image}' is invalid")
except (OperationalError, ProgrammingError):
# Getting here probably meant the database was in test mode
pass
diff --git a/InvenTree/company/forms.py b/InvenTree/company/forms.py
index 0ad95c3e8c..67ac402ba7 100644
--- a/InvenTree/company/forms.py
+++ b/InvenTree/company/forms.py
@@ -66,6 +66,24 @@ class CompanyImageForm(HelperForm):
]
+class CompanyImageDownloadForm(HelperForm):
+ """
+ Form for downloading an image from a URL
+ """
+
+ url = django.forms.URLField(
+ label=_('URL'),
+ help_text=_('Image URL'),
+ required=True
+ )
+
+ class Meta:
+ model = Company
+ fields = [
+ 'url',
+ ]
+
+
class EditSupplierPartForm(HelperForm):
""" Form for editing a SupplierPart object """
diff --git a/InvenTree/company/templates/company/company_base.html b/InvenTree/company/templates/company/company_base.html
index 3035eeaa15..9331e5d895 100644
--- a/InvenTree/company/templates/company/company_base.html
+++ b/InvenTree/company/templates/company/company_base.html
@@ -2,19 +2,32 @@
{% load static %}
{% load i18n %}
+{% load inventree_extras %}
+
{% block page_title %}
InvenTree | {% trans "Company" %} - {{ company.name }}
{% endblock %}
+
{% block thumbnail %}
-
-
+
+
+
+
+ {% if allow_download %}
+
+ {% endif %}
+
+
{% endblock %}
@@ -135,7 +148,13 @@ InvenTree | {% trans "Company" %} - {{ company.name }}
}
);
- $("#company-thumb").click(function() {
+ {% if company.image %}
+ $('#company-image').click(function() {
+ showModalImage('{{ company.image.url }}');
+ });
+ {% endif %}
+
+ $("#company-image-upload").click(function() {
launchModalForm(
"{% url 'company-image' company.id %}",
{
@@ -144,4 +163,17 @@ InvenTree | {% trans "Company" %} - {{ company.name }}
);
});
+ {% settings_value "INVENTREE_DOWNLOAD_FROM_URL" as allow_download %}
+
+ {% if allow_download %}
+ $('#company-image-url').click(function() {
+ launchModalForm(
+ '{% url "company-image-download" company.id %}',
+ {
+ reload: true,
+ }
+ )
+ });
+ {% endif %}
+
{% endblock %}
\ No newline at end of file
diff --git a/InvenTree/company/templates/company/notes.html b/InvenTree/company/templates/company/notes.html
index 63fab7ca32..580fa84d52 100644
--- a/InvenTree/company/templates/company/notes.html
+++ b/InvenTree/company/templates/company/notes.html
@@ -9,6 +9,9 @@
{% block heading %}
{% trans "Company Notes" %}
+{% if not editing %}
+
+{% endif %}
{% endblock %}
{% block details %}
@@ -18,7 +21,7 @@
{{ form }}
-
+ {% trans "Save" %}
@@ -26,7 +29,6 @@
{% else %}
-
{{ company.notes | markdownify }}
{% endif %}
diff --git a/InvenTree/company/urls.py b/InvenTree/company/urls.py
index f5fbeede47..b5ad06019b 100644
--- a/InvenTree/company/urls.py
+++ b/InvenTree/company/urls.py
@@ -21,6 +21,7 @@ company_detail_urls = [
url(r'^notes/', views.CompanyNotes.as_view(), name='company-notes'),
url(r'^thumbnail/', views.CompanyImage.as_view(), name='company-image'),
+ url(r'^thumb-download/', views.CompanyImageDownloadFromURL.as_view(), name='company-image-download'),
# Any other URL
url(r'^.*$', views.CompanyDetail.as_view(), name='company-detail'),
diff --git a/InvenTree/company/views.py b/InvenTree/company/views.py
index 59e9b23904..42457d6101 100644
--- a/InvenTree/company/views.py
+++ b/InvenTree/company/views.py
@@ -11,9 +11,14 @@ from django.views.generic import DetailView, ListView, UpdateView
from django.urls import reverse
from django.forms import HiddenInput
+from django.core.files.base import ContentFile
from moneyed import CURRENCIES
+from PIL import Image
+import requests
+import io
+
from InvenTree.views import AjaxCreateView, AjaxUpdateView, AjaxDeleteView
from InvenTree.helpers import str2bool
from InvenTree.views import InvenTreeRoleMixin
@@ -28,6 +33,7 @@ from .forms import EditCompanyForm
from .forms import CompanyImageForm
from .forms import EditSupplierPartForm
from .forms import EditPriceBreakForm
+from .forms import CompanyImageDownloadForm
import common.models
import common.settings
@@ -150,6 +156,84 @@ class CompanyDetail(DetailView):
return ctx
+class CompanyImageDownloadFromURL(AjaxUpdateView):
+ """
+ View for downloading an image from a provided URL
+ """
+
+ model = Company
+ ajax_template_name = 'image_download.html'
+ form_class = CompanyImageDownloadForm
+ ajax_form_title = _('Download Image')
+
+ def validate(self, company, form):
+ """
+ Validate that the image data are correct
+ """
+ # First ensure that the normal validation routines pass
+ if not form.is_valid():
+ return
+
+ # We can now extract a valid URL from the form data
+ url = form.cleaned_data.get('url', None)
+
+ # Download the file
+ response = requests.get(url, stream=True)
+
+ # Look at response header, reject if too large
+ content_length = response.headers.get('Content-Length', '0')
+
+ try:
+ content_length = int(content_length)
+ except (ValueError):
+ # If we cannot extract meaningful length, just assume it's "small enough"
+ content_length = 0
+
+ # TODO: Factor this out into a configurable setting
+ MAX_IMG_LENGTH = 10 * 1024 * 1024
+
+ if content_length > MAX_IMG_LENGTH:
+ form.add_error('url', _('Image size exceeds maximum allowable size for download'))
+ return
+
+ self.response = response
+
+ # Check for valid response code
+ if not response.status_code == 200:
+ form.add_error('url', f"{_('Invalid response')}: {response.status_code}")
+ return
+
+ response.raw.decode_content = True
+
+ try:
+ self.image = Image.open(response.raw).convert()
+ self.image.verify()
+ except:
+ form.add_error('url', _("Supplied URL is not a valid image file"))
+ return
+
+ def save(self, company, form, **kwargs):
+ """
+ Save the downloaded image to the company
+ """
+ fmt = self.image.format
+
+ if not fmt:
+ fmt = 'PNG'
+
+ buffer = io.BytesIO()
+
+ self.image.save(buffer, format=fmt)
+
+ # Construct a simplified name for the image
+ filename = f"company_{company.pk}_image.{fmt.lower()}"
+
+ company.image.save(
+ filename,
+ ContentFile(buffer.getvalue()),
+ )
+
+
class CompanyImage(AjaxUpdateView):
""" View for uploading an image for the Company """
model = Company
diff --git a/InvenTree/locale/de/LC_MESSAGES/django.mo b/InvenTree/locale/de/LC_MESSAGES/django.mo
index 742a6d8242..aa43358545 100644
Binary files a/InvenTree/locale/de/LC_MESSAGES/django.mo and b/InvenTree/locale/de/LC_MESSAGES/django.mo differ
diff --git a/InvenTree/locale/de/LC_MESSAGES/django.po b/InvenTree/locale/de/LC_MESSAGES/django.po
index 046737f0e6..d3ad0b4a69 100644
--- a/InvenTree/locale/de/LC_MESSAGES/django.po
+++ b/InvenTree/locale/de/LC_MESSAGES/django.po
@@ -6,16 +6,16 @@ msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2021-03-09 11:11+0100\n"
-"PO-Revision-Date: 2021-03-06 15:16+0100\n"
-"Last-Translator: Andreas Kaiser \n"
+"POT-Creation-Date: 2021-03-28 15:13+0000\n"
+"PO-Revision-Date: 2021-03-28 17:47+0200\n"
+"Last-Translator: Andreas Kaiser , Matthias MAIR\n"
"Language-Team: C \n"
"Language: de\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-"X-Generator: Poedit 2.3\n"
+"X-Generator: Poedit 2.4.2\n"
#: InvenTree/api.py:62
msgid "API endpoint not found"
@@ -43,7 +43,7 @@ msgstr "Löschung von Position bestätigen"
#: InvenTree/forms.py:158
msgid "Enter new password"
-msgstr "neues Passwort eingeben"
+msgstr "Neues Passwort eingeben"
#: InvenTree/forms.py:165
msgid "Confirm new password"
@@ -57,7 +57,7 @@ msgstr "Thema anwenden"
msgid "Select Category"
msgstr "Kategorie auswählen"
-#: InvenTree/helpers.py:361 order/models.py:232 order/models.py:331
+#: InvenTree/helpers.py:361 order/models.py:242 order/models.py:341
#: stock/views.py:1762
msgid "Invalid quantity provided"
msgstr "Keine gültige Menge"
@@ -107,7 +107,7 @@ msgid "User"
msgstr "Benutzer"
#: InvenTree/models.py:106 label/models.py:101 part/models.py:685
-#: part/templates/part/params.html:27 report/models.py:162
+#: part/templates/part/params.html:27 report/models.py:179
#: templates/js/part.js:109
msgid "Name"
msgstr "Name"
@@ -173,7 +173,7 @@ msgid "Returned"
msgstr "Zurückgegeben"
#: InvenTree/status_codes.py:136
-#: order/templates/order/sales_order_base.html:121
+#: order/templates/order/sales_order_base.html:124
msgid "Shipped"
msgstr "Versendet"
@@ -273,31 +273,31 @@ msgstr "Treffer für Barcode gefunden"
#: barcodes/api.py:153
msgid "Must provide stockitem parameter"
-msgstr ""
+msgstr "BestandsObjekt-Parameter muss angegeben werden"
#: barcodes/api.py:160
msgid "No matching stock item found"
-msgstr "Keine passende Lagerobjekt gefunden"
+msgstr "Keine passende BestandsObjekt gefunden"
#: barcodes/api.py:190
msgid "Barcode already matches StockItem object"
-msgstr ""
+msgstr "Barcode entspricht bereits BestandsObjekt"
#: barcodes/api.py:194
msgid "Barcode already matches StockLocation object"
-msgstr ""
+msgstr "Barcode entspricht bereits Bestandslagerort"
#: barcodes/api.py:198
msgid "Barcode already matches Part object"
-msgstr ""
+msgstr "Barcode entspricht bereits Teil"
#: barcodes/api.py:204 barcodes/api.py:216
msgid "Barcode hash already matches StockItem object"
-msgstr ""
+msgstr "Barcode ist bereits BestandsObjekt zugeordnet"
#: barcodes/api.py:222
msgid "Barcode associated with StockItem"
-msgstr "Barcode zugeordnet zu Lagerobjekt"
+msgstr "Barcode zugeordnet zu BestandsObjekt"
#: build/forms.py:34
msgid "Build Order reference"
@@ -310,7 +310,7 @@ msgstr "geplantes Bestelldatum"
#: build/forms.py:39 build/models.py:224
msgid ""
"Target date for build completion. Build will be overdue after this date."
-msgstr ""
+msgstr "Zieldatum für Bauauftrag-Fertigstellung."
#: build/forms.py:44
msgid "Number of items to build"
@@ -318,8 +318,8 @@ msgstr "Anzahl der zu bauenden Teile"
#: build/forms.py:85 build/templates/build/auto_allocate.html:17
#: build/templates/build/build_base.html:91
-#: build/templates/build/detail.html:31 common/models.py:682
-#: company/forms.py:112 company/templates/company/supplier_part_pricing.html:77
+#: build/templates/build/detail.html:31 common/models.py:696
+#: company/forms.py:130 company/templates/company/supplier_part_pricing.html:77
#: order/templates/order/order_wizard/select_parts.html:32
#: order/templates/order/purchase_order_detail.html:193
#: order/templates/order/sales_order_detail.html:77
@@ -327,7 +327,9 @@ msgstr "Anzahl der zu bauenden Teile"
#: part/templates/part/allocation.html:19
#: part/templates/part/allocation.html:53
#: part/templates/part/sale_prices.html:85
-#: report/templates/report/inventree_build_order_base.html:117
+#: report/templates/report/inventree_build_order_base.html:114
+#: report/templates/report/inventree_po_report.html:91
+#: report/templates/report/inventree_so_report.html:91
#: report/templates/report/inventree_test_report_base.html:77
#: stock/forms.py:307 stock/templates/stock/item_base.html:51
#: stock/templates/stock/item_base.html:57
@@ -340,7 +342,7 @@ msgstr "Anzahl"
#: build/forms.py:86
msgid "Enter quantity for build output"
-msgstr "Menge für den Bau angeben"
+msgstr "Menge für den Bau-Ausgabe angeben"
#: build/forms.py:90 stock/forms.py:117
msgid "Serial numbers"
@@ -351,20 +353,20 @@ msgid "Enter serial numbers for build outputs"
msgstr "Seriennummer für dieses hergestelltes Teil eingeben"
#: build/forms.py:98
-msgid "Confirm creation of build outut"
+msgid "Confirm creation of build output"
msgstr "Anlage Baufertigstellung bestätigen"
#: build/forms.py:118
msgid "Confirm deletion of build output"
-msgstr "löschen der Baufertigstellung bestätigen"
+msgstr "Löschen des Endprodukt bestätigen"
#: build/forms.py:139
msgid "Confirm unallocation of stock"
-msgstr "Zuweisungsaufhebung bestätigen"
+msgstr "Aufhebung der BestandsZuordnung bestätigen"
#: build/forms.py:163
msgid "Confirm stock allocation"
-msgstr "Lagerbestandszuordnung bestätigen"
+msgstr "Bestandszuordnung bestätigen"
#: build/forms.py:186
msgid "Mark build as complete"
@@ -372,11 +374,11 @@ msgstr "Bau als vollständig markieren"
#: build/forms.py:210
msgid "Location of completed parts"
-msgstr "Standort der Fertigteile"
+msgstr "Lagerort der fertigen Teile"
#: build/forms.py:215
msgid "Confirm completion with incomplete stock allocation"
-msgstr "Fertigstellung mit nicht kompletter Lagerbestandszuordnung bestätigen"
+msgstr "Fertigstellung mit nicht kompletter Bestandszuordnung bestätigen"
#: build/forms.py:218
msgid "Confirm build completion"
@@ -388,12 +390,12 @@ msgstr "Bauabbruch bestätigen"
#: build/forms.py:252
msgid "Select quantity of stock to allocate"
-msgstr "Menge der Lagerobjekte für Zuordnung auswählen"
+msgstr "Menge der BestandsObjekt für Zuordnung auswählen"
#: build/models.py:65 build/templates/build/build_base.html:8
#: build/templates/build/build_base.html:35
#: part/templates/part/allocation.html:23
-#: report/templates/report/inventree_build_order_base.html:109
+#: report/templates/report/inventree_build_order_base.html:106
msgid "Build Order"
msgstr "Bauauftrag"
@@ -412,7 +414,9 @@ msgid "Build Order Reference"
msgstr "Bauauftragsreferenz"
#: build/models.py:127 order/templates/order/purchase_order_detail.html:188
-#: templates/js/bom.js:197 templates/js/build.js:509 templates/js/build.js:948
+#: report/templates/report/inventree_po_report.html:92
+#: report/templates/report/inventree_so_report.html:92 templates/js/bom.js:197
+#: templates/js/build.js:509 templates/js/build.js:948
msgid "Reference"
msgstr "Referenz"
@@ -422,8 +426,8 @@ msgstr "Referenz"
#: company/templates/company/supplier_part_detail.html:31 label/models.py:108
#: order/templates/order/purchase_order_detail.html:168 part/models.py:709
#: part/templates/part/detail.html:54 part/templates/part/set_category.html:14
-#: report/models.py:175
-#: report/templates/report/inventree_build_order_base.html:121
+#: report/models.py:192
+#: report/templates/report/inventree_build_order_base.html:118
#: templates/InvenTree/search.html:208
#: templates/InvenTree/settings/header.html:9 templates/js/bom.js:190
#: templates/js/build.js:677 templates/js/build.js:944
@@ -449,14 +453,16 @@ msgstr "Bauauftrag, zu dem dieser Bau zugwiesen ist"
#: build/models.py:152 build/templates/build/auto_allocate.html:16
#: build/templates/build/build_base.html:86
-#: build/templates/build/detail.html:26 order/models.py:652
+#: build/templates/build/detail.html:26 order/models.py:662
#: order/templates/order/order_wizard/select_parts.html:30
#: order/templates/order/purchase_order_detail.html:156
#: order/templates/order/receive_parts.html:19 part/models.py:320
#: part/templates/part/part_app_base.html:7 part/templates/part/related.html:29
#: part/templates/part/set_category.html:13
#: part/templates/part/subcategories.html:17
-#: report/templates/report/inventree_build_order_base.html:113
+#: report/templates/report/inventree_build_order_base.html:110
+#: report/templates/report/inventree_po_report.html:90
+#: report/templates/report/inventree_so_report.html:90
#: templates/InvenTree/search.html:111 templates/InvenTree/search.html:194
#: templates/js/barcode.js:362 templates/js/bom.js:163
#: templates/js/build.js:681 templates/js/build.js:921
@@ -472,23 +478,23 @@ msgstr "Teil für den Bau wählen"
#: build/models.py:165
msgid "Sales Order Reference"
-msgstr "VK-Auftrag Referenz"
+msgstr "Auftrag Referenz"
#: build/models.py:169
msgid "SalesOrder to which this build is allocated"
-msgstr "VK-Auftrag, die diesem Bau zugewiesen ist"
+msgstr "Bestellung, die diesem Bau zugewiesen ist"
#: build/models.py:174
msgid "Source Location"
-msgstr "Quell-Standort"
+msgstr "Quell-Lagerort"
#: build/models.py:178
msgid ""
"Select location to take stock from for this build (leave blank to take from "
"any stock location)"
msgstr ""
-"Lager-Entnahmestandort für diesen Bau wählen (oder leer lassen für einen "
-"beliebigen Lager-Standort)"
+"Entnahme-Lagerort für diesen Bau wählen (oder leer lassen für einen "
+"beliebigen Lagerort)"
#: build/models.py:183
msgid "Destination Location"
@@ -504,7 +510,7 @@ msgstr "Bau-Anzahl"
#: build/models.py:194
msgid "Number of stock items to build"
-msgstr "Anzahl der zu bauenden Lagerobjekte"
+msgstr "Anzahl der zu bauenden BestandsObjekt"
#: build/models.py:198
msgid "Completed items"
@@ -512,7 +518,7 @@ msgstr "Fertiggestellte Teile"
#: build/models.py:200
msgid "Number of stock items which have been completed"
-msgstr "Anzahl der fertigen Lagerobjekte"
+msgstr "Anzahl der fertigen BestandsObjekte"
#: build/models.py:204 part/templates/part/part_base.html:159
msgid "Build Status"
@@ -524,13 +530,13 @@ msgstr "Bau-Statuscode"
#: build/models.py:212 stock/models.py:429
msgid "Batch Code"
-msgstr "Losnummer/Chargennr"
+msgstr "Losnummer"
#: build/models.py:216
msgid "Batch code for this build output"
-msgstr "Chargennummer für diese Bau-Ausgabe"
+msgstr "Losnummer für dieses Endprodukt"
-#: build/models.py:223 order/models.py:437
+#: build/models.py:223 order/models.py:447
msgid "Target completion date"
msgstr "geplantes Fertigstellungsdatum"
@@ -540,7 +546,7 @@ msgstr "Nutzer der diesen Bauauftrag erstellt hat"
#: build/models.py:248
msgid "User responsible for this build order"
-msgstr "Nutzer der für diesen Bauauftrag zuständig hat"
+msgstr "Nutzer der für diesen Bauauftrag zuständig ist"
#: build/models.py:253 build/templates/build/detail.html:91
#: company/templates/company/supplier_part_base.html:77
@@ -563,7 +569,7 @@ msgstr "Link zu einer externen URL"
#: order/templates/order/so_navbar.html:33
#: order/templates/order/so_navbar.html:36 part/models.py:869
#: part/templates/part/navbar.html:122
-#: report/templates/report/inventree_build_order_base.html:176
+#: report/templates/report/inventree_build_order_base.html:173
#: stock/forms.py:316 stock/forms.py:348 stock/forms.py:376 stock/models.py:495
#: stock/models.py:1663 stock/templates/stock/navbar.html:57
#: templates/js/barcode.js:37 templates/js/bom.js:329 templates/js/stock.js:128
@@ -584,31 +590,27 @@ msgid "Build output is already completed"
msgstr "Endprodukt bereits hergstellt"
#: build/models.py:676
-#, fuzzy
-#| msgid "Quantity does not match serial numbers"
msgid "Build output does not match Build Order"
-msgstr "Anzahl stimmt nicht mit den Seriennummern überein"
+msgstr "Endprodukt stimmt nicht mit dem Bauauftrag überein"
#: build/models.py:751
-#, fuzzy
-#| msgid "Complete Build"
msgid "Completed build output"
-msgstr "Bau fertigstellen"
+msgstr "Endprodukt fertigstellen"
#: build/models.py:993
msgid "BuildItem must be unique for build, stock_item and install_into"
msgstr ""
+"Bauauftrags-Objekt muss für Bauauftrag, Lager-Objekt und installiert_in "
+"eindeutig sein"
#: build/models.py:1015
-#, fuzzy
-#| msgid "Allocate Stock to Build"
msgid "Build item must specify a build output"
-msgstr "Lagerbestand dem Bau zuweisen"
+msgstr "Bauauftrags-Objekt muss einem Endprodukt zugewiesen sein"
#: build/models.py:1020
#, 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"
+msgstr "Ausgewähltes BestandsObjekt nicht Stückliste für Teil '{p}' gefunden"
#: build/models.py:1024
#, python-brace-format
@@ -617,11 +619,11 @@ msgstr ""
"Reserviermenge ({n}) muss kleiner Bestandsmenge ({q}) sein. Zugewiesene "
"Anzahl ({n}) darf nicht die verfügbare ({q}) Anzahl überschreiten"
-#: build/models.py:1031 order/models.py:736
+#: build/models.py:1031 order/models.py:746
msgid "StockItem is over-allocated"
-msgstr "Zu viele Lagerobjekte zugewiesen"
+msgstr "Zu viele BestandsObjekt zugewiesen"
-#: build/models.py:1035 order/models.py:739
+#: build/models.py:1035 order/models.py:749
msgid "Allocation quantity must be greater than zero"
msgstr "Reserviermenge muss größer null sein"
@@ -634,50 +636,36 @@ msgid "Build to allocate parts"
msgstr "Bau starten um Teile zuzuweisen"
#: build/models.py:1086
-#, fuzzy
-#| msgid "Remove stock"
msgid "Source stock item"
-msgstr "Bestand entfernen"
+msgstr "Quell-BestandsObjekt"
#: build/models.py:1098
msgid "Stock quantity to allocate to build"
-msgstr "Lagerobjekt-Anzahl dem Bau zuweisen"
+msgstr "BestandsObjekt-Anzahl dem Bau zuweisen"
#: build/models.py:1106
-#, fuzzy
-#| msgid "Destination stock location"
msgid "Destination stock item"
-msgstr "Ziel-Lagerbestand"
+msgstr "Ziel-BestandsObjekt"
#: build/templates/build/allocate.html:15
-#, fuzzy
-#| msgid "Complete Build"
msgid "Incomplete Build Ouputs"
-msgstr "Bau fertigstellen"
+msgstr "unfertige Endpordukte"
#: build/templates/build/allocate.html:21
-#, fuzzy
-#| msgid "Build order allocation is complete"
msgid "Build order has been completed"
-msgstr "Bau-Zuweisung ist vollständig"
+msgstr "Bauauftrag ist vollständig"
#: build/templates/build/allocate.html:26
-#, fuzzy
-#| msgid "Created new build"
msgid "Create new build output"
-msgstr "Neuen Bau angelegt"
+msgstr "Neues Endprodukt anlegen"
#: build/templates/build/allocate.html:27
-#, fuzzy
-#| msgid "Create New Part"
msgid "Create New Output"
-msgstr "Neues Teil anlegen"
+msgstr "Neues Endprodukt anlegen"
#: build/templates/build/allocate.html:30
-#, fuzzy
-#| msgid "Order part"
msgid "Order required parts"
-msgstr "Teil bestellen"
+msgstr "benötigte Teile bestellen"
#: build/templates/build/allocate.html:31
#: company/templates/company/detail_part.html:31 order/views.py:791
@@ -686,27 +674,24 @@ msgid "Order Parts"
msgstr "Teile bestellen"
#: build/templates/build/allocate.html:34 templates/js/build.js:590
-#, fuzzy
msgid "Unallocate stock"
-msgstr "Zuweisung aufheben"
+msgstr "Bestandszuordnung aufheben"
#: build/templates/build/allocate.html:35 build/views.py:338 build/views.py:784
msgid "Unallocate Stock"
-msgstr "Resrvierung aufheben"
+msgstr "Bestandszuordnung aufheben"
#: build/templates/build/allocate.html:49
-#, fuzzy
-#| msgid "Created new build"
msgid "Create a new build output"
-msgstr "Neuen Bau angelegt"
+msgstr "Neues Endprodukt anlegen"
#: build/templates/build/allocate.html:50
msgid "No incomplete build outputs remain."
-msgstr "Keine unfertigen Bauobjekte verbleiben."
+msgstr "Keine unfertigen Endprodukte verbleiben."
#: build/templates/build/allocate.html:51
msgid "Create a new build output using the button above"
-msgstr ""
+msgstr "Neues Endprodukt mit der Schaltfläche obehalb anlegen"
#: build/templates/build/attachments.html:12
#: build/templates/build/navbar.html:49 build/templates/build/navbar.html:52
@@ -722,11 +707,10 @@ msgid "Automatically Allocate Stock"
msgstr "Lagerbestand automatisch zuweisen"
#: build/templates/build/auto_allocate.html:10
-#, fuzzy
-#| msgid "Stock Item to allocate to build"
msgid ""
"The following stock items will be allocated to the specified build output"
-msgstr "Lagerobjekt dem Bau zuweisen"
+msgstr ""
+"Die folgenden BestandsObjekte werden den ausgewählten Endprodukten zugeordnet"
#: build/templates/build/auto_allocate.html:18 stock/forms.py:346
#: stock/templates/stock/item_base.html:264
@@ -735,30 +719,28 @@ msgstr "Lagerobjekt dem Bau zuweisen"
#: templates/js/barcode.js:531 templates/js/build.js:434
#: templates/js/stock.js:637
msgid "Location"
-msgstr "Standort"
+msgstr "Lagerort"
#: build/templates/build/auto_allocate.html:37
-#, fuzzy
-#| msgid "No stock items found that can be allocated to this build"
msgid "No stock items found that can be automatically allocated to this build"
-msgstr "Keine Lagerobjekt gefunden, die diesem Bau zugewiesen werden können"
+msgstr ""
+"Keine BestandsObjekt gefunden, die diesem Endprodukt automatisch zugewiesen "
+"werden können"
#: build/templates/build/auto_allocate.html:39
msgid "Stock items will have to be manually allocated"
-msgstr "Lagerobjekt werden manuell zugewiesen"
+msgstr "BestandsObjekte werden manuell zugewiesen werden müssen"
#: build/templates/build/build_base.html:14
msgid "This Build Order is allocated to Sales Order"
-msgstr "Dieser Bau ist dem Verkaufsauftrag zugeordnet"
+msgstr "Dieser Bauauftrag ist einem Auftrag zugeordnet"
#: build/templates/build/build_base.html:19
-#, fuzzy
-#| msgid "This build is a child of Build"
msgid "This Build Order is a child of Build Order"
-msgstr "Dieser Bau ist Kind von Bau"
+msgstr "Dieser Bauauftrag ist einem Bauauftrag untergeordnet"
#: build/templates/build/build_base.html:37
-#: company/templates/company/company_base.html:27
+#: company/templates/company/company_base.html:40
#: company/templates/company/supplier_part_base.html:25
#: order/templates/order/order_base.html:26
#: order/templates/order/sales_order_base.html:35
@@ -771,11 +753,11 @@ msgstr "Admin"
#: build/templates/build/build_base.html:43
#: build/templates/build/build_base.html:108
#: order/templates/order/order_base.html:32
-#: order/templates/order/order_base.html:83
+#: order/templates/order/order_base.html:86
#: order/templates/order/sales_order_base.html:41
-#: order/templates/order/sales_order_base.html:83
-#: templates/js/table_filters.js:213 templates/js/table_filters.js:232
-#: templates/js/table_filters.js:249
+#: order/templates/order/sales_order_base.html:86
+#: templates/js/table_filters.js:218 templates/js/table_filters.js:237
+#: templates/js/table_filters.js:254
msgid "Overdue"
msgstr "Überfällig"
@@ -788,10 +770,8 @@ msgid "Print Build Order"
msgstr "Bauauftrag drucken"
#: build/templates/build/build_base.html:62
-#, fuzzy
-#| msgid "Build parts"
msgid "Build actions"
-msgstr "Bauteile"
+msgstr "Bau-Auftrag Aktionen"
#: build/templates/build/build_base.html:66
msgid "Edit Build"
@@ -822,9 +802,9 @@ msgstr "Status"
#: build/templates/build/build_base.html:104
#: build/templates/build/detail.html:121
-#: order/templates/order/order_base.html:121
-#: order/templates/order/sales_order_base.html:114
-#: report/templates/report/inventree_build_order_base.html:129
+#: order/templates/order/order_base.html:124
+#: order/templates/order/sales_order_base.html:117
+#: report/templates/report/inventree_build_order_base.html:126
#: templates/js/build.js:723 templates/js/order.js:200
#: templates/js/order.js:298
msgid "Target Date"
@@ -840,25 +820,28 @@ msgid "Progress"
msgstr "Fortschritt"
#: build/templates/build/build_base.html:128
-#: build/templates/build/detail.html:84 order/models.py:650
+#: build/templates/build/detail.html:84 order/models.py:660
#: order/templates/order/sales_order_base.html:9
#: order/templates/order/sales_order_base.html:33
#: order/templates/order/sales_order_ship.html:25
#: part/templates/part/allocation.html:30
-#: report/templates/report/inventree_build_order_base.html:139
+#: report/templates/report/inventree_build_order_base.html:136
+#: report/templates/report/inventree_so_report.html:77
#: stock/templates/stock/item_base.html:258 templates/js/order.js:245
msgid "Sales Order"
-msgstr "Verkaufsauftrag"
+msgstr "Auftrag"
#: build/templates/build/build_base.html:135
#: build/templates/build/detail.html:98
-#: report/templates/report/inventree_build_order_base.html:156
+#: report/templates/report/inventree_build_order_base.html:153
msgid "Issued By"
-msgstr "Aufgegebenvon"
+msgstr "Aufgegeben von"
#: build/templates/build/build_base.html:142
-#: build/templates/build/detail.html:105
-#: report/templates/report/inventree_build_order_base.html:162
+#: build/templates/build/detail.html:105 order/models.py:118
+#: order/templates/order/order_base.html:138
+#: order/templates/order/sales_order_base.html:138
+#: report/templates/report/inventree_build_order_base.html:159
msgid "Responsible"
msgstr "Verantwortlicher Benutzer"
@@ -870,112 +853,86 @@ msgstr "Unter-Bauaufträge"
#: build/templates/build/build_output.html:10
#: build/templates/build/navbar.html:35 build/templates/build/navbar.html:38
msgid "Build Outputs"
-msgstr "Bau-Ausgabe"
+msgstr "Endprodukte"
#: build/templates/build/build_output_create.html:7
msgid "The Bill of Materials contains trackable parts"
-msgstr ""
+msgstr "Die Stückliste enthält verfolgbare Teile"
#: build/templates/build/build_output_create.html:8
msgid "Build outputs must be generated individually."
-msgstr ""
+msgstr "Endprodukte müssen individuell angelegt werden."
#: build/templates/build/build_output_create.html:9
msgid "Multiple build outputs will be created based on the quantity specified."
msgstr ""
+"Mehrere Endprodukte werden anhand der gegebenen Anzahl angelegt werden."
#: build/templates/build/build_output_create.html:15
msgid "Trackable parts can have serial numbers specified"
msgstr "Nachverfolgbare Teile können Seriennummern haben"
#: build/templates/build/build_output_create.html:16
-#, fuzzy
-#| msgid "Serial number for this item"
msgid "Enter serial numbers to generate multiple single build outputs"
-msgstr "Seriennummer für dieses Teil"
+msgstr "Seriennummeren für mehrere einlene Endprodukte angeben"
#: build/templates/build/cancel.html:5
-#, fuzzy
-#| msgid "Are you sure you wish to unallocate all stock for this build?"
msgid "Are you sure you wish to cancel this build?"
-msgstr ""
-"Sind Sie sicher, dass sie alle Lagerobjekte von diesem Bau entfernen möchten?"
+msgstr "Sind Sie sicher, dass sie diesen Bauauftrag abbrechen möchten?"
#: build/templates/build/complete.html:8
-#, fuzzy
-#| msgid "Build order allocation is complete"
msgid "Build can be completed"
-msgstr "Bau-Zuweisung ist vollständig"
+msgstr "Bauauftrag kann fertiggstellt werden"
#: build/templates/build/complete.html:12
-#, fuzzy
-#| msgid "Build order allocation is complete"
msgid "Build cannot be completed"
-msgstr "Bau-Zuweisung ist vollständig"
+msgstr "Bauauftrag kann nicht fertiggestellt werden"
#: build/templates/build/complete.html:15
-#, fuzzy
-#| msgid "Complete Build"
msgid "Incompleted build outputs remain"
-msgstr "Bau fertigstellen"
+msgstr "unfertige Endprodukte vorhanden"
#: build/templates/build/complete.html:18
-#, fuzzy
-#| msgid "Build order allocation is complete"
msgid "Required build quantity has not been completed"
-msgstr "Bau-Zuweisung ist vollständig"
+msgstr "Benötigte Teil-Anzahl wurde noch nicht fertiggestellt"
#: build/templates/build/complete_output.html:9
-#, fuzzy
-#| msgid "Build order allocation is complete"
msgid "Stock allocation is complete"
-msgstr "Bau-Zuweisung ist vollständig"
+msgstr "Bestandszuordnung ist vollständig"
#: build/templates/build/complete_output.html:13
-#, fuzzy
-#| msgid "Build order allocation is complete"
msgid "Stock allocation is incomplete"
-msgstr "Bau-Zuweisung ist vollständig"
+msgstr "Bestandszuordnung ist nicht vollständig"
#: build/templates/build/complete_output.html:19
-#, fuzzy
-#| msgid "This SalesOrder has not been fully allocated"
msgid "parts have not been fully allocated"
-msgstr "Dieser Auftrag ist nicht vollständig zugeordnet"
+msgstr "Teile wurden noch nicht vollständig zugeordnet"
#: build/templates/build/complete_output.html:40
msgid "The following items will be created"
msgstr "Die folgenden Objekte werden erstellt"
#: build/templates/build/create_build_item.html:7
-#, fuzzy
-#| msgid "Stock Item to allocate to build"
msgid "Select a stock item to allocate to the selected build output"
-msgstr "Lagerobjekt dem Bau zuweisen"
+msgstr "BestandsObjekt zur Zuordnung zum ausgewählten Endprodukt auswählen"
#: build/templates/build/create_build_item.html:11
-#, fuzzy
-#| msgid "The following stock items will be allocated to the build:"
msgid "The allocated stock will be installed into the following build output:"
-msgstr "Folgende Lagerobjekte werden dem Bau automatisch zugewiesen:"
+msgstr ""
+"Der zugeordnete Bestand wird in den folgenden Endprodukten verbaut werden:"
#: build/templates/build/create_build_item.html:19
-#, fuzzy
-#| msgid "Stock available"
msgid "No stock available for"
-msgstr "Bestand verfügbar"
+msgstr "Kein Bestand verfügbar für"
#: build/templates/build/delete_build_item.html:8
-#, fuzzy
-#| msgid "Are you sure you want to unallocate these parts?"
msgid "Are you sure you want to unallocate this stock?"
-msgstr "Sind Sie sicher, dass sie die folgenden Teile entfernen möchten?"
+msgstr ""
+"Sind Sie sicher, dass sie die folgenden Bestands-Zuordnung entfernen möchten?"
#: build/templates/build/delete_build_item.html:11
-#, fuzzy
-#| msgid "The following stock items will be allocated to the build:"
msgid "The selected stock will be unallocated from the build output"
-msgstr "Folgende Lagerobjekte werden dem Bau automatisch zugewiesen:"
+msgstr "Der ausgeählte Bestand wird von den Endprodukten zurückgenommen werden"
#: build/templates/build/detail.html:35
msgid "Stock Source"
@@ -990,29 +947,25 @@ msgid "Destination"
msgstr "Ziel"
#: build/templates/build/detail.html:53
-#, fuzzy
-#| msgid "Does this part have tracking for unique items?"
msgid "Destination location not specified"
-msgstr "Hat dieses Teil Tracking für einzelne Objekte?"
+msgstr "Ziel-Lagerort nicht angegeben"
#: build/templates/build/detail.html:70
#: stock/templates/stock/item_base.html:282 templates/js/stock.js:632
#: templates/js/stock.js:1205 templates/js/table_filters.js:85
-#: templates/js/table_filters.js:174
+#: templates/js/table_filters.js:179
msgid "Batch"
msgstr "Los"
#: build/templates/build/detail.html:116
-#: order/templates/order/order_base.html:108
-#: order/templates/order/sales_order_base.html:108 templates/js/build.js:718
+#: order/templates/order/order_base.html:111
+#: order/templates/order/sales_order_base.html:111 templates/js/build.js:718
msgid "Created"
msgstr "Erstellt"
#: build/templates/build/detail.html:127
-#, fuzzy
-#| msgid "No destination set"
msgid "No target date set"
-msgstr "Kein Ziel gesetzt"
+msgstr "Kein Ziel-Datum gesetzt"
#: build/templates/build/detail.html:132 templates/js/build.js:696
#: templates/js/build.js:728
@@ -1020,16 +973,12 @@ msgid "Completed"
msgstr "Fertig"
#: build/templates/build/detail.html:136
-#, fuzzy
-#| msgid "Build order allocation is complete"
msgid "Build not complete"
-msgstr "Bau-Zuweisung ist vollständig"
+msgstr "Bauauftrag ist nicht vollständig"
#: build/templates/build/edit_build_item.html:7
-#, fuzzy
-#| msgid "Stock quantity to allocate to build"
msgid "Alter the quantity of stock allocated to the build output"
-msgstr "Lagerobjekt-Anzahl dem Bau zuweisen"
+msgstr "Anzahl des zugeordneten Bestands für die Endprodukte ändern"
#: build/templates/build/index.html:28 build/views.py:657
msgid "New Build Order"
@@ -1037,17 +986,17 @@ msgstr "Neuer Bauauftrag"
#: build/templates/build/index.html:37 build/templates/build/index.html:38
msgid "Print Build Orders"
-msgstr "Bauauftrag ausdrucken"
+msgstr "Bauaufträge ausdrucken"
#: build/templates/build/index.html:43
-#: order/templates/order/purchase_orders.html:22
-#: order/templates/order/sales_orders.html:22
+#: order/templates/order/purchase_orders.html:27
+#: order/templates/order/sales_orders.html:27
msgid "Display calendar view"
msgstr "Kalendar Ansicht"
#: build/templates/build/index.html:46
-#: order/templates/order/purchase_orders.html:25
-#: order/templates/order/sales_orders.html:25
+#: order/templates/order/purchase_orders.html:30
+#: order/templates/order/sales_orders.html:30
msgid "Display list view"
msgstr "Listen Ansicht"
@@ -1064,20 +1013,16 @@ msgstr "Details"
#: build/templates/build/navbar.html:20 build/templates/build/navbar.html:23
#: build/templates/build/parts.html:11
-#, fuzzy
-#| msgid "Required"
msgid "Required Parts"
-msgstr "benötigt"
+msgstr "benötigte Teile"
#: build/templates/build/navbar.html:27 build/templates/build/navbar.html:30
msgid "In Progress"
msgstr "In Bearbeitung"
#: build/templates/build/navbar.html:45
-#, fuzzy
-#| msgid "Cancel Build"
msgid "Child Builds"
-msgstr "Bau abbrechen"
+msgstr "Unter-Endprodukte"
#: build/templates/build/navbar.html:56
msgid "Build Order Notes"
@@ -1104,13 +1049,13 @@ msgstr "Bermerkungen bearbeiten"
#: build/templates/build/unallocate.html:10
msgid "Are you sure you wish to unallocate all stock for this build?"
msgstr ""
-"Sind Sie sicher, dass sie alle Lagerobjekte von diesem Bau entfernen möchten?"
+"Sind Sie sicher, dass sie alle BestandsObjekt von diesem Bau entfernen "
+"möchten?"
#: build/templates/build/unallocate.html:12
-#, fuzzy
-#| msgid "The following stock items will be allocated to the build:"
msgid "All incomplete stock allocations will be removed from the build"
-msgstr "Folgende Lagerobjekte werden dem Bau automatisch zugewiesen:"
+msgstr ""
+"Alle unvollständigen Bestandszuordnungen werden vom Endprodukt entfernt"
#: build/views.py:77
msgid "Build was cancelled"
@@ -1121,144 +1066,106 @@ msgid "Allocate Stock"
msgstr "Lagerbestand zuweisen"
#: build/views.py:154 build/views.py:314 build/views.py:485
-#, fuzzy
-#| msgid "No action specified"
msgid "Build output must be specified"
-msgstr "Keine Aktion angegeben"
+msgstr "Endprodukt muss angegeben sein"
#: build/views.py:168
-#, fuzzy
-#| msgid "Allocate Stock to Build"
msgid "Allocated stock to build output"
-msgstr "Lagerbestand dem Bau zuweisen"
+msgstr "Bestand dem Endprodukt zuweisen"
#: build/views.py:180
-#, fuzzy
-#| msgid "Build Outputs"
msgid "Create Build Output"
-msgstr "Bau-Ausgabe"
+msgstr "Endprodukt anlegen"
#: build/views.py:203 stock/models.py:964 stock/views.py:1788
-#, fuzzy
-#| msgid "Serial numbers already exist: "
msgid "Serial numbers already exist"
-msgstr "Seriennummern existieren bereits:"
+msgstr "Seriennummern existieren bereits"
#: build/views.py:212
-#, fuzzy
-#| msgid "Serial number for this item"
msgid "Serial numbers required for trackable build output"
-msgstr "Seriennummer für dieses Teil"
+msgstr "Seriennummern für verfolgbare Endprodukte benötigt"
#: build/views.py:278
-#, fuzzy
-#| msgid "Delete Build"
msgid "Delete Build Output"
-msgstr "Bau entfernt"
+msgstr "Endprodukt entfernen"
#: build/views.py:299 build/views.py:383
msgid "Confirm unallocation of build stock"
-msgstr "Zuweisungsaufhebung bestätigen"
+msgstr "Entfernung von Bestands-Zuordnung bestätigen"
#: build/views.py:300 build/views.py:384 stock/views.py:425
msgid "Check the confirmation box"
msgstr "Bestätigungsbox bestätigen"
#: build/views.py:312
-#, fuzzy
-#| msgid "Quantity does not match serial numbers"
msgid "Build output does not match build"
-msgstr "Anzahl stimmt nicht mit den Seriennummern überein"
+msgstr "Endprodukt stimmt nicht mit Bauauftrag überein"
#: build/views.py:326
-#, fuzzy
-#| msgid "No action specified"
msgid "Build output deleted"
-msgstr "Keine Aktion angegeben"
+msgstr "Endprodukt gelöscht"
#: build/views.py:408
-#, fuzzy
-#| msgid "Complete Build"
msgid "Complete Build Order"
-msgstr "Bau fertigstellen"
+msgstr "Bauauftrag fertigstellen"
#: build/views.py:414
-#, fuzzy
-#| msgid "Build order allocation is complete"
msgid "Build order cannot be completed"
-msgstr "Bau-Zuweisung ist vollständig"
+msgstr "Bauauftrag kann nicht fertiggestellt werden"
#: build/views.py:425
-#, fuzzy
-#| msgid "Complete Build"
msgid "Completed build order"
-msgstr "Bau fertigstellen"
+msgstr "Bauauftrag fertiggestellt"
#: build/views.py:441
-#, fuzzy
-#| msgid "Complete Build"
msgid "Complete Build Output"
-msgstr "Bau fertigstellen"
+msgstr "Endprodukt fertigstellen"
#: build/views.py:476
-#, fuzzy
-#| msgid "Quantity must not exceed available stock quantity ({n})"
msgid "Quantity to complete cannot exceed build output quantity"
-msgstr "Anzahl darf nicht die verfügbare Anzahl überschreiten ({n})"
+msgstr ""
+"Fertigzustellende Anzahl darf nicht die geplante Endprodukt-Anzahl "
+"überschreiten"
#: build/views.py:482
-#, fuzzy
-#| msgid "Confirm completion of build"
msgid "Confirm completion of incomplete build"
-msgstr "Baufertigstellung bestätigen"
+msgstr "Endprodukt-Fertigstellung bestätigen"
#: build/views.py:573
-#, fuzzy
-#| msgid "Build order allocation is complete"
msgid "Build output completed"
-msgstr "Bau-Zuweisung ist vollständig"
+msgstr "Endprodukt fertiggestellt"
#: build/views.py:711
msgid "Created new build"
msgstr "Neuen Bau angelegt"
#: build/views.py:732
-#, fuzzy
-#| msgid "Edit Build Details"
msgid "Edit Build Order Details"
-msgstr "Baudetails bearbeiten"
+msgstr "Bauauftragdetails bearbeiten"
#: build/views.py:765
msgid "Edited build"
msgstr "Bau bearbeitet"
#: build/views.py:774
-#, fuzzy
-#| msgid "Complete Build"
msgid "Delete Build Order"
-msgstr "Bau fertigstellen"
+msgstr "Bauauftrag löschen"
#: build/views.py:789
msgid "Removed parts from build allocation"
msgstr "Teile von Bauzuordnung entfernt"
#: build/views.py:801
-#, fuzzy
-#| msgid "Allocate Stock to Build"
msgid "Allocate stock to build output"
-msgstr "Lagerbestand dem Bau zuweisen"
+msgstr "Bestand dem Endprodukt zuweisen"
#: build/views.py:844
-#, fuzzy
-#| msgid "This stock item is allocated to Build"
msgid "Item must be currently in stock"
-msgstr "Dieses Lagerobjekt ist dem Bau zugewiesen"
+msgstr "Teil muss aktuell im Bestand sein"
#: build/views.py:850
-#, fuzzy
-#| msgid "StockItem is over-allocated"
msgid "Stock item is over-allocated"
-msgstr "Zu viele Lagerobjekte zugewiesen"
+msgstr "BestandObjekt ist zu oft zugewiesen"
#: build/views.py:851 templates/js/bom.js:230 templates/js/build.js:519
#: templates/js/build.js:778 templates/js/build.js:961
@@ -1266,14 +1173,12 @@ msgid "Available"
msgstr "verfügbar"
#: build/views.py:853
-#, fuzzy
-#| msgid "StockItem has been allocated"
msgid "Stock item must be selected"
-msgstr "Lagerobjekt wurde zugewiesen"
+msgstr "BestandsObjekt muss ausgewählt sein"
#: build/views.py:1016
msgid "Edit Stock Allocation"
-msgstr "Lagerzuordnung bearbeiten"
+msgstr "Bestandszuordnung bearbeiten"
#: build/views.py:1020
msgid "Updated Build Item"
@@ -1281,9 +1186,9 @@ msgstr "Bauobjekt aktualisiert"
#: build/views.py:1049
msgid "Add Build Order Attachment"
-msgstr "Bauauftragsanhang hinzufügen"
+msgstr "Bauauftrags-Anhang hinzufügen"
-#: build/views.py:1062 order/views.py:107 order/views.py:159 part/views.py:167
+#: build/views.py:1062 order/views.py:107 order/views.py:159 part/views.py:172
#: stock/views.py:277
msgid "Added attachment"
msgstr "Anhang hinzugefügt"
@@ -1322,11 +1227,11 @@ msgstr "interner Firmenname"
#: common/models.py:68
msgid "Base URL"
-msgstr ""
+msgstr "Basis-URL"
#: common/models.py:69
msgid "Base URL for server instance"
-msgstr "Basis-Url für dieses Instanz"
+msgstr "Basis-URL für dieses Instanz"
#: common/models.py:75
msgid "Default Currency"
@@ -1337,356 +1242,320 @@ msgid "Default currency"
msgstr "Standard-Währung"
#: common/models.py:82
+msgid "Download from URL"
+msgstr "Von URL herunterladen"
+
+#: common/models.py:83
+msgid "Allow download of remote images and files from external URL"
+msgstr "Herunterladen von externen Bildern und Dateien von URLs erlaubt"
+
+#: common/models.py:89
msgid "Barcode Support"
msgstr "Bacode-Feature verwenden"
-#: common/models.py:83
-msgid "Enable barcode scanner support"
-msgstr "Barcode Scanner Unterstützung"
-
-#: common/models.py:89
-msgid "IPN Regex"
-msgstr ""
-
#: common/models.py:90
+msgid "Enable barcode scanner support"
+msgstr "Barcode-Scanner Unterstützung"
+
+#: common/models.py:96
+msgid "IPN Regex"
+msgstr "IPN Regex"
+
+#: common/models.py:97
msgid "Regular expression pattern for matching Part IPN"
-msgstr ""
+msgstr "RegEx Muster für die Zuordnung von Teil-IPN"
-#: common/models.py:94
+#: common/models.py:101
msgid "Allow Duplicate IPN"
-msgstr "Mehrere Artikel mit gleicher IPN"
+msgstr "Mehrere Artikel mit gleicher IPN erlaubt"
-#: common/models.py:95
+#: common/models.py:102
msgid "Allow multiple parts to share the same IPN"
msgstr "Mehrere Artikel mit gleicher IPN erlaubt"
-#: common/models.py:101
-#, fuzzy
-#| msgid "Import BOM data"
-msgid "Copy Part BOM Data"
-msgstr "Stückliste importieren"
-
-#: common/models.py:102
-msgid "Copy BOM data by default when duplicating a part"
-msgstr ""
-
#: common/models.py:108
-#, fuzzy
-#| msgid "Parameters"
-msgid "Copy Part Parameter Data"
-msgstr "Parameter"
+msgid "Allow Editing IPN"
+msgstr "Ändern von IPN erlaubt"
#: common/models.py:109
-msgid "Copy parameter data by default when duplicating a part"
-msgstr ""
+msgid "Allow changing the IPN value while editing a part"
+msgstr "Ändern der IPN während des Bearbeiten eines Teils erlaubt"
#: common/models.py:115
-#, fuzzy
-#| msgid "Parameters"
-msgid "Copy Part Test Data"
-msgstr "Parameter"
+msgid "Copy Part BOM Data"
+msgstr "Teil-Stückliste kopieren"
#: common/models.py:116
-msgid "Copy test data by default when duplicating a part"
-msgstr ""
+msgid "Copy BOM data by default when duplicating a part"
+msgstr "Stückliste beim Duplizieren von Teil kopieren"
#: common/models.py:122
-#, fuzzy
-#| msgid "Edit Part Parameter Template"
-msgid "Copy Category Parameter Templates"
-msgstr "Teilparametervorlage bearbeiten"
+msgid "Copy Part Parameter Data"
+msgstr "Teil-Parameter kopieren"
#: common/models.py:123
-msgid "Copy category parameter templates when creating a part"
-msgstr ""
+msgid "Copy parameter data by default when duplicating a part"
+msgstr "Parameter-Daten für dieses Teil kopieren wenn das Teil dupliziert wird"
#: common/models.py:129
-#, fuzzy
-#| msgid "Receive Parts"
-msgid "Recent Part Count"
-msgstr "Teile empfangen"
+msgid "Copy Part Test Data"
+msgstr "Teil-Testdaten kopieren"
#: common/models.py:130
-msgid "Number of recent parts to display on index page"
-msgstr ""
+msgid "Copy test data by default when duplicating a part"
+msgstr "Test-Daten für dieses Teil kopieren wenn das Teil dupliziert wird"
-#: common/models.py:136 part/templates/part/detail.html:160
-#: report/models.py:168 stock/forms.py:258 templates/js/table_filters.js:24
-#: templates/js/table_filters.js:283
+#: common/models.py:136
+msgid "Copy Category Parameter Templates"
+msgstr "Kategorie-Parametervorlage kopieren"
+
+#: common/models.py:137
+msgid "Copy category parameter templates when creating a part"
+msgstr "Kategorie-Parameter Vorlagen kopieren wenn ein Teil angelegt wird"
+
+#: common/models.py:143
+msgid "Recent Part Count"
+msgstr "Aktuelle Teile-Stände"
+
+#: common/models.py:144
+msgid "Number of recent parts to display on index page"
+msgstr "Anzahl der neusten Teile auf der Startseite"
+
+#: common/models.py:150 part/templates/part/detail.html:160
+#: report/models.py:185 stock/forms.py:258 templates/js/table_filters.js:24
+#: templates/js/table_filters.js:288
msgid "Template"
msgstr "Vorlage"
-#: common/models.py:137
-#, fuzzy
-#| msgid "Part is not a virtual part"
+#: common/models.py:151
msgid "Parts are templates by default"
-msgstr "Teil ist nicht virtuell"
+msgstr "Teile sind standardmäßig Vorlagen"
-#: common/models.py:143 part/models.py:832 part/templates/part/detail.html:170
-#: templates/js/table_filters.js:295
+#: common/models.py:157 part/models.py:832 part/templates/part/detail.html:170
+#: templates/js/table_filters.js:101 templates/js/table_filters.js:300
msgid "Assembly"
msgstr "Baugruppe"
-#: common/models.py:144
-#, fuzzy
-#| msgid "Part can be assembled from other parts"
+#: common/models.py:158
msgid "Parts can be assembled from other components by default"
-msgstr "Teil kann aus anderen Teilen angefertigt werden"
+msgstr "Teile können standardmäßig aus anderen Teilen angefertigt werden"
-#: common/models.py:150 part/models.py:838 part/templates/part/detail.html:180
-#: templates/js/table_filters.js:299
+#: common/models.py:164 part/models.py:838 part/templates/part/detail.html:180
+#: templates/js/table_filters.js:304
msgid "Component"
msgstr "Komponente"
-#: common/models.py:151
-#, fuzzy
-#| msgid "Part can be used in assemblies"
+#: common/models.py:165
msgid "Parts can be used as sub-components by default"
-msgstr "Teil kann in Baugruppen benutzt werden"
+msgstr "Teile können standardmäßig in Baugruppen benutzt werden"
-#: common/models.py:157 part/models.py:849 part/templates/part/detail.html:200
+#: common/models.py:171 part/models.py:849 part/templates/part/detail.html:200
msgid "Purchaseable"
msgstr "Kaufbar"
-#: common/models.py:158
+#: common/models.py:172
msgid "Parts are purchaseable by default"
msgstr "Artikel kaufbar als Standard"
-#: common/models.py:164 part/models.py:854 part/templates/part/detail.html:210
-#: templates/js/table_filters.js:307
+#: common/models.py:178 part/models.py:854 part/templates/part/detail.html:210
+#: templates/js/table_filters.js:312
msgid "Salable"
msgstr "Verkäuflich"
-#: common/models.py:165
+#: common/models.py:179
msgid "Parts are salable by default"
msgstr "Artikel verkaufbar als Standard"
-#: common/models.py:171 part/models.py:844 part/templates/part/detail.html:190
-#: templates/js/table_filters.js:32 templates/js/table_filters.js:311
+#: common/models.py:185 part/models.py:844 part/templates/part/detail.html:190
+#: templates/js/table_filters.js:32 templates/js/table_filters.js:316
msgid "Trackable"
msgstr "nachverfolgbar"
-#: common/models.py:172
+#: common/models.py:186
msgid "Parts are trackable by default"
msgstr "Artikel verfolgbar als Standard"
-#: common/models.py:178 part/models.py:864 part/templates/part/detail.html:150
+#: common/models.py:192 part/models.py:864 part/templates/part/detail.html:150
#: templates/js/table_filters.js:28
msgid "Virtual"
msgstr "Virtuell"
-#: common/models.py:179
+#: common/models.py:193
msgid "Parts are virtual by default"
msgstr "Teile sind grundsätzlich virtuell"
-#: common/models.py:185
+#: common/models.py:199
msgid "Show Quantity in Forms"
msgstr "zeige Bestand in Eingabemasken"
-#: common/models.py:186
+#: common/models.py:200
msgid "Display available part quantity in some forms"
msgstr "zeige den verfügbaren Bestand in einigen Eingabemasken"
-#: common/models.py:192
+#: common/models.py:206
msgid "Debug Mode"
-msgstr ""
+msgstr "Entwickler-Modus"
-#: common/models.py:193
+#: common/models.py:207
msgid "Generate reports in debug mode (HTML output)"
-msgstr ""
+msgstr "Bercihte ich Entwickler-Modus generieren (als HTML)"
-#: common/models.py:199
+#: common/models.py:213
msgid "Page Size"
msgstr "Seitengröße"
-#: common/models.py:200
+#: common/models.py:214
msgid "Default page size for PDF reports"
msgstr "Standardseitenformat für PDF Report"
-#: common/models.py:210
-#, fuzzy
-#| msgid "Edit notes"
-msgid "Test Reports"
-msgstr "Bermerkungen bearbeiten"
-
-#: common/models.py:211
-#, fuzzy
-#| msgid "Parameter Template"
-msgid "Enable generation of test reports"
-msgstr "Parameter Vorlage"
-
-#: common/models.py:217
-#, fuzzy
-#| msgid "Stock Export Options"
-msgid "Stock Expiry"
-msgstr "Lagerbestandsexportoptionen"
-
-#: common/models.py:218
-msgid "Enable stock expiry functionality"
-msgstr "Lager Ablaufdatum ermöglichen"
-
#: common/models.py:224
-#, fuzzy
-#| msgid "Serialize Stock"
-msgid "Sell Expired Stock"
-msgstr "Lagerbestand erfassen"
+msgid "Test Reports"
+msgstr "Test-Berichte"
#: common/models.py:225
-msgid "Allow sale of expired stock"
-msgstr ""
+msgid "Enable generation of test reports"
+msgstr "Erstellung von Test-Berichten aktivieren"
#: common/models.py:231
-#, fuzzy
-#| msgid "Stock Item"
-msgid "Stock Stale Time"
-msgstr "Lagerobjekt"
+msgid "Stock Expiry"
+msgstr "Bestands-Ablauf"
#: common/models.py:232
+msgid "Enable stock expiry functionality"
+msgstr "Bestands-Ablauf ermöglichen"
+
+#: common/models.py:238
+msgid "Sell Expired Stock"
+msgstr "Abgelaufenen Bestand verkaufen"
+
+#: common/models.py:239
+msgid "Allow sale of expired stock"
+msgstr "Verkauf von abgelaufenem Bestand erlaubt"
+
+#: common/models.py:245
+msgid "Stock Stale Time"
+msgstr "Bestands-Stehzeit"
+
+#: common/models.py:246
msgid "Number of days stock items are considered stale before expiring"
msgstr ""
+"Anzahl an Tagen an denen Bestandsobjekte als abgestanden markiert werden "
+"bevor sie ablaufen"
-#: common/models.py:234 part/templates/part/detail.html:121
+#: common/models.py:248 part/templates/part/detail.html:121
msgid "days"
msgstr "Tage"
-#: common/models.py:239
-#, fuzzy
-#| msgid "Builds"
-msgid "Build Expired Stock"
-msgstr "Baue"
-
-#: common/models.py:240
-msgid "Allow building with expired stock"
-msgstr ""
-
-#: common/models.py:246
-msgid "Stock Ownership Control"
-msgstr ""
-
-#: common/models.py:247
-msgid "Enable ownership control over stock locations and items"
-msgstr ""
-
#: common/models.py:253
+msgid "Build Expired Stock"
+msgstr "Abgelaufenen Bestand verbauen"
+
+#: common/models.py:254
+msgid "Allow building with expired stock"
+msgstr "Verbauen von abgelaufenen Bestand erlaubt"
+
+#: common/models.py:260
+msgid "Stock Ownership Control"
+msgstr "Bestands-Eigentümerkontrolle"
+
+#: common/models.py:261
+msgid "Enable ownership control over stock locations and items"
+msgstr "Eigentümerkontrolle für Lagerorte und Teile aktivieren"
+
+#: common/models.py:267
msgid "Group by Part"
msgstr "Gruppieren nach Teil"
-#: common/models.py:254
-msgid "Group stock items by part reference in table views"
-msgstr ""
-
-#: common/models.py:260
-#, fuzzy
-#| msgid "Parent Stock Item"
-msgid "Recent Stock Count"
-msgstr "Eltern-Lagerobjekt"
-
-#: common/models.py:261
-#, fuzzy
-#| msgid "Number of parts to build"
-msgid "Number of recent stock items to display on index page"
-msgstr "Anzahl der zu bauenden Teile"
-
-#: common/models.py:267
-#, fuzzy
-#| msgid "Order Reference"
-msgid "Build Order Reference Prefix"
-msgstr "Bestellreferenz"
-
#: common/models.py:268
-#, fuzzy
-#| msgid "Order reference"
-msgid "Prefix value for build order reference"
-msgstr "Bestell-Referenz"
-
-#: common/models.py:273
-#, fuzzy
-#| msgid "Order Reference"
-msgid "Build Order Reference Regex"
-msgstr "Bestellreferenz"
+msgid "Group stock items by part reference in table views"
+msgstr "BestandsObjekte in Tabellen anhand von Teil-Referenz gruppieren"
#: common/models.py:274
+msgid "Recent Stock Count"
+msgstr "aktueller Bestand"
+
+#: common/models.py:275
+msgid "Number of recent stock items to display on index page"
+msgstr "Anzahl der aktuellen BestandsObjekte auf der Startseite"
+
+#: common/models.py:281
+msgid "Build Order Reference Prefix"
+msgstr "Bauauftrag-Referenz Präfix"
+
+#: common/models.py:282
+msgid "Prefix value for build order reference"
+msgstr "Präfix für Bauauftrag-Referenz"
+
+#: common/models.py:287
+msgid "Build Order Reference Regex"
+msgstr "Bauauftrag-Referenz RegEx"
+
+#: common/models.py:288
msgid "Regular expression pattern for matching build order reference"
-msgstr ""
+msgstr "RegEx Muster für die Zuordnung von Bauauftrag-Referenzen"
-#: common/models.py:278
-#, fuzzy
-#| msgid "Sales Order Reference"
+#: common/models.py:292
msgid "Sales Order Reference Prefix"
-msgstr "Bestellungsreferenz"
+msgstr "Auftrags-Referenz Präfix"
-#: common/models.py:279
-#, fuzzy
-#| msgid "Order reference"
+#: common/models.py:293
msgid "Prefix value for sales order reference"
-msgstr "Bestell-Referenz"
+msgstr "Präfix für Auftrags-Referenz"
-#: common/models.py:284
-#, fuzzy
-#| msgid "Order reference"
+#: common/models.py:298
msgid "Purchase Order Reference Prefix"
-msgstr "Bestell-Referenz"
+msgstr "Bestellungs-Referenz Präfix"
-#: common/models.py:285
-#, fuzzy
-#| msgid "Order reference"
+#: common/models.py:299
msgid "Prefix value for purchase order reference"
-msgstr "Bestell-Referenz"
+msgstr "Präfix für Bestellungs-Referenz"
-#: common/models.py:508
+#: common/models.py:522
msgid "Settings key (must be unique - case insensitive"
msgstr ""
"Einstellungs-Schlüssel (muss einzigartig sein, Groß-/ Kleinschreibung wird "
"nicht beachtet)"
-#: common/models.py:510
+#: common/models.py:524
msgid "Settings value"
msgstr "Einstellungs-Wert"
-#: common/models.py:545
+#: common/models.py:559
msgid "Must be an integer value"
msgstr "Nur Ganzzahl eingeben"
-#: common/models.py:568
+#: common/models.py:582
msgid "Value must be a boolean value"
msgstr "Wahrheitswert erforderlich"
-#: common/models.py:579
-#, fuzzy
-#| msgid "Must enter integer value"
+#: common/models.py:593
msgid "Value must be an integer value"
msgstr "Nur Ganzzahl eingeben"
-#: common/models.py:602
+#: common/models.py:616
msgid "Key string must be unique"
msgstr "Schlüsseltext muss eindeutig sein"
-#: common/models.py:683 company/forms.py:113
-#, fuzzy
-#| msgid "Price Breaks"
+#: common/models.py:697 company/forms.py:131
msgid "Price break quantity"
-msgstr "Preisstaffelung"
+msgstr "Preisstaffelungs Anzahl"
-#: common/models.py:691 company/templates/company/supplier_part_pricing.html:82
+#: common/models.py:705 company/templates/company/supplier_part_pricing.html:82
#: part/templates/part/sale_prices.html:90 templates/js/bom.js:255
msgid "Price"
msgstr "Preis"
-#: common/models.py:692
+#: common/models.py:706
msgid "Unit price at specified quantity"
msgstr "Stückpreis für die angegebene Anzahl"
-#: common/models.py:715
-#, fuzzy
-#| msgid "Default Location"
+#: common/models.py:729
msgid "Default"
-msgstr "Standard-Lagerort"
+msgstr "Standard"
#: common/templates/common/edit_setting.html:11
-#, fuzzy
-#| msgid "Currency Value"
msgid "Current value"
-msgstr "Währungs-Wert"
+msgstr "Aktueller Wert"
#: common/views.py:25
msgid "Change Setting"
@@ -1697,25 +1566,28 @@ msgid "Supplied value is not allowed"
msgstr "Angegebener Wert nicht erlaubt"
#: common/views.py:103
-#, fuzzy
-#| msgid "Supplier part description"
msgid "Supplied value must be a boolean"
-msgstr "Zuliefererbeschreibung des Teils"
+msgstr "Angegebener Wert muss ein Wahrheitswert sein"
#: company/forms.py:37 company/models.py:139
-#, fuzzy
-#| msgid "Do you purchase items from this company?"
msgid "Default currency used for this company"
-msgstr "Kaufen Sie Teile von dieser Firma?"
+msgstr "Standard-Währung für diese Firma"
-#: company/forms.py:80
+#: company/forms.py:75 part/forms.py:46
+msgid "URL"
+msgstr "URL"
+
+#: company/forms.py:76 part/forms.py:47
+msgid "Image URL"
+msgstr "Bild-URL"
+
+#: company/forms.py:98
msgid "Single Price"
msgstr "Einzelpreis"
-#: company/forms.py:82
-#, fuzzy
+#: company/forms.py:100
msgid "Single quantity price"
-msgstr "Keine gültige Menge"
+msgstr "Einzelpreis"
#: company/models.py:98
msgid "Company description"
@@ -1725,7 +1597,7 @@ msgstr "Firmenbeschreibung"
msgid "Description of the company"
msgstr "Firmenbeschreibung"
-#: company/models.py:100 company/templates/company/company_base.html:57
+#: company/models.py:100 company/templates/company/company_base.html:70
#: company/templates/company/detail.html:31 templates/js/company.js:60
msgid "Website"
msgstr "Website"
@@ -1734,7 +1606,7 @@ msgstr "Website"
msgid "Company website URL"
msgstr "Firmenwebsite Adresse/URL"
-#: company/models.py:103 company/templates/company/company_base.html:64
+#: company/models.py:103 company/templates/company/company_base.html:77
msgid "Address"
msgstr "Adresse"
@@ -1750,7 +1622,7 @@ msgstr "Kontakt-Tel."
msgid "Contact phone number"
msgstr "Kontakt-Telefon"
-#: company/models.py:111 company/templates/company/company_base.html:78
+#: company/models.py:111 company/templates/company/company_base.html:91
msgid "Email"
msgstr "Email"
@@ -1758,7 +1630,7 @@ msgstr "Email"
msgid "Contact email address"
msgstr "Kontakt-Email"
-#: company/models.py:114 company/templates/company/company_base.html:85
+#: company/models.py:114 company/templates/company/company_base.html:98
msgid "Contact"
msgstr "Kontakt"
@@ -1798,7 +1670,7 @@ msgstr "Teil auswählen"
#: company/models.py:323 company/templates/company/detail.html:60
#: company/templates/company/supplier_part_base.html:83
#: company/templates/company/supplier_part_detail.html:25
-#: order/templates/order/order_base.html:89
+#: order/templates/order/order_base.html:92
#: order/templates/order/order_wizard/select_pos.html:30 part/bom.py:170
#: stock/templates/stock/item_base.html:331 templates/js/company.js:48
#: templates/js/company.js:164 templates/js/order.js:170
@@ -1842,7 +1714,7 @@ msgid "Manufacturer part number"
msgstr "Hersteller-Teilenummer"
#: company/models.py:353 part/models.py:742
-#: report/templates/report/inventree_build_order_base.html:168
+#: report/templates/report/inventree_build_order_base.html:165
#: templates/js/company.js:208 templates/js/part.js:430
msgid "Link"
msgstr "Link"
@@ -1857,6 +1729,8 @@ msgstr "Zuliefererbeschreibung des Teils"
#: company/models.py:365 company/templates/company/supplier_part_base.html:113
#: company/templates/company/supplier_part_detail.html:38
+#: report/templates/report/inventree_po_report.html:93
+#: report/templates/report/inventree_so_report.html:93
msgid "Note"
msgstr "Notiz"
@@ -1871,24 +1745,32 @@ msgstr "Teile-Packaging"
#: company/templates/company/assigned_stock.html:10
#: company/templates/company/navbar.html:51
#: company/templates/company/navbar.html:54 templates/js/build.js:411
-#, fuzzy
-#| msgid "Assigned"
msgid "Assigned Stock"
-msgstr "Zugewiesen"
+msgstr "Zugeordneter Bestand"
-#: company/templates/company/company_base.html:7
-#: company/templates/company/company_base.html:22
+#: company/templates/company/company_base.html:9
+#: company/templates/company/company_base.html:35
#: templates/InvenTree/search.html:288 templates/js/company.js:33
msgid "Company"
msgstr "Firma"
-#: company/templates/company/company_base.html:51
+#: company/templates/company/company_base.html:25
+#: part/templates/part/part_thumb.html:21
+msgid "Upload new image"
+msgstr "Neues Bild hochladen"
+
+#: company/templates/company/company_base.html:27
+#: part/templates/part/part_thumb.html:23
+msgid "Download image from URL"
+msgstr "Bild von URL herunterladen"
+
+#: company/templates/company/company_base.html:64
#: company/templates/company/detail.html:10
#: company/templates/company/navbar.html:12
msgid "Company Details"
msgstr "Firmendetails"
-#: company/templates/company/company_base.html:71
+#: company/templates/company/company_base.html:84
msgid "Phone"
msgstr "Telefon"
@@ -1901,13 +1783,11 @@ msgid "No website specified"
msgstr "Keine Website angegeben"
#: company/templates/company/detail.html:43
-#, fuzzy
-#| msgid "Delete Currency"
msgid "Uses default currency"
-msgstr "Währung entfernen"
+msgstr "verwendet Standard-Währung"
#: company/templates/company/detail.html:65
-#: order/templates/order/sales_order_base.html:89 stock/models.py:412
+#: order/templates/order/sales_order_base.html:92 stock/models.py:412
#: stock/models.py:413 stock/templates/stock/item_base.html:241
#: templates/js/company.js:40 templates/js/order.js:267
msgid "Customer"
@@ -1921,7 +1801,7 @@ msgstr "Zulieferer-Teile"
#: company/templates/company/detail_part.html:20
#: order/templates/order/purchase_order_detail.html:75
msgid "Create new supplier part"
-msgstr "Neues Zuliefererteil anlegen"
+msgstr "Neues Zulieferer-Teil anlegen"
#: company/templates/company/detail_part.html:21
#: order/templates/order/purchase_order_detail.html:74
@@ -1957,29 +1837,29 @@ msgstr "Neues Teil"
msgid "Create new Part"
msgstr "Neues Teil hinzufügen"
-#: company/templates/company/detail_part.html:72 company/views.py:56
-#: order/templates/order/purchase_orders.html:164
+#: company/templates/company/detail_part.html:72 company/views.py:62
+#: order/templates/order/purchase_orders.html:182
#: part/templates/part/supplier.html:50
msgid "New Supplier"
msgstr "Neuer Zulieferer"
-#: company/templates/company/detail_part.html:73 company/views.py:195
-#: order/templates/order/purchase_orders.html:165
+#: company/templates/company/detail_part.html:73 company/views.py:279
+#: order/templates/order/purchase_orders.html:183
msgid "Create new Supplier"
msgstr "Neuen Zulieferer anlegen"
-#: company/templates/company/detail_part.html:78 company/views.py:63
+#: company/templates/company/detail_part.html:78 company/views.py:69
#: part/templates/part/supplier.html:56
msgid "New Manufacturer"
msgstr "Neuer Hersteller"
-#: company/templates/company/detail_part.html:79 company/views.py:198
+#: company/templates/company/detail_part.html:79 company/views.py:282
msgid "Create new Manufacturer"
msgstr "Neuen Hersteller anlegen"
#: company/templates/company/detail_stock.html:10
msgid "Supplier Stock"
-msgstr "Zuliefererbestand"
+msgstr "Zulieferer-Bestand"
#: company/templates/company/detail_stock.html:37
#: company/templates/company/supplier_part_stock.html:34
@@ -1990,7 +1870,7 @@ msgstr "Exportieren"
#: company/templates/company/index.html:7
msgid "Supplier List"
-msgstr "Zuliefererliste"
+msgstr "Zulieferer-Liste"
#: company/templates/company/navbar.html:20
msgid "Supplied Parts"
@@ -2013,7 +1893,7 @@ msgstr "Teile"
#: stock/templates/stock/location.html:115 templates/InvenTree/search.html:182
#: templates/stats.html:48 templates/stats.html:57 users/models.py:35
msgid "Stock Items"
-msgstr "Lagerobjekte"
+msgstr "BestandsObjekte"
#: company/templates/company/navbar.html:30
#: company/templates/company/part_navbar.html:14
@@ -2039,7 +1919,7 @@ msgstr "Lagerbestand"
#: templates/InvenTree/settings/tabs.html:37 templates/navbar.html:46
#: users/models.py:38
msgid "Sales Orders"
-msgstr "VK-Aufträge"
+msgstr "Aufträge"
#: company/templates/company/navbar.html:39
#: company/templates/company/purchase_orders.html:10
@@ -2051,7 +1931,7 @@ msgstr "VK-Aufträge"
#: templates/InvenTree/settings/tabs.html:34 templates/navbar.html:37
#: users/models.py:37
msgid "Purchase Orders"
-msgstr "EK-Bestellungen"
+msgstr "Bestellungen"
#: company/templates/company/notes.html:11
msgid "Company Notes"
@@ -2060,22 +1940,20 @@ msgstr "Firmenbemerkungen"
#: company/templates/company/part_navbar.html:11
#: company/templates/company/supplier_part_stock.html:10
msgid "Supplier Part Stock"
-msgstr "Zuliefererbestand"
+msgstr "Zulieferer-Bestand"
#: company/templates/company/part_navbar.html:18
#: company/templates/company/supplier_part_orders.html:10
msgid "Supplier Part Orders"
-msgstr "Zuliefererbestellungen"
+msgstr "Zulieferer-Bestellungen"
#: company/templates/company/part_navbar.html:21
msgid "Orders"
msgstr "Bestellungen"
#: company/templates/company/part_navbar.html:25
-#, fuzzy
-#| msgid "Supplier Part"
msgid "Supplier Part Pricing"
-msgstr "Zulieferer-Teil"
+msgstr "Zulieferer-Teil Bepreisung"
#: company/templates/company/part_navbar.html:28
msgid "Pricing"
@@ -2087,22 +1965,22 @@ msgstr ""
"Sind Sie sicher, dass sie die folgenden Zulieferer-Teile löschen möchten?"
#: company/templates/company/purchase_orders.html:18
-#: order/templates/order/purchase_orders.html:19
+#: order/templates/order/purchase_orders.html:20
msgid "Create new purchase order"
-msgstr "Neue EK-Bestellung anlegen"
+msgstr "Neue Bestellung anlegen"
#: company/templates/company/purchase_orders.html:19
-#: order/templates/order/purchase_orders.html:20
+#: order/templates/order/purchase_orders.html:21
msgid "New Purchase Order"
-msgstr "Neue EK-Bestellung"
+msgstr "Neue Bestellung"
#: company/templates/company/sales_orders.html:19
-#: order/templates/order/sales_orders.html:19
+#: order/templates/order/sales_orders.html:20
msgid "Create new sales order"
msgstr "Neuen Auftrag anlegen"
#: company/templates/company/sales_orders.html:20
-#: order/templates/order/sales_orders.html:20
+#: order/templates/order/sales_orders.html:21
msgid "New Sales Order"
msgstr "Neuer Auftrag"
@@ -2119,16 +1997,16 @@ msgstr "Teil bestellen"
#: company/templates/company/supplier_part_base.html:39
msgid "Edit supplier part"
-msgstr "Zuliefererteil bearbeiten"
+msgstr "Zulieferer-Teil bearbeiten"
#: company/templates/company/supplier_part_base.html:43
msgid "Delete supplier part"
-msgstr "Zuliefererteil entfernen"
+msgstr "Zulieferer-Teil entfernen"
#: company/templates/company/supplier_part_base.html:55
#: company/templates/company/supplier_part_detail.html:10
msgid "Supplier Part Details"
-msgstr "Zuliefererteildetails"
+msgstr "Zulieferer-Teildetails"
#: company/templates/company/supplier_part_base.html:60
#: company/templates/company/supplier_part_detail.html:18
@@ -2137,10 +2015,8 @@ msgstr "Internes Teil"
#: company/templates/company/supplier_part_base.html:106 stock/models.py:394
#: stock/templates/stock/item_base.html:289 templates/js/stock.js:663
-#, fuzzy
-#| msgid "Part packaging"
msgid "Packaging"
-msgstr "Teile-Packaging"
+msgstr "Verpackungen"
#: company/templates/company/supplier_part_orders.html:18
#: part/templates/part/orders.html:18
@@ -2151,8 +2027,8 @@ msgstr "Teil bestellen"
msgid "Pricing Information"
msgstr "Preisinformationen ansehen"
-#: company/templates/company/supplier_part_pricing.html:19 company/views.py:485
-#: part/templates/part/sale_prices.html:17 part/views.py:2511
+#: company/templates/company/supplier_part_pricing.html:19 company/views.py:569
+#: part/templates/part/sale_prices.html:17 part/views.py:2618
msgid "Add Price Break"
msgstr "Preisstaffel hinzufügen"
@@ -2171,129 +2047,137 @@ msgstr "Preisstaffel bearbeiten"
msgid "Delete price break"
msgstr "Preisstaffel löschen"
-#: company/views.py:55 part/templates/part/navbar.html:72
+#: company/views.py:61 part/templates/part/navbar.html:72
#: part/templates/part/navbar.html:75 templates/InvenTree/search.html:291
#: templates/navbar.html:35
msgid "Suppliers"
msgstr "Zulieferer"
-#: company/views.py:62 templates/InvenTree/search.html:308
+#: company/views.py:68 templates/InvenTree/search.html:308
#: templates/navbar.html:36
msgid "Manufacturers"
msgstr "Hersteller"
-#: company/views.py:69 templates/InvenTree/search.html:321
+#: company/views.py:75 templates/InvenTree/search.html:321
#: templates/navbar.html:45
msgid "Customers"
msgstr "Kunden"
-#: company/views.py:70
+#: company/views.py:76 order/templates/order/sales_orders.html:184
msgid "New Customer"
msgstr "Neuer Kunde"
-#: company/views.py:78
+#: company/views.py:84
msgid "Companies"
msgstr "Firmen"
-#: company/views.py:79
+#: company/views.py:85
msgid "New Company"
msgstr "Neue Firma"
-#: company/views.py:157
+#: company/views.py:167 part/views.py:848
+msgid "Download Image"
+msgstr "Bild herunterladen"
+
+#: company/views.py:196 part/views.py:880
+msgid "Image size exceeds maximum allowable size for download"
+msgstr "Bildgröße überschreitet maximal-erlaubte Größe für Downloads"
+
+#: company/views.py:212 part/views.py:896
+msgid "Supplied URL is not a valid image file"
+msgstr "Angegebene URL ist kein gültiges Bild"
+
+#: company/views.py:241
msgid "Update Company Image"
msgstr "Firmenbild aktualisieren"
-#: company/views.py:163
+#: company/views.py:247
msgid "Updated company image"
msgstr "Aktualisiertes Firmenbild"
-#: company/views.py:173
+#: company/views.py:257
msgid "Edit Company"
msgstr "Firma bearbeiten"
-#: company/views.py:178
+#: company/views.py:262
msgid "Edited company information"
msgstr "Firmeninformation bearbeitet"
-#: company/views.py:201
+#: company/views.py:285 order/templates/order/sales_orders.html:185
msgid "Create new Customer"
msgstr "Neuen Kunden anlegen"
-#: company/views.py:203
+#: company/views.py:287
msgid "Create new Company"
msgstr "Neue Firma anlegen"
-#: company/views.py:230
+#: company/views.py:314
msgid "Created new company"
msgstr "Neue Firma angelegt"
-#: company/views.py:240
+#: company/views.py:324
msgid "Delete Company"
msgstr "Firma löschen"
-#: company/views.py:246
+#: company/views.py:330
msgid "Company was deleted"
msgstr "Firma gelöscht"
-#: company/views.py:271
+#: company/views.py:355
msgid "Edit Supplier Part"
-msgstr "Zuliefererteil bearbeiten"
+msgstr "Zulieferer-Teil bearbeiten"
-#: company/views.py:294 templates/js/stock.js:1083
+#: company/views.py:378 templates/js/stock.js:1083
msgid "Create new Supplier Part"
-msgstr "Neues Zuliefererteil anlegen"
+msgstr "Neues Zulieferer-Teil anlegen"
-#: company/views.py:413
+#: company/views.py:497
msgid "Delete Supplier Part"
-msgstr "Zuliefererteil entfernen"
+msgstr "Zulieferer-Teil entfernen"
-#: company/views.py:490 part/views.py:2515
+#: company/views.py:574 part/views.py:2622
msgid "Added new price break"
msgstr "neue Preisstaffel hinzufügt"
-#: company/views.py:546 part/views.py:2559
+#: company/views.py:630 part/views.py:2666
msgid "Edit Price Break"
msgstr "Preisstaffel bearbeiten"
-#: company/views.py:561 part/views.py:2573
+#: company/views.py:645 part/views.py:2680
msgid "Delete Price Break"
msgstr "Preisstaffel löschen"
-#: label/api.py:56 report/api.py:162
+#: label/api.py:56 report/api.py:201
msgid "No valid objects provided to template"
-msgstr ""
+msgstr "Keine korrekten Objekte für Vorlage gegeben"
#: label/models.py:102
-#, fuzzy
-#| msgid "Part name"
msgid "Label name"
-msgstr "Name des Teils"
+msgstr "Label Name"
#: label/models.py:109
-#, fuzzy
-#| msgid "Part description"
msgid "Label description"
-msgstr "Beschreibung des Teils"
+msgstr "Label Beschreibung"
#: label/models.py:116 stock/forms.py:201
msgid "Label"
-msgstr ""
+msgstr "Label"
#: label/models.py:117
msgid "Label template file"
-msgstr ""
+msgstr "Label-Vorlage-Datei"
-#: label/models.py:123 report/models.py:257
+#: label/models.py:123 report/models.py:274
msgid "Enabled"
msgstr "Aktiviert"
#: label/models.py:124
msgid "Label template is enabled"
-msgstr ""
+msgstr "Label-Vorlage ist aktiviert"
#: label/models.py:130
msgid "Label width, specified in mm"
-msgstr ""
+msgstr "Label-Breite in mm"
#: label/models.py:136
msgid "Height [mm]"
@@ -2301,208 +2185,200 @@ msgstr "Höhe [mm]"
#: label/models.py:137
msgid "Label height, specified in mm"
-msgstr ""
+msgstr "Label-Höhe in mm"
#: label/models.py:222 label/models.py:273
msgid "Query filters (comma-separated list of key=value pairs"
-msgstr ""
+msgstr "Abfragefilter (kommagetrennte Liste mit Schlüssel=Wert-Paaren)"
-#: label/models.py:223 label/models.py:274 report/models.py:277
+#: label/models.py:223 label/models.py:274 report/models.py:294
+#: report/models.py:415 report/models.py:449
msgid "Filters"
msgstr "Filter"
-#: order/forms.py:25 order/templates/order/order_base.html:44
+#: order/forms.py:25 order/templates/order/order_base.html:47
msgid "Place order"
msgstr "Bestellung aufgeben"
-#: order/forms.py:36 order/templates/order/order_base.html:51
+#: order/forms.py:36 order/templates/order/order_base.html:54
msgid "Mark order as complete"
msgstr "Bestellung als vollständig markieren"
-#: order/forms.py:47 order/forms.py:58 order/templates/order/order_base.html:56
-#: order/templates/order/sales_order_base.html:56
+#: order/forms.py:47 order/forms.py:58 order/templates/order/order_base.html:59
+#: order/templates/order/sales_order_base.html:59
msgid "Cancel order"
msgstr "Bestellung stornieren"
-#: order/forms.py:69 order/templates/order/sales_order_base.html:53
+#: order/forms.py:69 order/templates/order/sales_order_base.html:56
msgid "Ship order"
msgstr "Bestellung versenden"
#: order/forms.py:80
msgid "Receive parts to this location"
-msgstr "Teile in diesen Ort empfangen"
+msgstr "Teile in diesen Lagerort empfangen"
#: order/forms.py:101
msgid "Purchase Order reference"
-msgstr "Bestell-Referenz"
+msgstr "Bestellungs-Referenz"
#: order/forms.py:107
msgid "Target date for order delivery. Order will be overdue after this date."
-msgstr ""
+msgstr "Zieldatum für Auftrags-Lieferung."
-#: order/forms.py:134
-#, fuzzy
-#| msgid "Cancel sales order"
+#: order/forms.py:135
msgid "Enter sales order number"
-msgstr "Auftrag stornieren"
+msgstr "Auftrag-Nummer eingeben"
-#: order/forms.py:140 order/models.py:438
+#: order/forms.py:141 order/models.py:448
msgid ""
"Target date for order completion. Order will be overdue after this date."
-msgstr ""
+msgstr "Zieldatum für Auftrags-Fertigstellung."
-#: order/models.py:98
+#: order/models.py:99
msgid "Order reference"
msgstr "Bestell-Referenz"
-#: order/models.py:100
+#: order/models.py:101
msgid "Order description"
msgstr "Bestellungs-Beschreibung"
-#: order/models.py:102
+#: order/models.py:103
msgid "Link to external page"
msgstr "Link auf externe Seite"
-#: order/models.py:112
+#: order/models.py:117
+msgid "User or group responsible for this order"
+msgstr "Nutzer oder Gruppe der/die für diesen Auftrag zuständig ist/sind"
+
+#: order/models.py:122
msgid "Order notes"
msgstr "Bestell-Notizen"
-#: order/models.py:171 order/models.py:431
-#, fuzzy
-#| msgid "Purchase Order Details"
+#: order/models.py:181 order/models.py:441
msgid "Purchase order status"
-msgstr "Bestelldetails"
+msgstr "Bestellungs-Status"
-#: order/models.py:179
+#: order/models.py:189
msgid "Company from which the items are being ordered"
-msgstr ""
+msgstr "Firma bei der die Teile bestellt werden"
-#: order/models.py:182
+#: order/models.py:192
msgid "Supplier order reference code"
-msgstr "Bestellreferenz"
+msgstr "Zulieferer Bestellreferenz"
-#: order/models.py:193
-#, fuzzy
-#| msgid "Issue Order"
+#: order/models.py:203
msgid "Issue Date"
-msgstr "Bestellung aufgeben"
+msgstr "Aufgabedatum"
-#: order/models.py:194
+#: order/models.py:204
msgid "Date order was issued"
-msgstr ""
+msgstr "Datum an dem die Bestellung aufgegeben wurde"
-#: order/models.py:199
-#, fuzzy
-#| msgid "Shipment Date"
+#: order/models.py:209
msgid "Target Delivery Date"
-msgstr "Versanddatum"
+msgstr "Ziel-Versanddatum"
-#: order/models.py:200
+#: order/models.py:210
msgid ""
"Expected date for order delivery. Order will be overdue after this date."
-msgstr ""
+msgstr "Geplantes Lieferdatum für Auftrag."
-#: order/models.py:205
-#, fuzzy
-#| msgid "Creation Date"
+#: order/models.py:215
msgid "Completion Date"
-msgstr "Erstelldatum"
+msgstr "Fertigstellungsdatum"
-#: order/models.py:206
-#, fuzzy
-#| msgid "Mark order as complete"
+#: order/models.py:216
msgid "Date order was completed"
-msgstr "Bestellung als vollständig markieren"
+msgstr "Datum an dem der Auftrag fertigstellt wurde"
-#: order/models.py:230 order/models.py:329 part/views.py:1479
+#: order/models.py:240 order/models.py:339 part/views.py:1586
#: stock/models.py:269 stock/models.py:948
msgid "Quantity must be greater than zero"
msgstr "Anzahl muss größer Null sein"
-#: order/models.py:235
+#: order/models.py:245
msgid "Part supplier must match PO supplier"
-msgstr "Teile-Zulieferer muss dem Zulieferer der EK-Bestellung entsprechen"
+msgstr "Teile-Zulieferer muss dem Zulieferer der Bestellung entsprechen"
-#: order/models.py:324
+#: order/models.py:334
msgid "Lines can only be received against an order marked as 'Placed'"
msgstr "Nur Teile aufgegebener Bestllungen können empfangen werden"
-#: order/models.py:346
-#, fuzzy
-#| msgid "Receive line item"
+#: order/models.py:356
msgid "Received items"
-msgstr "Position empfangen"
+msgstr "Elemente empfangen"
-#: order/models.py:427
+#: order/models.py:437
msgid "Company to which the items are being sold"
-msgstr ""
+msgstr "Firma an die die Teile verkauft werden"
-#: order/models.py:433
+#: order/models.py:443
msgid "Customer order reference code"
msgstr "Bestellreferenz"
-#: order/models.py:491
+#: order/models.py:501
msgid "SalesOrder cannot be shipped as it is not currently pending"
-msgstr "VK-Auftrag kann nicht versendet werden weil er nicht anhängig ist"
+msgstr "Bestellung kann nicht versendet werden weil er nicht anhängig ist"
-#: order/models.py:578
+#: order/models.py:588
msgid "Item quantity"
msgstr "Anzahl"
-#: order/models.py:580
+#: order/models.py:590
msgid "Line item reference"
msgstr "Position - Referenz"
-#: order/models.py:582
+#: order/models.py:592
msgid "Line item notes"
msgstr "Position - Notizen"
-#: order/models.py:608 order/templates/order/order_base.html:9
+#: order/models.py:618 order/templates/order/order_base.html:9
#: order/templates/order/order_base.html:24
+#: report/templates/report/inventree_po_report.html:77
#: stock/templates/stock/item_base.html:303 templates/js/order.js:148
msgid "Purchase Order"
-msgstr "EK-Bestellung"
+msgstr "Bestellung"
-#: order/models.py:621
+#: order/models.py:631
msgid "Supplier part"
msgstr "Zulieferer-Teil"
-#: order/models.py:624
+#: order/models.py:634
msgid "Number of items received"
msgstr "Empfangene Objekt-Anzahl"
-#: order/models.py:631 stock/models.py:505
+#: order/models.py:641 stock/models.py:505
#: stock/templates/stock/item_base.html:310
msgid "Purchase Price"
msgstr "EK-Preis"
-#: order/models.py:632
+#: order/models.py:642
msgid "Unit purchase price"
msgstr "EK-Preis pro Einheit"
-#: order/models.py:727
+#: order/models.py:737
msgid "Cannot allocate stock item to a line with a different part"
-msgstr "Kann Lagerobjekt keiner Zeile mit einem anderen Teil hinzufügen"
+msgstr "Kann BestandsObjekt keiner Zeile mit einem anderen Teil hinzufügen"
-#: order/models.py:729
+#: order/models.py:739
msgid "Cannot allocate stock to a line without a part"
-msgstr "Kann Lagerobjekt keiner Zeile ohne Teil hinzufügen"
-
-#: order/models.py:732
-msgid "Allocation quantity cannot exceed stock quantity"
-msgstr "Die zugewiesene Anzahl darf nicht die verfügbare Anzahl überschreiten"
+msgstr "Kann BestandsObjekt keiner Zeile ohne Teil hinzufügen"
#: order/models.py:742
+msgid "Allocation quantity cannot exceed stock quantity"
+msgstr "Die zugeordnete Anzahl darf nicht die verfügbare Anzahl überschreiten"
+
+#: order/models.py:752
msgid "Quantity must be 1 for serialized stock item"
-msgstr "Anzahl muss 1 für Objekte mit Seriennummer sein"
+msgstr "Anzahl für BestandsObjekt mit Seriennummer muss 1 sein"
-#: order/models.py:758
+#: order/models.py:768
msgid "Select stock item to allocate"
-msgstr "Lagerobjekt für Zuordnung auswählen"
+msgstr "BestandsObjekt für Zuordnung auswählen"
-#: order/models.py:761
+#: order/models.py:771
msgid "Enter stock allocation quantity"
-msgstr "Zuordnungsanzahl eingeben"
+msgstr "Anzahl für Bestandszuordnung eingeben"
#: order/templates/order/delete_attachment.html:5
#: stock/templates/stock/attachment_delete.html:5
@@ -2510,48 +2386,51 @@ msgstr "Zuordnungsanzahl eingeben"
msgid "Are you sure you want to delete this attachment?"
msgstr "Sind Sie sicher, dass Sie diesen Anhang löschen wollen?"
-#: order/templates/order/order_base.html:40
+#: order/templates/order/order_base.html:39
+#: order/templates/order/sales_order_base.html:48
+msgid "Print"
+msgstr "Drucken"
+
+#: order/templates/order/order_base.html:43
msgid "Edit order information"
msgstr "Bestellinfos bearbeiten"
-#: order/templates/order/order_base.html:48
-#, fuzzy
-#| msgid "Receive line item"
+#: order/templates/order/order_base.html:51
msgid "Receive items"
-msgstr "Position empfangen"
+msgstr "Elemente empfangen"
-#: order/templates/order/order_base.html:61
+#: order/templates/order/order_base.html:64
msgid "Export order to file"
msgstr "Exportiere Bestellung in Datei"
-#: order/templates/order/order_base.html:69
+#: order/templates/order/order_base.html:72
#: order/templates/order/po_navbar.html:11
msgid "Purchase Order Details"
-msgstr "Bestelldetails"
+msgstr "Bestellungs-Details"
-#: order/templates/order/order_base.html:74
-#: order/templates/order/sales_order_base.html:74
+#: order/templates/order/order_base.html:77
+#: order/templates/order/sales_order_base.html:77
msgid "Order Reference"
msgstr "Bestellreferenz"
-#: order/templates/order/order_base.html:79
-#: order/templates/order/sales_order_base.html:79
+#: order/templates/order/order_base.html:82
+#: order/templates/order/sales_order_base.html:82
msgid "Order Status"
msgstr "Bestellstatus"
-#: order/templates/order/order_base.html:95 templates/js/order.js:179
+#: order/templates/order/order_base.html:98 templates/js/order.js:179
msgid "Supplier Reference"
-msgstr "Zuliefererreferenz"
+msgstr "Zulieferer-Referenz"
-#: order/templates/order/order_base.html:114
-#: report/templates/report/inventree_build_order_base.html:125
+#: order/templates/order/order_base.html:117
+#: report/templates/report/inventree_build_order_base.html:122
msgid "Issued"
msgstr "Aufgegeben"
-#: order/templates/order/order_base.html:128
+#: order/templates/order/order_base.html:131
#: order/templates/order/purchase_order_detail.html:207
#: order/templates/order/receive_parts.html:22
-#: order/templates/order/sales_order_base.html:128
+#: order/templates/order/sales_order_base.html:131
msgid "Received"
msgstr "Empfangen"
@@ -2570,16 +2449,12 @@ msgid "Step 1 of 2 - Select Part Suppliers"
msgstr "Schritt 1 von 2 - Zulieferer auswählen"
#: order/templates/order/order_wizard/select_parts.html:14
-#, fuzzy
-#| msgid "Select suppliers."
msgid "Select suppliers"
-msgstr "Zulieferer auswählen."
+msgstr "Zulieferer auswählen"
#: order/templates/order/order_wizard/select_parts.html:18
-#, fuzzy
-#| msgid "No purchaseable parts selected."
msgid "No purchaseable parts selected"
-msgstr "Keine kaufbaren Teile ausgewählt."
+msgstr "Keine kaufbaren Teile ausgewählt"
#: order/templates/order/order_wizard/select_parts.html:31
msgid "Select Supplier"
@@ -2591,11 +2466,11 @@ msgstr "Zulieferer auswählen für"
#: order/templates/order/order_wizard/select_pos.html:8
msgid "Step 2 of 2 - Select Purchase Orders"
-msgstr "Schritt 2 von 2 - EK-Bestellung auswählen"
+msgstr "Schritt 2 von 2 - Bestellung auswählen"
#: order/templates/order/order_wizard/select_pos.html:12
msgid "Select existing purchase orders, or create new orders."
-msgstr "EK-Bestellungen auswählen oder anlegen."
+msgstr "Bestellungen auswählen oder anlegen."
#: order/templates/order/order_wizard/select_pos.html:31
#: templates/js/order.js:205 templates/js/order.js:308
@@ -2604,33 +2479,29 @@ msgstr "Positionen"
#: order/templates/order/order_wizard/select_pos.html:32
msgid "Select Purchase Order"
-msgstr "EK-Bestellung auswählen"
+msgstr "Bestellung auswählen"
#: order/templates/order/order_wizard/select_pos.html:68
msgid "Select a purchase order for"
-msgstr "EK-Bestellung auswählen für"
+msgstr "Bestellung auswählen für"
#: order/templates/order/po_attachments.html:12
#: order/templates/order/po_navbar.html:23
msgid "Purchase Order Attachments"
-msgstr "Bestellanhänge"
+msgstr "Bestellungs-Anhänge"
#: order/templates/order/po_navbar.html:17
-#, fuzzy
-#| msgid "Receive line item"
msgid "Received Stock Items"
-msgstr "Position empfangen"
+msgstr "BestandsObjekte empfangen"
#: order/templates/order/po_navbar.html:20
#: order/templates/order/po_received_items.html:12
-#, fuzzy
-#| msgid "Receive line item"
msgid "Received Items"
-msgstr "Position empfangen"
+msgstr "Empfangene Teile"
#: order/templates/order/purchase_order_detail.html:14
msgid "Purchase Order Items"
-msgstr "Bestellpositionen"
+msgstr "Bestellungs-Positionen"
#: order/templates/order/purchase_order_detail.html:24
#: order/templates/order/sales_order_detail.html:22 order/views.py:1105
@@ -2643,7 +2514,7 @@ msgstr "Position hinzufügen"
#: part/templates/part/category.html:197 part/templates/part/category.html:239
#: templates/js/stock.js:704 templates/js/stock.js:1088
msgid "New Location"
-msgstr "Neuer Standort"
+msgstr "Neuer Lagerort"
#: order/templates/order/purchase_order_detail.html:46
#: order/templates/order/purchase_order_detail.html:126
@@ -2656,10 +2527,8 @@ msgid "No line items found"
msgstr "Keine Positionen gefunden"
#: order/templates/order/purchase_order_detail.html:198
-#, fuzzy
-#| msgid "Price"
msgid "Unit Price"
-msgstr "Preis"
+msgstr "Stück-Preis"
#: order/templates/order/purchase_order_detail.html:239
#: order/templates/order/sales_order_detail.html:289
@@ -2674,13 +2543,18 @@ msgstr "Position löschen"
msgid "Receive line item"
msgstr "Position empfangen"
+#: order/templates/order/purchase_orders.html:24
+#: order/templates/order/sales_orders.html:24
+msgid "Print Order Reports"
+msgstr "Berichte drucken"
+
#: order/templates/order/receive_parts.html:8
msgid "Receive outstanding parts for"
-msgstr ""
+msgstr "Empfange ausstehende Teile für"
#: order/templates/order/receive_parts.html:15
msgid "Select parts to receive against this order"
-msgstr ""
+msgstr "Teile, die für diese Bestellung empfangen werden sollen, auswählen"
#: order/templates/order/receive_parts.html:20
msgid "Order Code"
@@ -2692,29 +2566,27 @@ msgid "On Order"
msgstr "bestellt"
#: order/templates/order/receive_parts.html:23
-#, fuzzy
-#| msgid "Received"
msgid "Receive"
msgstr "Empfangen"
#: order/templates/order/receive_parts.html:36
msgid "Error: Referenced part has been removed"
-msgstr ""
+msgstr "Fehler: verknüpftes Teil wurde gelöscht"
#: order/templates/order/sales_order_base.html:15
msgid "This SalesOrder has not been fully allocated"
msgstr "Dieser Auftrag ist nicht vollständig zugeordnet"
-#: order/templates/order/sales_order_base.html:61
+#: order/templates/order/sales_order_base.html:64
msgid "Packing List"
msgstr "Packliste"
-#: order/templates/order/sales_order_base.html:69
+#: order/templates/order/sales_order_base.html:72
#: order/templates/order/so_navbar.html:12
msgid "Sales Order Details"
msgstr "Auftragsdetails"
-#: order/templates/order/sales_order_base.html:95 templates/js/order.js:275
+#: order/templates/order/sales_order_base.html:98 templates/js/order.js:275
msgid "Customer Reference"
msgstr "Kundenreferenz"
@@ -2727,7 +2599,7 @@ msgstr "Warnung"
#: order/templates/order/sales_order_detail.html:13
msgid "Sales Order Items"
-msgstr "Auftragspositionen"
+msgstr "Auftrags-Positionen"
#: order/templates/order/sales_order_detail.html:75
#: order/templates/order/sales_order_detail.html:157
@@ -2740,12 +2612,12 @@ msgstr "Seriennummer"
#: order/templates/order/sales_order_detail.html:99 templates/js/build.js:459
#: templates/js/build.js:789
msgid "Edit stock allocation"
-msgstr "Lagerobjekt-Standort bearbeiten"
+msgstr "Bestands-Zuordnung bearbeiten"
#: order/templates/order/sales_order_detail.html:100 templates/js/build.js:461
#: templates/js/build.js:790
msgid "Delete stock allocation"
-msgstr "Zuweisung löschen"
+msgstr "Bestands-Zuordnung löschen"
#: order/templates/order/sales_order_detail.html:229 templates/js/build.js:523
#: templates/js/build.js:785
@@ -2773,10 +2645,8 @@ msgid "Delete line item "
msgstr "Position löschen "
#: order/templates/order/sales_order_notes.html:14
-#, fuzzy
-#| msgid "Sales Order Items"
msgid "Sales Order Notes"
-msgstr "Auftragspositionen"
+msgstr "Auftrags-Positionen"
#: order/templates/order/sales_order_ship.html:10
msgid ""
@@ -2806,12 +2676,12 @@ msgstr ""
#: order/templates/order/so_allocation_delete.html:7
msgid "This action will unallocate the following stock from the Sales Order"
-msgstr "Diese Aktion wird die folgenden Lagerobjekte vom VK-Auftrag entfernen"
+msgstr "Diese Aktion wird die folgenden BestandsObjekt vom Auftrag entfernen"
#: order/templates/order/so_attachments.html:12
#: order/templates/order/so_navbar.html:26
msgid "Sales Order Attachments"
-msgstr "VK-Auftragsanhänge"
+msgstr "Auftrags-Anhänge"
#: order/templates/order/so_lineitem_delete.html:5
msgid "Are you sure you wish to delete this line item?"
@@ -2819,27 +2689,27 @@ msgstr "Sind Sie sicher, dass Sie diese Position löschen möchten?"
#: order/views.py:96
msgid "Add Purchase Order Attachment"
-msgstr "EK-Bestellung Anhang hinzufügen"
+msgstr "Bestellungs-Anhang hinzufügen"
#: order/views.py:146
msgid "Add Sales Order Attachment"
-msgstr "VK-Auftrag Anhang hinzufügen"
+msgstr "Auftrags-Anhang hinzufügen"
#: order/views.py:303
msgid "Create Purchase Order"
-msgstr "EK-Bestellung anlegen"
+msgstr "Bestellung anlegen"
#: order/views.py:338
msgid "Create Sales Order"
-msgstr "VK-Auftrag anlegen"
+msgstr "Auftrag anlegen"
#: order/views.py:373
msgid "Edit Purchase Order"
-msgstr "EK-Bestellung bearbeiten"
+msgstr "Bestellung bearbeiten"
#: order/views.py:393
msgid "Edit Sales Order"
-msgstr "VK-Auftrag bearbeiten"
+msgstr "Auftrag bearbeiten"
#: order/views.py:409
msgid "Cancel Order"
@@ -2855,7 +2725,7 @@ msgstr "Bestellung kann nicht verworfen werden"
#: order/views.py:435
msgid "Cancel sales order"
-msgstr "VK-Auftrag stornieren"
+msgstr "Auftrag stornieren"
#: order/views.py:461
msgid "Issue Order"
@@ -2866,24 +2736,18 @@ msgid "Confirm order placement"
msgstr "Bestellungstätigung bestätigen"
#: order/views.py:480
-#, fuzzy
-#| msgid "Purchase Order Details"
msgid "Purchase order issued"
-msgstr "Bestelldetails"
+msgstr "Bestellung erstellt"
#: order/views.py:491
msgid "Complete Order"
msgstr "Auftrag fertigstellen"
#: order/views.py:507
-#, fuzzy
-#| msgid "Confirm build completion"
msgid "Confirm order completion"
-msgstr "Bau-Fertigstellung bestätigen"
+msgstr "Fertigstellung bestätigen"
#: order/views.py:518
-#, fuzzy
-#| msgid "Mark order as complete"
msgid "Purchase order completed"
msgstr "Bestellung als vollständig markieren"
@@ -2924,14 +2788,12 @@ msgid "No lines specified"
msgstr "Keine Zeilen angegeben"
#: order/views.py:1114
-#, fuzzy
-#| msgid "Supplier part description"
msgid "Supplier part must be specified"
-msgstr "Zuliefererbeschreibung des Teils"
+msgstr "Zulieferer-Teil muss ausgewählt werden"
#: order/views.py:1120
msgid "Supplier must match for Part and Order"
-msgstr "Zulieferer muss zum Teil und zur EK-Bestellung passen"
+msgstr "Zulieferer muss zu Teil und Bestellung passen"
#: order/views.py:1239 order/views.py:1257
msgid "Edit Line Item"
@@ -2966,170 +2828,143 @@ msgstr "Standard-Lagerort"
msgid "Available Stock"
msgstr "Verfügbarer Lagerbestand"
-#: part/bom.py:274
+#: part/bom.py:278
#, python-brace-format
msgid "Unsupported file format: {f}"
msgstr "Nicht unterstütztes Dateiformat: {f}"
-#: part/bom.py:279
+#: part/bom.py:283
msgid "Error reading BOM file (invalid data)"
msgstr "Fehler beim Lesen der Stückliste (ungültige Daten)"
-#: part/bom.py:281
+#: part/bom.py:285
msgid "Error reading BOM file (incorrect row size)"
msgstr "Fehler beim Lesen der Stückliste (ungültige Zeilengröße)"
-#: part/forms.py:71 stock/forms.py:264
+#: part/forms.py:89 stock/forms.py:264
msgid "File Format"
msgstr "Dateiformat"
-#: part/forms.py:71 stock/forms.py:264
+#: part/forms.py:89 stock/forms.py:264
msgid "Select output file format"
msgstr "Ausgabe-Dateiformat auswählen"
-#: part/forms.py:73
+#: part/forms.py:91
msgid "Cascading"
msgstr "Kaskadierend"
-#: part/forms.py:73
+#: part/forms.py:91
msgid "Download cascading / multi-level BOM"
msgstr "Kaskadierende Stückliste herunterladen"
-#: part/forms.py:75
+#: part/forms.py:93
msgid "Levels"
-msgstr ""
+msgstr "Ebenen"
-#: part/forms.py:75
+#: part/forms.py:93
msgid "Select maximum number of BOM levels to export (0 = all levels)"
msgstr ""
+"Maximale Anzahl an Ebenen für Stückliste-Export auswählen (0 = alle Ebenen)"
-#: part/forms.py:77
-#, fuzzy
-#| msgid "New Parameter"
+#: part/forms.py:95
msgid "Include Parameter Data"
-msgstr "Neuer Parameter"
+msgstr "Parameter-Daten einschließen"
-#: part/forms.py:77
+#: part/forms.py:95
msgid "Include part parameters data in exported BOM"
-msgstr ""
+msgstr "Teil-Parameter in Stückliste-Export einschließen"
-#: part/forms.py:79
-#, fuzzy
-#| msgid "Include stock in sublocations"
+#: part/forms.py:97
msgid "Include Stock Data"
-msgstr "Bestand in Unterlagerorten einschließen"
+msgstr "Bestand einschließen"
-#: part/forms.py:79
-#, fuzzy
-#| msgid "Include parts in subcategories"
+#: part/forms.py:97
msgid "Include part stock data in exported BOM"
-msgstr "Teile in Unterkategorien einschließen"
+msgstr "Teil-Bestand in Stückliste-Export einschließen"
-#: part/forms.py:81
-#, fuzzy
-#| msgid "New Supplier Part"
+#: part/forms.py:99
msgid "Include Supplier Data"
-msgstr "Neues Zulieferer-Teil"
+msgstr "Zulieferer einschließen"
-#: part/forms.py:81
+#: part/forms.py:99
msgid "Include part supplier data in exported BOM"
-msgstr ""
+msgstr "Zulieferer-Daten in Stückliste-Export einschließen"
-#: part/forms.py:102 part/models.py:2053
+#: part/forms.py:120 part/models.py:2053
msgid "Parent Part"
msgstr "Ausgangsteil"
-#: part/forms.py:103 part/templates/part/bom_duplicate.html:7
-#, fuzzy
-#| msgid "Select parent part"
+#: part/forms.py:121 part/templates/part/bom_duplicate.html:7
msgid "Select parent part to copy BOM from"
-msgstr "Ausgangsteil auswählen"
+msgstr "Teil für Stücklisten-Kopie auswählen"
-#: part/forms.py:109
-#, fuzzy
-#| msgid "Select from existing images"
+#: part/forms.py:127
msgid "Clear existing BOM items"
-msgstr "Aus vorhandenen Bildern auswählen"
-
-#: part/forms.py:114
-#, fuzzy
-#| msgid "Confim BOM item deletion"
-msgid "Confirm BOM duplication"
-msgstr "Löschung von BOM-Position bestätigen"
+msgstr "Stücklisten-Position(en) löschen"
#: part/forms.py:132
+msgid "Confirm BOM duplication"
+msgstr "Kopie von Stückliste bestätigen"
+
+#: part/forms.py:150
msgid "Confirm that the BOM is correct"
msgstr "Bestätigen, dass die Stückliste korrekt ist"
-#: part/forms.py:144
+#: part/forms.py:162
msgid "Select BOM file to upload"
msgstr "Stücklisten-Datei zum Upload auswählen"
-#: part/forms.py:163
+#: part/forms.py:181
msgid "Related Part"
msgstr "verknüpftes Teil"
-#: part/forms.py:182
+#: part/forms.py:200
msgid "Select part category"
msgstr "Teilekategorie wählen"
-#: part/forms.py:199
-#, fuzzy
-#| msgid "Perform 'deep copy' which will duplicate all BOM data for this part"
+#: part/forms.py:217
msgid "Duplicate all BOM data for this part"
-msgstr ""
-"Tiefe Kopie ausführen. Dies wird alle Daten der Stückliste für dieses Teil "
-"duplizieren"
+msgstr "Stückliste für dieses Teil kopieren"
-#: part/forms.py:200
+#: part/forms.py:218
msgid "Copy BOM"
-msgstr "BOM kopieren"
+msgstr "Stückliste kopieren"
-#: part/forms.py:205
+#: part/forms.py:223
msgid "Duplicate all parameter data for this part"
-msgstr ""
+msgstr "Alle Parameter-Daten für dieses Teil kopieren"
-#: part/forms.py:206
-#, fuzzy
-#| msgid "Parameters"
+#: part/forms.py:224
msgid "Copy Parameters"
-msgstr "Parameter"
+msgstr "Parameter kopieren"
-#: part/forms.py:211
+#: part/forms.py:229
msgid "Confirm part creation"
msgstr "Erstellen des Teils bestätigen"
-#: part/forms.py:216
-#, fuzzy
-#| msgid "No part parameter templates found"
+#: part/forms.py:234
msgid "Include category parameter templates"
-msgstr "Keine Teilparametervorlagen gefunden"
+msgstr "Kategorie Parameter-Vorlage einschließen"
-#: part/forms.py:221
-#, fuzzy
-#| msgid "No part parameter templates found"
+#: part/forms.py:239
msgid "Include parent categories parameter templates"
-msgstr "Keine Teilparametervorlagen gefunden"
+msgstr "Über-Kategorie Parameter-Vorlage einschließen"
-#: part/forms.py:301
-#, fuzzy
-#| msgid "Parameter template name must be unique"
+#: part/forms.py:319
msgid "Add parameter template to same level categories"
-msgstr "Vorlagen-Name des Parameters muss eindeutig sein"
+msgstr "Parameter-Vorlage zu Kategorien dieser Ebene hinzufügen"
-#: part/forms.py:305
-#, fuzzy
-#| msgid "Parameter template name must be unique"
+#: part/forms.py:323
msgid "Add parameter template to all categories"
-msgstr "Vorlagen-Name des Parameters muss eindeutig sein"
+msgstr "Parameter-Vorlage zu allen Kategorien hinzufügen"
-#: part/forms.py:350
+#: part/forms.py:368
msgid "Input quantity for price calculation"
msgstr "Eintragsmenge zur Preisberechnung"
#: part/models.py:72
msgid "Default location for parts in this category"
-msgstr "Standard-Standort für Teile dieser Kategorie"
+msgstr "Standard-Lagerort für Teile dieser Kategorie"
#: part/models.py:75
msgid "Default keywords for parts in this category"
@@ -3153,24 +2988,20 @@ 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:554
-#, fuzzy
-#| msgid "No serial numbers found"
msgid "Next available serial numbers are"
-msgstr "Keine Seriennummern gefunden"
+msgstr "Nächste verfügbare Seriennummern wären"
#: part/models.py:558
msgid "Next available serial number is"
-msgstr "Nächste Seriennummer ist"
+msgstr "Nächste verfügbare Seriennummer ist"
#: part/models.py:563
-#, fuzzy
-#| msgid "Empty serial number string"
msgid "Most recent serial number is"
-msgstr "Keine Seriennummer angegeben"
+msgstr "Die neuste Seriennummer ist"
#: part/models.py:642
msgid "Duplicate IPN not allowed in part settings"
-msgstr ""
+msgstr "Doppelte IPN in den Teil-Einstellungen nicht erlaubt"
#: part/models.py:653
msgid "Part must be unique for name, IPN and revision"
@@ -3231,7 +3062,7 @@ msgstr "Interne Teilenummer"
msgid "Part revision or version number"
msgstr "Revisions- oder Versionsnummer"
-#: part/models.py:737 part/templates/part/detail.html:35 report/models.py:181
+#: part/models.py:737 part/templates/part/detail.html:35 report/models.py:198
#: templates/js/part.js:164
msgid "Revision"
msgstr "Revision"
@@ -3242,15 +3073,15 @@ msgstr "Wo wird dieses Teil normalerweise gelagert?"
#: part/models.py:805 part/templates/part/detail.html:97
msgid "Default Supplier"
-msgstr "Standard-Zulieferer"
+msgstr "Standard Zulieferer"
#: part/models.py:806
msgid "Default supplier part"
-msgstr "Standard-Zulieferer"
+msgstr "Standard Zulieferer-Teil"
#: part/models.py:813
msgid "Default Expiry"
-msgstr "Standard-Ablaufzeit"
+msgstr "Standard Ablaufzeit"
#: part/models.py:814
msgid "Expiry time (in days) for stock items of this part"
@@ -3295,7 +3126,7 @@ msgstr "Kann dieses Teil an Kunden verkauft werden?"
#: part/models.py:859 part/templates/part/detail.html:227
#: templates/js/table_filters.js:20 templates/js/table_filters.js:60
-#: templates/js/table_filters.js:209 templates/js/table_filters.js:278
+#: templates/js/table_filters.js:214 templates/js/table_filters.js:283
msgid "Active"
msgstr "Aktiv"
@@ -3316,61 +3147,46 @@ msgid "Stored BOM checksum"
msgstr "Prüfsumme der Stückliste gespeichert"
#: part/models.py:1926
-#, 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"
+msgstr "Test-Vorlagen können nur für verfolgbare Teile angelegt werden"
#: part/models.py:1943
-#, fuzzy
-#| msgid ""
-#| "A stock item with this serial number already exists for template part "
-#| "{part}"
msgid "Test with this name already exists for this part"
-msgstr ""
-"Ein Teil mit dieser Seriennummer existiert bereits für die Teilevorlage "
-"{part}"
+msgstr "Ein Test mit diesem Namen besteht bereits für dieses Teil"
#: part/models.py:1962 templates/js/part.js:561 templates/js/stock.js:104
-#, fuzzy
-#| msgid "Instance Name"
msgid "Test Name"
-msgstr "Instanzname"
+msgstr "Test-Name"
#: part/models.py:1963
-#, fuzzy
-#| msgid "Serial number for this item"
msgid "Enter a name for the test"
-msgstr "Seriennummer für dieses Teil"
+msgstr "Namen für diesen Test eingeben"
#: part/models.py:1968
-#, fuzzy
-#| msgid "Description"
msgid "Test Description"
-msgstr "Beschreibung"
+msgstr "Test-Beschreibung"
#: part/models.py:1969
-#, fuzzy
-#| msgid "Brief description of the build"
msgid "Enter description for this test"
-msgstr "Kurze Beschreibung des Baus"
+msgstr "Beschreibung für diesen Test eingeben"
#: part/models.py:1974 templates/js/part.js:570
-#: templates/js/table_filters.js:195
+#: templates/js/table_filters.js:200
msgid "Required"
msgstr "benötigt"
#: part/models.py:1975
msgid "Is this test required to pass?"
-msgstr ""
+msgstr "Muss dieser Test erfolgreich sein?"
#: part/models.py:1980 templates/js/part.js:578
msgid "Requires Value"
-msgstr "ein Wert mus angegeben werden"
+msgstr "verpflichtender Wert"
#: part/models.py:1981
msgid "Does this test require a value when adding a test result?"
msgstr ""
+"Muss für diesen Test ein Wert für das Test-Ergebnis eingetragen werden?"
#: part/models.py:1986 templates/js/part.js:585
msgid "Requires Attachment"
@@ -3379,6 +3195,7 @@ msgstr "Anhang muss eingegeben werden"
#: part/models.py:1987
msgid "Does this test require a file attachment when adding a test result?"
msgstr ""
+"Muss für diesen Test ein Anhang für das Test-Ergebnis hinzugefügt werden?"
#: part/models.py:2020
msgid "Parameter template name must be unique"
@@ -3402,10 +3219,8 @@ msgid "Parameter Value"
msgstr "Parameter Wert"
#: part/models.py:2107
-#, fuzzy
-#| msgid "Parameter Value"
msgid "Default Parameter Value"
-msgstr "Parameter Wert"
+msgstr "Standard Parameter Wert"
#: part/models.py:2135
msgid "Select parent part"
@@ -3420,10 +3235,8 @@ msgid "BOM quantity for this BOM item"
msgstr "Stücklisten-Anzahl für dieses Stücklisten-Teil"
#: part/models.py:2151
-#, fuzzy
-#| msgid "Confim BOM item deletion"
msgid "This BOM item is optional"
-msgstr "Löschung von BOM-Position bestätigen"
+msgstr "Diese Stücklisten-Position ist optional"
#: part/models.py:2154
msgid "Estimated build wastage quantity (absolute or percentage)"
@@ -3431,11 +3244,11 @@ msgstr "Geschätzter Ausschuss (absolut oder prozentual)"
#: part/models.py:2157
msgid "BOM item reference"
-msgstr "Referenz des Objekts auf der Stückliste"
+msgstr "Referenz der Postion auf der Stückliste"
#: part/models.py:2160
msgid "BOM item notes"
-msgstr "Notizen zum Stücklisten-Objekt"
+msgstr "Notizen zur Stücklisten-Position"
#: part/models.py:2162
msgid "BOM line checksum"
@@ -3444,28 +3257,25 @@ msgstr "Prüfsumme der Stückliste"
#: part/models.py:2166 templates/js/bom.js:275 templates/js/bom.js:282
#: templates/js/table_filters.js:50
msgid "Inherited"
-msgstr ""
+msgstr "Geerbt"
#: part/models.py:2167
msgid "This BOM item is inherited by BOMs for variant parts"
msgstr ""
+"Diese Stücklisten-Position wird in dei Stücklisten von Teil-Varianten vererbt"
-#: part/models.py:2243 part/views.py:1485 part/views.py:1537
+#: part/models.py:2243 part/views.py:1592 part/views.py:1644
#: stock/models.py:259
-#, 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"
+msgstr "Menge muss eine Ganzzahl sein"
#: part/models.py:2252 part/models.py:2254
-#, fuzzy
-#| msgid "Supplier part description"
msgid "Sub part must be specified"
-msgstr "Zuliefererbeschreibung des Teils"
+msgstr "Zulieferer-Teil muss festgelegt sein"
#: part/models.py:2257
msgid "BOM Item"
-msgstr "Stücklistenposition"
+msgstr "Stücklisten-Position"
#: part/models.py:2378
msgid "Select Related Part"
@@ -3476,10 +3286,12 @@ msgid ""
"Error creating relationship: check that the part is not related to itself "
"and that the relationship is unique"
msgstr ""
+"Fehler bei Verwandschaft: Ist das Teil mit sich selbst verwandt oder ist das "
+"die Verwandtschaft nicht eindeutig?"
#: part/templates/part/allocation.html:11
msgid "Part Stock Allocations"
-msgstr "Teilbestandszuordnungen"
+msgstr "Teil-Bestandszuordnungen"
#: part/templates/part/allocation.html:17
#: part/templates/part/allocation.html:45
@@ -3496,7 +3308,7 @@ msgstr "Bestellung"
#: stock/templates/stock/stock_adjust.html:16 templates/js/build.js:771
#: templates/js/stock.js:923 templates/js/stock.js:1181
msgid "Stock Item"
-msgstr "Lagerobjekt"
+msgstr "BestandsObjekt"
#: part/templates/part/attachments.html:10
msgid "Part Attachments"
@@ -3504,11 +3316,13 @@ msgstr "Anhänge"
#: part/templates/part/bom-delete.html:6
msgid "Are you sure you want to delete this BOM item?"
-msgstr "Sind Sie sicher, dass Sie diese Stücklistenposition löschen wollen?"
+msgstr "Sind Sie sicher, dass Sie diese Stücklisten-Position löschen wollen?"
#: part/templates/part/bom-delete.html:8
msgid "Deleting this entry will remove the BOM row from the following part"
msgstr ""
+"Die Löschung dieses Eintrags wird das Stücklisten-Position vom folgenden "
+"Teil entfernen"
#: part/templates/part/bom.html:10 part/templates/part/navbar.html:48
#: part/templates/part/navbar.html:51
@@ -3529,7 +3343,7 @@ msgstr "Stückliste von übergeordnetem Teil kopieren"
#: part/templates/part/bom.html:43
msgid "New BOM Item"
-msgstr "Neue Stücklistenposition"
+msgstr "Neue Stücklisten-Position"
#: part/templates/part/bom.html:46
msgid "Finish Editing"
@@ -3543,23 +3357,23 @@ msgstr "Stückliste bearbeiten"
msgid "Validate Bill of Materials"
msgstr "Stückliste validieren"
-#: part/templates/part/bom.html:61 part/views.py:1776
+#: part/templates/part/bom.html:61 part/views.py:1883
msgid "Export Bill of Materials"
msgstr "Stückliste exportieren"
#: part/templates/part/bom.html:64
msgid "Print BOM Report"
-msgstr "BOM Report drucken"
+msgstr "Stücklisten-Bericht drucken"
#: part/templates/part/bom.html:109
msgid "Delete selected BOM items?"
-msgstr "Ausgewählte Stücklistenpositionen löschen"
+msgstr "Ausgewählte Stücklistenpositionen löschen?"
#: part/templates/part/bom.html:110
msgid "All selected BOM items will be deleted"
msgstr "Alle ausgewählte Stücklistenpositionen werden gelöscht"
-#: part/templates/part/bom.html:160 part/views.py:579
+#: part/templates/part/bom.html:160 part/views.py:584
#: templates/js/stock.js:1077
msgid "Create New Part"
msgstr "Neues Teil anlegen"
@@ -3580,7 +3394,7 @@ msgstr "Schritt 2 - Felder auswählen"
#: part/templates/part/bom_upload/select_fields.html:21
msgid "Missing selections for the following required columns"
-msgstr ""
+msgstr "Es fehlt eine Auswahl für die folgende benötigte Spalte"
#: part/templates/part/bom_upload/select_fields.html:32
msgid "Submit Selections"
@@ -3588,17 +3402,15 @@ msgstr "Auswahl übertragen"
#: part/templates/part/bom_upload/select_fields.html:41
msgid "File Fields"
-msgstr ""
+msgstr "Datei-Felder"
#: part/templates/part/bom_upload/select_fields.html:58
msgid "Match Fields"
-msgstr ""
+msgstr "Übereinstimmende Felder"
#: part/templates/part/bom_upload/select_fields.html:68
-#, fuzzy
-#| msgid "Duplicate part selected"
msgid "Duplicate column selection"
-msgstr "Teil doppelt ausgewählt"
+msgstr "Spalte doppelt ausgewählt"
#: part/templates/part/bom_upload/select_parts.html:16
msgid "Step 3 - Select Parts"
@@ -3632,16 +3444,16 @@ msgstr "Neues Teil anlegen"
#: part/templates/part/bom_upload/upload_file.html:16
msgid "Step 1 - Select BOM File"
-msgstr "Schritt 1 - Stückliste auswählen"
+msgstr "Schritt 1 - Stückliste-Datei auswählen"
#: part/templates/part/bom_upload/upload_file.html:19
msgid "Requirements for BOM upload"
-msgstr ""
+msgstr "Anforderungen für Stückliste-Datei"
#: part/templates/part/bom_upload/upload_file.html:21
msgid ""
"The BOM file must contain the required named columns as provided in the "
-msgstr ""
+msgstr "Die Stückliste-Datei muss die aufgeführten Spalten enthalten; siehe"
#: part/templates/part/bom_upload/upload_file.html:21
msgid "BOM Upload Template"
@@ -3649,7 +3461,7 @@ msgstr "Vorlage für Stückliste"
#: part/templates/part/bom_upload/upload_file.html:22
msgid "Each part must already exist in the database"
-msgstr ""
+msgstr "Jedes Teil muss bereits in der Datenbank bestehen"
#: part/templates/part/build.html:10
msgid "Part Builds"
@@ -3663,7 +3475,7 @@ msgstr "Neuen Bau beginnen"
msgid "All parts"
msgstr "Alle Teile"
-#: part/templates/part/category.html:25 part/views.py:2157
+#: part/templates/part/category.html:25 part/views.py:2264
msgid "Create new part category"
msgstr "Teilkategorie anlegen"
@@ -3713,7 +3525,7 @@ msgstr "Exportieren"
#: part/templates/part/category.html:198 templates/js/stock.js:705
msgid "Create new location"
-msgstr "Neuen Standort anlegen"
+msgstr "Neuen Lagerort anlegen"
#: part/templates/part/category.html:203 part/templates/part/category.html:233
msgid "New Category"
@@ -3721,17 +3533,15 @@ msgstr "Neue Kategorie"
#: part/templates/part/category.html:204
msgid "Create new category"
-msgstr "Teilkategorie anlegen"
+msgstr "Teil-Kategorie anlegen"
#: part/templates/part/category.html:234
-#, fuzzy
-#| msgid "Create new part category"
msgid "Create new Part Category"
-msgstr "Teilkategorie anlegen"
+msgstr "Neue Teil-Kategorie anlegen"
#: part/templates/part/category.html:240 stock/views.py:1358
msgid "Create new Stock Location"
-msgstr "Neuen Lager-Standort erstellen"
+msgstr "Neuen Lagerort erstellen"
#: part/templates/part/category_delete.html:5
msgid "Are you sure you want to delete category"
@@ -3739,14 +3549,10 @@ msgstr "Sind Sie sicher, dass Sie diese Kategorie löschen wollen"
#: part/templates/part/category_delete.html:8
#: part/templates/part/category_delete.html:25
-#, fuzzy
-#| msgid "Category Details"
msgid "This category contains"
msgstr "Kategorie enthält"
#: part/templates/part/category_delete.html:8
-#, fuzzy
-#| msgid "Part Categories"
msgid "child categories"
msgstr "Unter-Kategorien"
@@ -3757,8 +3563,6 @@ msgstr ""
"Wenn diese Kategorie gelöscht wird, werden alle Unter-Kat. verschoben nach"
#: part/templates/part/category_delete.html:11
-#, fuzzy
-#| msgid "Category"
msgid "category"
msgstr "Kategorie"
@@ -3767,29 +3571,23 @@ msgid "top level Parts category"
msgstr "oberste Teilekategorie"
#: part/templates/part/category_delete.html:25
-#, fuzzy
-#| msgid "Parts"
msgid "parts"
msgstr "Teile"
#: part/templates/part/category_delete.html:27
-#, fuzzy
-#| msgid ""
-#| "If this category is deleted, these child categories will be moved to the"
msgid ""
"If this category is deleted, these parts will be moved to the parent category"
msgstr ""
-"Wenn diese Kategorie gelöscht wird, werden alle Unter-Kat. verschoben nach"
+"Wenn diese Kat. gelöscht wird, werden diese Teile in die übergeordnete Kat. "
+"verschoben"
#: part/templates/part/category_delete.html:29
-#, fuzzy
-#| msgid ""
-#| "If this category is deleted, these child categories will be moved to the"
msgid ""
"If this category is deleted, these parts will be moved to the top-level "
"category Teile"
msgstr ""
-"Wenn diese Kategorie gelöscht wird, werden alle Unter-Kat. verschoben nach"
+"Wenn diese Kat. gelöscht wird, werden diese Teile in die oberste Kat. "
+"verschoben"
#: part/templates/part/category_navbar.html:18
#: part/templates/part/category_navbar.html:21
@@ -3802,13 +3600,13 @@ msgstr "Parameter"
msgid "Part Parameters"
msgstr "Teilparameter"
-#: part/templates/part/copy_part.html:9 part/views.py:455
+#: part/templates/part/copy_part.html:9 part/views.py:460
msgid "Duplicate Part"
msgstr "Teil duplizieren"
#: part/templates/part/copy_part.html:10
msgid "Make a copy of part"
-msgstr ""
+msgstr "Eine Kopie des Teils erstellen"
#: part/templates/part/copy_part.html:14
#: part/templates/part/create_part.html:11
@@ -3821,10 +3619,8 @@ msgid "The new part may be a duplicate of these existing parts"
msgstr "Teil evtl. Duplikat dieser Teile"
#: part/templates/part/create_part.html:16
-#, fuzzy
-#| msgid "Batch"
msgid "match"
-msgstr "Los"
+msgstr "entspricht"
#: part/templates/part/detail.html:11 part/templates/part/navbar.html:11
msgid "Part Details"
@@ -3839,10 +3635,8 @@ msgid "No serial numbers recorded"
msgstr "Keine Seriennummern gefunden"
#: part/templates/part/detail.html:120
-#, fuzzy
-#| msgid "Stock Export Options"
msgid "Stock Expiry Time"
-msgstr "Lagerbestandsexportoptionen"
+msgstr "Bestands-Ablauf Zeit"
#: part/templates/part/detail.html:126 templates/js/order.js:293
msgid "Creation Date"
@@ -3869,10 +3663,8 @@ msgid "Part is a template part (variants can be made from this part)"
msgstr "Teil ist Vorlage (Varianten können von diesem Teil erstellt werden)"
#: part/templates/part/detail.html:165
-#, fuzzy
-#| msgid "Part is not a virtual part"
msgid "Part is not a template part"
-msgstr "Teil ist nicht virtuell"
+msgstr "Teil ist kein Vorlage-Teil"
#: part/templates/part/detail.html:173
msgid "Part can be assembled from other parts"
@@ -3892,11 +3684,11 @@ msgstr "Teil kann nicht in Baugruppen benutzt werden"
#: part/templates/part/detail.html:193
msgid "Part stock is tracked by serial number"
-msgstr "Teilebestand in der Seriennummer hinterlegt"
+msgstr "Teilebestand wird per Seriennummer verfolgt"
#: part/templates/part/detail.html:195
msgid "Part stock is not tracked by serial number"
-msgstr "Teilebestand ist nicht in der Seriennummer hinterlegt"
+msgstr "Teilebestand wird nicht per Seriennummer verfolgt"
#: part/templates/part/detail.html:203 part/templates/part/detail.html:205
msgid "Part can be purchased from external suppliers"
@@ -3915,16 +3707,12 @@ msgid "Part is active"
msgstr "Teil ist aktiv"
#: part/templates/part/detail.html:232
-#, fuzzy
-#| msgid "This part is not active"
msgid "Part is not active"
-msgstr "Dieses Teil ist nicht aktiv"
+msgstr "Teil ist nicht aktiv"
#: part/templates/part/navbar.html:26 part/templates/part/variants.html:11
-#, fuzzy
-#| msgid "Variants"
msgid "Part Variants"
-msgstr "Varianten"
+msgstr "Teil Varianten"
#: part/templates/part/navbar.html:29
msgid "Variants"
@@ -3951,10 +3739,8 @@ msgid "Sale Price"
msgstr "VK-Preis"
#: part/templates/part/navbar.html:100 part/templates/part/part_tests.html:10
-#, fuzzy
-#| msgid "Parameter Template"
msgid "Part Test Templates"
-msgstr "Parameter Vorlage"
+msgstr "Teil Test-Vorlagen"
#: part/templates/part/navbar.html:103 stock/templates/stock/item_base.html:376
msgid "Tests"
@@ -3975,7 +3761,7 @@ msgstr "Parameter hinzufügen"
#: part/templates/part/params.html:18
#: templates/InvenTree/settings/category.html:29
-#: templates/InvenTree/settings/part.html:43
+#: templates/InvenTree/settings/part.html:44
msgid "New Parameter"
msgstr "Neuer Parameter"
@@ -3991,7 +3777,7 @@ msgid "Edit"
msgstr "Bearbeiten"
#: part/templates/part/params.html:44 part/templates/part/related.html:44
-#: part/templates/part/supplier.html:22 users/models.py:168
+#: part/templates/part/supplier.html:22 users/models.py:170
msgid "Delete"
msgstr "Löschen"
@@ -4054,7 +3840,7 @@ msgstr "Teil bearbeiten"
msgid "Delete part"
msgstr "Teil löschen"
-#: part/templates/part/part_base.html:122 templates/js/table_filters.js:129
+#: part/templates/part/part_base.html:122 templates/js/table_filters.js:134
msgid "In Stock"
msgstr "Auf Lager"
@@ -4064,7 +3850,7 @@ msgstr "Für Bauaufträge benötigt"
#: part/templates/part/part_base.html:142
msgid "Required for Sales Orders"
-msgstr "Bneötigt für VK-Aufträge"
+msgstr "Benötigt für Aufträge"
#: part/templates/part/part_base.html:149
msgid "Allocated to Orders"
@@ -4082,14 +3868,10 @@ msgstr "Im Bau"
msgid "Add Test Template"
msgstr "Test Vorlage hinzufügen"
-#: part/templates/part/part_thumb.html:16
+#: part/templates/part/part_thumb.html:20
msgid "Select from existing images"
msgstr "Aus vorhandenen Bildern auswählen"
-#: part/templates/part/part_thumb.html:17
-msgid "Upload new image"
-msgstr "Neues Bild hochladen"
-
#: part/templates/part/related.html:18
msgid "Add Related"
msgstr "Zugehöriges Teil hinzufügen"
@@ -4100,7 +3882,7 @@ msgstr "VK-Preis Informationen"
#: part/templates/part/sales_orders.html:18
msgid "New sales order"
-msgstr "Neuer VK-Auftrag"
+msgstr "Neuer Auftrag"
#: part/templates/part/sales_orders.html:18
msgid "New Order"
@@ -4175,290 +3957,299 @@ msgstr "Neue Variante anlegen"
msgid "New Variant"
msgstr "neue Variante anlegen"
-#: part/views.py:84
+#: part/views.py:89
msgid "Add Related Part"
msgstr "zugeordnetes Teil hinzufügen"
-#: part/views.py:139
+#: part/views.py:144
msgid "Delete Related Part"
msgstr "zugeordnetes Teil entfernen"
-#: part/views.py:153
+#: part/views.py:158
msgid "Add part attachment"
msgstr "Teilanhang hinzufügen"
-#: part/views.py:206 templates/attachment_table.html:32
+#: part/views.py:211 templates/attachment_table.html:32
msgid "Edit attachment"
msgstr "Anhang bearbeiten"
-#: part/views.py:210
+#: part/views.py:215
msgid "Part attachment updated"
msgstr "Teilanhang aktualisiert"
-#: part/views.py:225
+#: part/views.py:230
msgid "Delete Part Attachment"
msgstr "Teilanhang löschen"
-#: part/views.py:233
+#: part/views.py:238
msgid "Deleted part attachment"
msgstr "Teilanhang gelöscht"
-#: part/views.py:242
+#: part/views.py:247
msgid "Create Test Template"
msgstr "Testvorlage anlegen"
-#: part/views.py:269
+#: part/views.py:274
msgid "Edit Test Template"
msgstr "Testvorlage bearbeiten"
-#: part/views.py:283
+#: part/views.py:288
msgid "Delete Test Template"
msgstr "Testvorlage löschen"
-#: part/views.py:290
+#: part/views.py:295
msgid "Set Part Category"
msgstr "Teilkategorie auswählen"
-#: part/views.py:340
+#: part/views.py:345
#, python-brace-format
msgid "Set category for {n} parts"
msgstr "Kategorie für {n} Teile setzen"
-#: part/views.py:375
+#: part/views.py:380
msgid "Create Variant"
msgstr "Variante anlegen"
-#: part/views.py:460
+#: part/views.py:465
msgid "Copied part"
msgstr "Teil kopiert"
-#: part/views.py:514 part/views.py:652
+#: part/views.py:519 part/views.py:657
msgid "Possible matches exist - confirm creation of new part"
msgstr "Übereinstimmung gefunden - Teil trotzdem anlegen"
-#: part/views.py:584
+#: part/views.py:589
msgid "Created new part"
msgstr "Neues Teil angelegt"
-#: part/views.py:820
+#: part/views.py:825
msgid "Part QR Code"
msgstr "Teil-QR-Code"
-#: part/views.py:839
+#: part/views.py:927
msgid "Upload Part Image"
msgstr "Teilbild hochladen"
-#: part/views.py:845 part/views.py:880
+#: part/views.py:933 part/views.py:968
msgid "Updated part image"
msgstr "Teilbild aktualisiert"
-#: part/views.py:854
+#: part/views.py:942
msgid "Select Part Image"
msgstr "Teilbild auswählen"
-#: part/views.py:883
+#: part/views.py:971
msgid "Part image not found"
msgstr "Teilbild nicht gefunden"
-#: part/views.py:894
+#: part/views.py:982
msgid "Edit Part Properties"
msgstr "Teileigenschaften bearbeiten"
-#: part/views.py:923
+#: part/views.py:1017
msgid "Duplicate BOM"
-msgstr "BOM duplizieren"
+msgstr "Stückliste duplizieren"
-#: part/views.py:953
+#: part/views.py:1047
msgid "Confirm duplication of BOM from parent"
-msgstr "bestätige Duplizierung BOM von Übergeordneter BOM"
+msgstr "bestätige Duplizierung Stückliste von übergeordneter Stückliste"
-#: part/views.py:974
+#: part/views.py:1068
msgid "Validate BOM"
-msgstr "BOM überprüfen"
+msgstr "Stückliste überprüfen"
-#: part/views.py:995
+#: part/views.py:1089
msgid "Confirm that the BOM is valid"
-msgstr "Bestätigen, dass BOM korrekt ist"
+msgstr "Bestätigen, dass Stückliste korrekt ist"
-#: part/views.py:1006
+#: part/views.py:1100
msgid "Validated Bill of Materials"
-msgstr "überprüfte Stückliste (BOM)"
+msgstr "überprüfte Stückliste"
-#: part/views.py:1140
+#: part/views.py:1234
msgid "No BOM file provided"
msgstr "Keine Stückliste angegeben"
-#: part/views.py:1488
+#: part/views.py:1595
msgid "Enter a valid quantity"
msgstr "Bitte eine gültige Anzahl eingeben"
-#: part/views.py:1513 part/views.py:1516
+#: part/views.py:1620 part/views.py:1623
msgid "Select valid part"
msgstr "Bitte ein gültiges Teil auswählen"
-#: part/views.py:1522
+#: part/views.py:1629
msgid "Duplicate part selected"
msgstr "Teil doppelt ausgewählt"
-#: part/views.py:1560
+#: part/views.py:1667
msgid "Select a part"
msgstr "Teil auswählen"
-#: part/views.py:1566
+#: part/views.py:1673
msgid "Selected part creates a circular BOM"
msgstr "gewähltes Teil erzeugt rekursive Stückliste"
-#: part/views.py:1570
+#: part/views.py:1677
msgid "Specify quantity"
msgstr "Anzahl angeben"
-#: part/views.py:1826
+#: part/views.py:1933
msgid "Confirm Part Deletion"
msgstr "Löschen des Teils bestätigen"
-#: part/views.py:1833
+#: part/views.py:1940
msgid "Part was deleted"
msgstr "Teil wurde gelöscht"
-#: part/views.py:1842
+#: part/views.py:1949
msgid "Part Pricing"
msgstr "Teilbepreisung"
-#: part/views.py:1956
+#: part/views.py:2063
msgid "Create Part Parameter Template"
msgstr "Teilparametervorlage anlegen"
-#: part/views.py:1966
+#: part/views.py:2073
msgid "Edit Part Parameter Template"
msgstr "Teilparametervorlage bearbeiten"
-#: part/views.py:1973
+#: part/views.py:2080
msgid "Delete Part Parameter Template"
msgstr "Teilparametervorlage löschen"
-#: part/views.py:1981
+#: part/views.py:2088
msgid "Create Part Parameter"
msgstr "Teilparameter anlegen"
-#: part/views.py:2031
+#: part/views.py:2138
msgid "Edit Part Parameter"
msgstr "Teilparameter bearbeiten"
-#: part/views.py:2045
+#: part/views.py:2152
msgid "Delete Part Parameter"
msgstr "Teilparameter löschen"
-#: part/views.py:2105
+#: part/views.py:2212
msgid "Edit Part Category"
msgstr "Teilkategorie bearbeiten"
-#: part/views.py:2143
+#: part/views.py:2250
msgid "Delete Part Category"
msgstr "Teilkategorie löschen"
-#: part/views.py:2149
+#: part/views.py:2256
msgid "Part category was deleted"
msgstr "Teilekategorie wurde gelöscht"
-#: part/views.py:2201
+#: part/views.py:2308
msgid "Create Category Parameter Template"
msgstr "Kategorieparametervorlage anlegen"
-#: part/views.py:2302
+#: part/views.py:2409
msgid "Edit Category Parameter Template"
msgstr "Kategorieparametervorlage bearbeiten"
-#: part/views.py:2358
+#: part/views.py:2465
msgid "Delete Category Parameter Template"
msgstr "Kategorieparametervorlage löschen"
-#: part/views.py:2377
+#: part/views.py:2484
msgid "Create BOM Item"
-msgstr "BOM-Position anlegen"
+msgstr "Stücklisten-Position anlegen"
-#: part/views.py:2447
+#: part/views.py:2554
msgid "Edit BOM item"
-msgstr "BOM-Position bearbeiten"
+msgstr "Stücklisten-Position bearbeiten"
-#: part/views.py:2503
+#: part/views.py:2610
msgid "Confim BOM item deletion"
-msgstr "löschen von BOM-Position bestätigen"
+msgstr "löschen von Stücklisten-Position bestätigen"
-#: report/models.py:163
+#: report/models.py:180
msgid "Template name"
msgstr "Vorlagen Name"
-#: report/models.py:169
+#: report/models.py:186
msgid "Report template file"
msgstr "Report Vorlage Datei"
-#: report/models.py:176
+#: report/models.py:193
msgid "Report template description"
msgstr "Report Vorlage Beschreibung"
-#: report/models.py:182
+#: report/models.py:199
msgid "Report revision number (auto-increments)"
msgstr "Report Revisionsnummer (autom. erhöht)"
-#: report/models.py:258
+#: report/models.py:275
msgid "Report template is enabled"
msgstr "Report Vorlage ist ein"
-#: report/models.py:278
+#: report/models.py:295
msgid "StockItem query filters (comma-separated list of key=value pairs)"
-msgstr ""
+msgstr "BestandsObjekte-Abfragefilter (kommagetrennte Liste mit Schlüssel=Wert-Paaren)"
-#: report/models.py:286
+#: report/models.py:303
msgid "Include Installed Tests"
msgstr "einfügen Installiert in Tests"
-#: report/models.py:287
+#: report/models.py:304
msgid "Include test results for stock items installed inside assembled item"
-msgstr ""
+msgstr "Test-Ergebnisse für BestandsObjekte in Baugruppen einschließen"
-#: report/models.py:330
+#: report/models.py:347
msgid "Build Filters"
msgstr "Bau Filter"
-#: report/models.py:331
+#: report/models.py:348
msgid "Build query filters (comma-separated list of key=value pairs"
-msgstr ""
+msgstr "Bau-Abfragefilter (kommagetrennte Liste mit Schlüssel=Wert-Paaren)"
-#: report/models.py:368
+#: report/models.py:385
msgid "Part Filters"
msgstr "Teil Filter"
-#: report/models.py:369
+#: report/models.py:386
msgid "Part query filters (comma-separated list of key=value pairs"
-msgstr ""
+msgstr "Teile-Abfragefilter (kommagetrennte Liste mit Schlüssel=Wert-Paaren)"
-#: report/models.py:415
+#: report/models.py:416
+msgid "Purchase order query filters"
+msgstr "Bestellungs-Abfragefilter"
+
+#: report/models.py:450
+msgid "Sales order query filters"
+msgstr "Auftrags-Abfragefilter"
+
+#: report/models.py:500
msgid "Report snippet file"
-msgstr ""
+msgstr "Berichts-Snippet"
-#: report/models.py:419
-#, fuzzy
-#| msgid "Settings description"
+#: report/models.py:504
msgid "Snippet file description"
-msgstr "Einstellungs-Beschreibung"
+msgstr "Snippet-Beschreibung"
-#: report/models.py:454
+#: report/models.py:539
msgid "Report asset file"
-msgstr ""
+msgstr "Berichts-Ressource"
-#: report/models.py:457
-#, fuzzy
-#| msgid "Settings description"
+#: report/models.py:542
msgid "Asset file description"
-msgstr "Einstellungs-Beschreibung"
+msgstr "Ressource-Beschreibung"
-#: report/templates/report/inventree_build_order_base.html:150
+#: report/templates/report/inventree_build_order_base.html:147
msgid "Required For"
msgstr "benötigt für"
+#: report/templates/report/inventree_po_report.html:85
+#: report/templates/report/inventree_so_report.html:85
+msgid "Line Items"
+msgstr "Positionen"
+
#: report/templates/report/inventree_test_report_base.html:21
msgid "Stock Item Test Report"
-msgstr "Lagerobjekte Test Report"
+msgstr "BestandsObjekt Test-Bericht"
#: report/templates/report/inventree_test_report_base.html:83
msgid "Test Results"
@@ -4493,15 +4284,15 @@ msgstr "Eindeutige Seriennummern eingeben (oder leer lassen)"
#: stock/forms.py:202 stock/forms.py:258
msgid "Select test report template"
-msgstr "Test Report Vorlage auswählen"
+msgstr "Test Bericht Vorlage auswählen"
#: stock/forms.py:266
msgid "Include stock items in sub locations"
-msgstr "Lagerobjekte in untergeordneten Lagerorten einschließen"
+msgstr "BestandsObjekt in untergeordneten Lagerorten einschließen"
#: stock/forms.py:301
msgid "Stock item to install"
-msgstr "Lagerobjekte zum verbauen"
+msgstr "BestandsObjekt zum verbauen"
#: stock/forms.py:308
msgid "Stock quantity to assign"
@@ -4525,7 +4316,7 @@ msgstr "nicht mehr verbauen bestätigen"
#: stock/forms.py:350
msgid "Confirm removal of installed stock items"
-msgstr "entfernen der verbauten Lagerobjekte bestätigen"
+msgstr "Entfernen der verbauten BestandsObjekt bestätigen"
#: stock/forms.py:374
msgid "Destination stock location"
@@ -4541,7 +4332,7 @@ msgstr "Bestands-Anpassung bestätigen"
#: stock/forms.py:380
msgid "Confirm movement of stock items"
-msgstr "Bewegung der Lagerobjekte bestätigen"
+msgstr "Verschieben der BestandsObjekt bestätigen"
#: stock/forms.py:382
msgid "Set Default Location"
@@ -4549,15 +4340,15 @@ msgstr "Standard-Lagerort ändern"
#: stock/forms.py:382
msgid "Set the destination as the default location for selected parts"
-msgstr "Setze das Ziel als Standard-Ziel für ausgewählte Teile"
+msgstr "Setze das Ziel als Standard-Lagerort für ausgewählte Teile"
#: stock/models.py:204
msgid "Created stock item"
-msgstr "Neues Lagerobjekt erstellt"
+msgstr "Neues BestandsObjekt erstellt"
#: stock/models.py:240
msgid "StockItem with this serial number already exists"
-msgstr "Ein Lagerobjekt mit dieser Seriennummer existiert bereits"
+msgstr "Ein BestandsObjekt mit dieser Seriennummer existiert bereits"
#: stock/models.py:276
#, python-brace-format
@@ -4579,15 +4370,15 @@ msgstr "Teil kann nicht zu sich selbst gehören"
#: stock/models.py:315
msgid "Item must have a build reference if is_building=True"
-msgstr ""
+msgstr "Teil muss eine Referenz haben wenn is_building wahr ist"
#: stock/models.py:322
msgid "Build reference does not point to the same part object"
-msgstr ""
+msgstr "Referenz verweist nicht auf das gleiche Teil"
#: stock/models.py:362
msgid "Parent Stock Item"
-msgstr "Eltern-Lagerobjekt"
+msgstr "Eltern-BestandsObjekt"
#: stock/models.py:371
msgid "Base part"
@@ -4595,11 +4386,11 @@ msgstr "Basis-Teil"
#: stock/models.py:380
msgid "Select a matching supplier part for this stock item"
-msgstr "Passenden Zulieferer für dieses Lagerobjekt auswählen"
+msgstr "Passendes Zulieferer-Teil für dieses BestandsObjekt auswählen"
#: stock/models.py:385 stock/templates/stock/stock_app_base.html:7
msgid "Stock Location"
-msgstr "Lagerort"
+msgstr "Bestand-Lagerort"
#: stock/models.py:388
msgid "Where is this stock item located?"
@@ -4607,7 +4398,7 @@ msgstr "Wo wird dieses Teil normalerweise gelagert?"
#: stock/models.py:395
msgid "Packaging this stock item is stored in"
-msgstr "Die Verpackung dieses Lagerartikels ist gespeichert in"
+msgstr "Die Verpackung dieses BestandsObjekt ist gelagert in"
#: stock/models.py:400 stock/templates/stock/item_base.html:249
msgid "Installed In"
@@ -4623,7 +4414,7 @@ msgstr "Seriennummer für dieses Teil"
#: stock/models.py:431
msgid "Batch code for this stock item"
-msgstr "Losnummer für dieses Lagerobjekt"
+msgstr "Losnummer für dieses BestandsObjekt"
#: stock/models.py:435
msgid "Stock Quantity"
@@ -4635,19 +4426,19 @@ msgstr "Quellbau"
#: stock/models.py:446
msgid "Build for this stock item"
-msgstr "Bau für dieses Lagerobjekt"
+msgstr "Bau für dieses BestandsObjekt"
#: stock/models.py:457
msgid "Source Purchase Order"
-msgstr "Quelle EK-Bestellung"
+msgstr "Quelle Bestellung"
#: stock/models.py:460
msgid "Purchase order for this stock item"
-msgstr "EK-Bestellung für dieses Teil"
+msgstr "Bestellung für dieses BestandsObjekt"
#: stock/models.py:466
msgid "Destination Sales Order"
-msgstr "für VK-Auftrag"
+msgstr "Ziel-Auftrag"
#: stock/models.py:472 stock/templates/stock/item_base.html:343
#: templates/js/stock.js:652
@@ -4658,17 +4449,17 @@ msgstr "Ablaufdatum"
msgid ""
"Expiry date for stock item. Stock will be considered expired after this date"
msgstr ""
-"Ablaufdatum für Lagerobjekt. Bestand wird danach als abgelaufen "
+"Ablaufdatum für BestandsObjekt. Bestand wird danach als abgelaufen "
"gekennzeichnet"
#: stock/models.py:486
msgid "Delete this Stock Item when stock is depleted"
-msgstr "Objekt löschen wenn Lagerbestand aufgebraucht"
+msgstr "Dieses BestandsObjekt löschen wenn Bestand aufgebraucht"
#: stock/models.py:496 stock/templates/stock/item_notes.html:13
#: stock/templates/stock/navbar.html:54
msgid "Stock Item Notes"
-msgstr "Lagerobjekt-Notizen"
+msgstr "BestandsObjekt-Notizen"
#: stock/models.py:506
msgid "Single unit purchase price at time of purchase"
@@ -4692,19 +4483,19 @@ msgstr "zurück ins Lager"
#: stock/models.py:787
msgid "Installed into stock item"
-msgstr "Im Lagerobjekt verbaut"
+msgstr "In BestandsObjekt verbaut"
#: stock/models.py:795
msgid "Installed stock item"
-msgstr "verbautes Lagerobjekt"
+msgstr "verbautes BestandsObjekt"
#: stock/models.py:819
msgid "Uninstalled stock item"
-msgstr "unverbautes Lagerobjekt"
+msgstr "BestandsObjekt ausgebaut"
#: stock/models.py:838
msgid "Uninstalled into location"
-msgstr "verbaut in Lagerort"
+msgstr "ausgebaut nach Lagerort"
#: stock/models.py:939
msgid "Part is not set as trackable"
@@ -4742,7 +4533,7 @@ msgstr "aufteilen vom vorhandenen Bestand"
#: stock/models.py:1108
msgid "StockItem cannot be moved as it is not in stock"
-msgstr "Lagerobjekt kann nicht bewegt werden, da kein Bestand vorhanden ist"
+msgstr "BestandsObjekt kann nicht bewegt werden, da kein Bestand vorhanden ist"
#: stock/models.py:1551
msgid "Tracking entry title"
@@ -4768,7 +4559,7 @@ msgstr "Anhang muss für diesen Test hochgeladen werden"
msgid "Test name"
msgstr "Name des Tests"
-#: stock/models.py:1645 templates/js/table_filters.js:185
+#: stock/models.py:1645 templates/js/table_filters.js:190
msgid "Test result"
msgstr "Testergebnis"
@@ -4798,7 +4589,7 @@ msgstr "neuer Eintrag"
#: stock/templates/stock/item_attachments.html:11
msgid "Stock Item Attachments"
-msgstr "Lagerobjekt-Anhang"
+msgstr "BestandsObjekt-Anhang"
#: stock/templates/stock/item_base.html:24
msgid ""
@@ -4811,50 +4602,50 @@ msgstr ""
#: stock/templates/stock/item_base.html:31
msgid "This stock item is in production and cannot be edited."
msgstr ""
-"Dieses Lagerobjekt wird gerade hergestellt und kann nicht geändert werden."
+"Dieses BestandsObjekt wird gerade hergestellt und kann nicht geändert werden."
#: stock/templates/stock/item_base.html:32
msgid "Edit the stock item from the build view."
-msgstr "ändern des Lagerobjekts in der Bau Ansicht."
+msgstr "Ändern des BestandsObjekts in der Bau Ansicht."
#: stock/templates/stock/item_base.html:45
msgid "This stock item has not passed all required tests"
-msgstr "Dieses Lagerobjekt hat nicht alle Tests bestanden"
+msgstr "Dieses BestandsObjekt hat nicht alle Tests bestanden"
#: stock/templates/stock/item_base.html:51
msgid "This stock item is allocated to Sales Order"
-msgstr "Dieses Lagerobjekt ist dem VK-Auftrag zugewiesen"
+msgstr "Dieses BestandsObjekt ist einem Auftrag zugewiesen"
#: stock/templates/stock/item_base.html:57
msgid "This stock item is allocated to Build"
-msgstr "Dieses Lagerobjekt ist dem Bau zugewiesen"
+msgstr "Dieses BestandsObjekt ist dem Bau zugewiesen"
#: stock/templates/stock/item_base.html:63
msgid ""
"This stock item is serialized - it has a unique serial number and the "
"quantity cannot be adjusted."
msgstr ""
-"Dieses Lagerobjekt ist serialisiert. Es hat eine eindeutige Seriennummer und "
-"die Anzahl kann nicht angepasst werden."
+"Dieses BestandsObjekt ist serialisiert. Es hat eine eindeutige Seriennummer "
+"und die Anzahl kann nicht angepasst werden."
#: stock/templates/stock/item_base.html:67
msgid "This stock item cannot be deleted as it has child items"
-msgstr "Dieses Lagerobjekt kann nicht gelöscht werden, da es Kinder besitzt"
+msgstr "Dieses BestandsObjekt kann nicht gelöscht werden, da es Kinder besitzt"
#: stock/templates/stock/item_base.html:71
msgid ""
"This stock item will be automatically deleted when all stock is depleted."
msgstr ""
-"Dieses Lagerobjekt wird automatisch gelöscht wenn der Lagerbestand "
+"Dieses BestandsObjekt wird automatisch gelöscht wenn der Lagerbestand "
"aufgebraucht ist."
#: stock/templates/stock/item_base.html:91
-#: stock/templates/stock/item_base.html:347 templates/js/table_filters.js:118
+#: stock/templates/stock/item_base.html:347 templates/js/table_filters.js:123
msgid "Expired"
msgstr "abgelaufen"
#: stock/templates/stock/item_base.html:95
-#: stock/templates/stock/item_base.html:349 templates/js/table_filters.js:123
+#: stock/templates/stock/item_base.html:349 templates/js/table_filters.js:128
msgid "Stale"
msgstr "überfällig"
@@ -4914,19 +4705,17 @@ msgid "Return to stock"
msgstr "zu Bestand zurückgeben"
#: stock/templates/stock/item_base.html:177 templates/js/stock.js:1218
-#, fuzzy
-#| msgid "Installed in Stock Item"
msgid "Uninstall stock item"
-msgstr "In Lagerobjekt installiert"
+msgstr "BestandsObjekt deinstallieren"
#: stock/templates/stock/item_base.html:177
msgid "Uninstall"
-msgstr ""
+msgstr "Deinstallieren"
#: stock/templates/stock/item_base.html:186
#: stock/templates/stock/location.html:55
msgid "Stock actions"
-msgstr "Lagerobjekt Aktionen"
+msgstr "Bestands-Aktionen"
#: stock/templates/stock/item_base.html:189
msgid "Convert to variant"
@@ -4934,19 +4723,19 @@ msgstr "in Variante ändern"
#: stock/templates/stock/item_base.html:192
msgid "Duplicate stock item"
-msgstr "Lagerobjekt duplizieren"
+msgstr "BestandsObjekt duplizieren"
#: stock/templates/stock/item_base.html:194
msgid "Edit stock item"
-msgstr "Lagerobjekt bearbeiten"
+msgstr "BestandsObjekt bearbeiten"
#: stock/templates/stock/item_base.html:197
msgid "Delete stock item"
-msgstr "Lagerobjekt löschen"
+msgstr "BestandsObjekt löschen"
#: stock/templates/stock/item_base.html:209
msgid "Stock Item Details"
-msgstr "Lagerbestands-Details"
+msgstr "BestandsObjekt-Details"
#: stock/templates/stock/item_base.html:268 templates/js/build.js:442
msgid "No location set"
@@ -4954,7 +4743,7 @@ msgstr "Kein Lagerort gesetzt"
#: stock/templates/stock/item_base.html:275
msgid "Barcode Identifier"
-msgstr "Barcode Bezeichner"
+msgstr "Barcode-Bezeichner"
#: stock/templates/stock/item_base.html:296 templates/InvenTree/search.html:167
#: templates/js/build.js:655 templates/navbar.html:29
@@ -4967,11 +4756,11 @@ msgstr "Elternposition"
#: stock/templates/stock/item_base.html:347
msgid "This StockItem expired on"
-msgstr "Dieses Lagerobjekt lief ab am"
+msgstr "Dieses BestandsObjekt lief ab am"
#: stock/templates/stock/item_base.html:349
msgid "This StockItem expires on"
-msgstr "Dieses Lagerobjekt läuft ab am"
+msgstr "Dieses BestandsObjekt läuft ab am"
#: stock/templates/stock/item_base.html:356 templates/js/stock.js:658
msgid "Last Updated"
@@ -4987,52 +4776,48 @@ msgstr "Keine Inventur ausgeführt"
#: stock/templates/stock/item_childs.html:12
msgid "Child Stock Items"
-msgstr "Kind-Lagerobjekte"
+msgstr "Kind-BestandsObjekt"
#: stock/templates/stock/item_childs.html:20
msgid "This stock item does not have any child items"
-msgstr "Dieses Lagerobjekt hat keine Kinder"
+msgstr "Dieses BestandsObjekt hat keine Kinder"
#: stock/templates/stock/item_delete.html:9
msgid "Are you sure you want to delete this stock item?"
-msgstr "Sind Sie sicher, dass Sie dieses Lagerobjekt löschen wollen?"
+msgstr "Sind Sie sicher, dass Sie dieses BestandsObjekt löschen wollen?"
#: stock/templates/stock/item_install.html:7
-#, fuzzy
-#| msgid "Installed in Stock Item"
msgid "Install another StockItem into this item."
-msgstr "In Lagerobjekt installiert"
+msgstr "Ein weiteres BestandsObjekt in dieses Teil installiert"
#: stock/templates/stock/item_install.html:10
msgid "Stock items can only be installed if they meet the following criteria"
msgstr ""
+"BestandsObjekte können nur installiert werden wenn folgende Kriterien "
+"erfüllt werden"
#: stock/templates/stock/item_install.html:13
msgid "The StockItem links to a Part which is in the BOM for this StockItem"
msgstr ""
+"Das BestandsObjekt ist auf ein Teil verknüpft das in der Stückliste für "
+"dieses BestandsObjekt ist"
#: stock/templates/stock/item_install.html:14
-#, fuzzy
-#| msgid "This stock item is allocated to Build"
msgid "The StockItem is currently in stock"
-msgstr "Dieses Lagerobjekt ist dem Bau zugewiesen"
+msgstr "Dieses BestandsObjekt ist aktuell vorhanden"
#: stock/templates/stock/item_installed.html:11
#: stock/templates/stock/navbar.html:27
-#, fuzzy
-#| msgid "Installed in Stock Item"
msgid "Installed Stock Items"
-msgstr "In Lagerobjekt installiert"
+msgstr "Installierte BestandsObjekte"
#: stock/templates/stock/item_serialize.html:5
-#, fuzzy
-#| msgid "Purchase order for this stock item"
msgid "Create serialized items from this stock item."
-msgstr "Bestellung für dieses Teil"
+msgstr "Teile mit Seriennummern von diesem BestandObjekt anlegen."
#: stock/templates/stock/item_serialize.html:7
msgid "Select quantity to serialize, and unique serial numbers."
-msgstr ""
+msgstr "Zu serialisierende Anzahl und eindeutige Seriennummern angeben."
#: stock/templates/stock/item_tests.html:11
#: stock/templates/stock/navbar.html:19 stock/templates/stock/navbar.html:22
@@ -5052,22 +4837,20 @@ msgid ""
"You are not in the list of owners of this location. This stock location "
"cannot be edited."
msgstr ""
+"Sie sind nicht auf der Liste der Besitzer dieses Lagerorts. Der Bestands-"
+"Lagerort kann nicht verändert werden."
#: stock/templates/stock/location.html:30
msgid "All stock items"
-msgstr "Alle Lagerobjekte"
+msgstr "Alle BestandsObjekte"
#: stock/templates/stock/location.html:48
-#, fuzzy
-#| msgid "Child Stock Items"
msgid "Check-in Items"
-msgstr "Kind-Lagerobjekte"
+msgstr "Teile einchecken"
#: stock/templates/stock/location.html:64
-#, fuzzy
-#| msgid "Location Description"
msgid "Location actions"
-msgstr "Standort-Beschreibung"
+msgstr "Lagerort-Aktionen"
#: stock/templates/stock/location.html:66
msgid "Edit location"
@@ -5079,19 +4862,19 @@ msgstr "Lagerort löschen"
#: stock/templates/stock/location.html:80
msgid "Location Details"
-msgstr "Standort-Details"
+msgstr "Lagerort-Details"
#: stock/templates/stock/location.html:85
msgid "Location Path"
-msgstr "Standord-Pfad"
+msgstr "Lagerort-Pfad"
#: stock/templates/stock/location.html:90
msgid "Location Description"
-msgstr "Standort-Beschreibung"
+msgstr "Lagerort-Beschreibung"
#: stock/templates/stock/location.html:95
msgid "Sublocations"
-msgstr "Sub-Lagerorte"
+msgstr "Unter-Lagerorte"
#: stock/templates/stock/location.html:105
msgid "Stock Details"
@@ -5100,7 +4883,7 @@ msgstr "Objekt-Details"
#: stock/templates/stock/location.html:110 templates/InvenTree/search.html:263
#: templates/stats.html:52 users/models.py:34
msgid "Stock Locations"
-msgstr "Lagerorte"
+msgstr "Bestand-Lagerorte"
#: stock/templates/stock/location_delete.html:7
msgid "Are you sure you want to delete this stock location?"
@@ -5108,7 +4891,7 @@ msgstr "Sind Sie sicher, dass Sie diesen Lagerort löschen wollen?"
#: stock/templates/stock/location_list.html:6
msgid "Sub-Locations"
-msgstr "Unter-Lagerorte"
+msgstr "Sub-Lagerorte"
#. Translators: pluralize with counter
#: stock/templates/stock/location_list.html:17
@@ -5120,7 +4903,7 @@ msgstr[1] "%(counter)s Objekte"
#: stock/templates/stock/navbar.html:11
msgid "Stock Item Tracking"
-msgstr "Lagerobjektverfolgung"
+msgstr "BestandsObjekt-Verfolgung"
#: stock/templates/stock/navbar.html:14
msgid "History"
@@ -5144,19 +4927,19 @@ msgstr "Lade..."
#: stock/templates/stock/stock_uninstall.html:8
msgid "The following stock items will be uninstalled"
-msgstr "Die folgenden Lagerobjekte werden nicht mehr verbaut"
+msgstr "Die folgenden BestandsObjekte werden nicht mehr verbaut"
#: stock/templates/stock/stockitem_convert.html:7 stock/views.py:1331
msgid "Convert Stock Item"
-msgstr "Lagerobjekt umwandeln"
+msgstr "BestandsObjekt umwandeln"
#: stock/templates/stock/stockitem_convert.html:8
msgid "This stock item is current an instance of "
-msgstr "Lagerobjekt ist aktuell eine Instanz von"
+msgstr "BestandsObjekt ist aktuell eine Instanz von"
#: stock/templates/stock/stockitem_convert.html:9
msgid "It can be converted to one of the part variants listed below."
-msgstr ""
+msgstr "Es kann in eine der folgenden Varianten konvertiert werden."
#: stock/templates/stock/stockitem_convert.html:14
msgid "This action cannot be easily undone"
@@ -5164,28 +4947,28 @@ msgstr "Diese Aktion kann nicht einfach rückgängig gemacht werden"
#: stock/views.py:123
msgid "Edit Stock Location"
-msgstr "Lagerobjekt-Standort bearbeiten"
+msgstr "BestandsObjekt-Lagerort bearbeiten"
#: stock/views.py:230 stock/views.py:1321 stock/views.py:1432
#: stock/views.py:1797
msgid "Owner is required (ownership control is enabled)"
-msgstr "Eigentümer notwendig (Eigentümerkontolle aktiv)"
+msgstr "Eigentümer notwendig (Eigentümerkontrolle aktiv)"
#: stock/views.py:245
msgid "Stock Location QR code"
-msgstr "QR-Code für diesen Standort"
+msgstr "QR-Code für diesen Lagerort"
#: stock/views.py:265
msgid "Add Stock Item Attachment"
-msgstr "Lagerobjekt Anhang hinzufügen"
+msgstr "BestandsObjekt-Anhang hinzufügen"
#: stock/views.py:311
msgid "Edit Stock Item Attachment"
-msgstr "Lagerobjekt Anhang bearbeiten"
+msgstr "BestandsObjekt-Anhang bearbeiten"
#: stock/views.py:327
msgid "Delete Stock Item Attachment"
-msgstr "Lagerobjekt Anhang löschen"
+msgstr "BestandsObjekt-Anhang löschen"
#: stock/views.py:343
msgid "Assign to Customer"
@@ -5205,7 +4988,7 @@ msgstr "gültigen Lagerort angeben"
#: stock/views.py:396
msgid "Stock item returned from customer"
-msgstr "Lagerbestand Retoure vom Kunden"
+msgstr "BestandsObjekt retoure vom Kunden"
#: stock/views.py:407
msgid "Delete All Test Data"
@@ -5233,25 +5016,19 @@ msgstr "Lagerbestand Exportoptionen"
#: stock/views.py:630
msgid "Stock Item QR Code"
-msgstr "Lagerobjekt-QR-Code"
+msgstr "BestandsObjekt-QR-Code"
#: stock/views.py:656
-#, fuzzy
-#| msgid "Installed in Stock Item"
msgid "Install Stock Item"
-msgstr "In Lagerobjekt installiert"
+msgstr "BestandsObjekt installiert"
#: stock/views.py:755
-#, fuzzy
-#| msgid "Installed in Stock Item"
msgid "Uninstall Stock Items"
-msgstr "In Lagerobjekt installiert"
+msgstr "BestandsObjekte deinstallieren"
#: stock/views.py:863
-#, fuzzy
-#| msgid "Installed in Stock Item"
msgid "Uninstalled stock items"
-msgstr "In Lagerobjekt installiert"
+msgstr "BestandsObjekte deinstalliert"
#: stock/views.py:888
msgid "Adjust Stock"
@@ -5259,11 +5036,11 @@ msgstr "Lagerbestand anpassen"
#: stock/views.py:998
msgid "Move Stock Items"
-msgstr "Lagerobjekte bewegen"
+msgstr "BestandsObjekte bewegen"
#: stock/views.py:999
msgid "Count Stock Items"
-msgstr "Lagerobjekte zählen"
+msgstr "BestandsObjekte zählen"
#: stock/views.py:1000
msgid "Remove From Stock"
@@ -5271,11 +5048,11 @@ msgstr "Aus Lagerbestand entfernen"
#: stock/views.py:1001
msgid "Add Stock Items"
-msgstr "Lagerobjekte hinzufügen"
+msgstr "BestandsObjekte hinzufügen"
#: stock/views.py:1002
msgid "Delete Stock Items"
-msgstr "Lagerobjekte löschen"
+msgstr "BestandsObjekte löschen"
#: stock/views.py:1030
msgid "Must enter integer value"
@@ -5301,7 +5078,7 @@ msgstr "Bestand für {n} Objekte erfasst"
#: stock/views.py:1189
msgid "No items were moved"
-msgstr "Keine Lagerobjekte wurden bewegt"
+msgstr "Keine BestandsObjekt wurden bewegt"
#: stock/views.py:1192
#, python-brace-format
@@ -5311,11 +5088,11 @@ msgstr "{n} Teile nach {dest} bewegt"
#: stock/views.py:1211
#, python-brace-format
msgid "Deleted {n} stock items"
-msgstr "{n} Teile im Lager gelöscht"
+msgstr "{n} BestandsObjekte gelöscht"
#: stock/views.py:1223
msgid "Edit Stock Item"
-msgstr "Lagerobjekt bearbeiten"
+msgstr "BestandsObjekt bearbeiten"
#: stock/views.py:1449
msgid "Serialize Stock"
@@ -5323,7 +5100,7 @@ msgstr "Lagerbestand erfassen"
#: stock/views.py:1542 templates/js/build.js:210
msgid "Create new Stock Item"
-msgstr "Neues Lagerobjekt hinzufügen"
+msgstr "Neues BestandsObjekt hinzufügen"
#: stock/views.py:1684
msgid "Duplicate Stock Item"
@@ -5335,11 +5112,11 @@ msgstr "Anzahl kann nicht negativ sein"
#: stock/views.py:1866
msgid "Delete Stock Location"
-msgstr "Standort löschen"
+msgstr "Bestand-Lagerort löschen"
#: stock/views.py:1879
msgid "Delete Stock Item"
-msgstr "Lagerobjekt löschen"
+msgstr "BestandsObjekt löschen"
#: stock/views.py:1890
msgid "Delete Stock Tracking Entry"
@@ -5371,7 +5148,7 @@ msgstr "Seite existiert nicht"
#: templates/InvenTree/index.html:6
msgid "Index"
-msgstr ""
+msgstr "Index"
#: templates/InvenTree/index.html:97
msgid "Starred Parts"
@@ -5383,7 +5160,7 @@ msgstr "neueste Teile"
#: templates/InvenTree/index.html:99
msgid "BOM Waiting Validation"
-msgstr ""
+msgstr "Stücklisten erwartet Validierung"
#: templates/InvenTree/index.html:128
msgid "Recently Updated"
@@ -5391,7 +5168,7 @@ msgstr "kürzlich aktualisiert"
#: templates/InvenTree/index.html:143
msgid "Expired Stock"
-msgstr "abgeliefender Bestand"
+msgstr "abgelaufener Bestand"
#: templates/InvenTree/index.html:144
msgid "Stale Stock"
@@ -5403,23 +5180,23 @@ msgstr "laufende Bauaufträge"
#: templates/InvenTree/index.html:183
msgid "Overdue Build Orders"
-msgstr "verspätete Bauaufträge"
+msgstr "überfällige Bauaufträge"
#: templates/InvenTree/index.html:204
msgid "Outstanding Purchase Orders"
-msgstr "ausstehende EK-Bestellungen"
+msgstr "ausstehende Bestellungen"
#: templates/InvenTree/index.html:205
msgid "Overdue Purchase Orders"
-msgstr "überfällige EK-Bestellungen"
+msgstr "überfällige Bestellungen"
#: templates/InvenTree/index.html:227
msgid "Outstanding Sales Orders"
-msgstr "ausstehende VK-Aufträge"
+msgstr "ausstehende Aufträge"
#: templates/InvenTree/index.html:228
msgid "Overdue Sales Orders"
-msgstr "überfällige VK-Aufträge"
+msgstr "überfällige Aufträge"
#: templates/InvenTree/search.html:7 templates/InvenTree/search.html:13
msgid "Search Results"
@@ -5446,28 +5223,24 @@ msgid "Category Settings"
msgstr "Kategorie-Einstellungen"
#: templates/InvenTree/settings/category.html:25
-#, fuzzy
-#| msgid "Edit Part Parameter Template"
msgid "Category Parameter Templates"
-msgstr "Teilparametervorlage bearbeiten"
+msgstr "Kategorie-Parametervorlagen"
#: templates/InvenTree/settings/category.html:52
-#, fuzzy
-#| msgid "No part parameter templates found"
msgid "No category parameter templates found"
-msgstr "Keine Teilparametervorlagen gefunden"
+msgstr "Keine Kategorie-Parametervorlagen gefunden"
#: templates/InvenTree/settings/category.html:67
msgid "Default Value"
msgstr "Standard-Wert"
#: templates/InvenTree/settings/category.html:70
-#: templates/InvenTree/settings/part.html:80
+#: templates/InvenTree/settings/part.html:81
msgid "Edit Template"
msgstr "Vorlage bearbeiten"
#: templates/InvenTree/settings/category.html:71
-#: templates/InvenTree/settings/part.html:81
+#: templates/InvenTree/settings/part.html:82
msgid "Delete Template"
msgstr "Vorlage löschen"
@@ -5475,7 +5248,7 @@ msgstr "Vorlage löschen"
msgid "Global InvenTree Settings"
msgstr "Systemweite InvenTree-Einstellungen"
-#: templates/InvenTree/settings/global.html:25
+#: templates/InvenTree/settings/global.html:26
msgid "Barcode Settings"
msgstr "Barcode-Einstellungen"
@@ -5491,13 +5264,11 @@ msgstr "Teil-Einstellungen"
msgid "Part Options"
msgstr "Teil-Optionen"
-#: templates/InvenTree/settings/part.html:39
-#, fuzzy
-#| msgid "Edit Part Parameter Template"
+#: templates/InvenTree/settings/part.html:40
msgid "Part Parameter Templates"
-msgstr "Teilparametervorlage bearbeiten"
+msgstr "Teil-Parametervorlage"
-#: templates/InvenTree/settings/part.html:60
+#: templates/InvenTree/settings/part.html:61
msgid "No part parameter templates found"
msgstr "Keine Teilparametervorlagen gefunden"
@@ -5553,17 +5324,15 @@ msgstr "InvenTree-Einstellungen"
#: templates/InvenTree/settings/tabs.html:16
msgid "Global"
-msgstr ""
+msgstr "Global"
#: templates/InvenTree/settings/tabs.html:19
msgid "Report"
msgstr "Bericht"
#: templates/InvenTree/settings/tabs.html:22
-#, fuzzy
-#| msgid "Part Categories"
msgid "Categories"
-msgstr "Teile-Kategorien"
+msgstr "Kategorien"
#: templates/InvenTree/settings/theme.html:10
msgid "Theme Settings"
@@ -5582,6 +5351,11 @@ msgid ""
"\t\tPlease select another color theme :)\n"
"\t"
msgstr ""
+"\n"
+"\t\tDie CSS Datei \"%(invalid_color_theme)s.css\" für das aktuell "
+"ausgewählte Farbschema wurde nicht gefunden. \n"
+"\t\tBitte ein anderes Farbschema auswählen:)\n"
+"\t"
#: templates/InvenTree/settings/user.html:16
msgid "User Information"
@@ -5664,11 +5438,25 @@ msgstr "Hochgeladen"
msgid "Delete attachment"
msgstr "Anhang löschen"
+#: templates/image_download.html:8
+msgid "Specify URL for downloading image"
+msgstr "URL für Bild-Donwload angeben"
+
+#: templates/image_download.html:11
+msgid "Must be a valid image URL"
+msgstr "Muss eine gültige URL für ein Bild sein"
+
+#: templates/image_download.html:12
+msgid "Remote server must be accessible"
+msgstr "Der angegebene Server muss erreichbar sein"
+
+#: templates/image_download.html:13
+msgid "Remote image must not exceed maximum allowable file size"
+msgstr "Das Bild darf nicht größer als die maximal-erlaubte Größe sein"
+
#: templates/js/barcode.js:8
-#, fuzzy
-#| msgid "No barcode data provided"
msgid "Scan barcode data here using wedge scanner"
-msgstr "Keine Strichcodedaten bereitgestellt"
+msgstr "Hier den Barcode scannen"
#: templates/js/barcode.js:10
msgid "Enter barcode data"
@@ -5680,7 +5468,7 @@ msgstr "Barcode"
#: templates/js/barcode.js:32
msgid "Enter optional notes for stock transfer"
-msgstr ""
+msgstr "Optionale Notizen zu Bestandsübertragung eingeben"
#: templates/js/barcode.js:33
msgid "Enter notes"
@@ -5694,15 +5482,13 @@ msgstr "Server-Fehler"
msgid "Unknown response from server"
msgstr "Unbekannte Antwort von Server erhalten"
-#: templates/js/barcode.js:119 templates/js/modals.js:856
+#: templates/js/barcode.js:119 templates/js/modals.js:857
msgid "Invalid server response"
-msgstr ""
+msgstr "Ungültige Antwort von Server"
#: templates/js/barcode.js:212
-#, fuzzy
-#| msgid "No barcode data provided"
msgid "Scan barcode data below"
-msgstr "Keine Strichcodedaten bereitgestellt"
+msgstr "Barcode unterhalb scannen"
#: templates/js/barcode.js:270
msgid "No URL in response"
@@ -5710,72 +5496,58 @@ msgstr "keine URL in der Antwort"
#: templates/js/barcode.js:288
msgid "Link Barcode to Stock Item"
-msgstr "Barcode mit Lagerobjekt verknüpfen"
+msgstr "Barcode mit BestandsObjekt verknüpfen"
#: templates/js/barcode.js:311
msgid ""
"This will remove the association between this stock item and the barcode"
msgstr ""
+"Dadurch wird die Verknüpfung zwischen diesem BestandsObjekt und dem Barcode "
+"entfernt"
#: templates/js/barcode.js:317
msgid "Unlink"
-msgstr ""
+msgstr "Entfernen"
#: templates/js/barcode.js:376
msgid "Remove stock item"
-msgstr "Bestand entfernen"
+msgstr "BestandsObjekt entfernen"
#: templates/js/barcode.js:418
-#, fuzzy
-#| msgid "Include stock items in sub locations"
msgid "Check Stock Items into Location"
-msgstr "Lagerobjekte in untergeordneten Lagerorten einschließen"
+msgstr "BestandsObjekte in Lagerort buchen"
#: templates/js/barcode.js:422 templates/js/barcode.js:547
msgid "Check In"
-msgstr ""
+msgstr "Einbuchen"
#: templates/js/barcode.js:462 templates/js/barcode.js:586
-#, fuzzy
-#| msgid "Order stock"
msgid "Error transferring stock"
-msgstr "Bestand bestellen"
+msgstr "Fehler bei Bestandsübertragung"
#: templates/js/barcode.js:481
-#, fuzzy
-#| msgid "Stock Item Details"
msgid "Stock Item already scanned"
-msgstr "Lagerbestands-Details"
+msgstr "BestandsObjekte bereits gescannt"
#: templates/js/barcode.js:485
-#, fuzzy
-#| msgid "Include stock items in sub locations"
msgid "Stock Item already in this location"
-msgstr "Lagerobjekte in untergeordneten Lagerorten einschließen"
+msgstr "BestandsObjekt besteht bereits in diesem Lagerort"
#: templates/js/barcode.js:492
-#, fuzzy
-#| msgid "Added stock to {n} items"
msgid "Added stock item"
-msgstr "Vorrat zu {n} Lagerobjekten hinzugefügt"
+msgstr "BestandsObjekt hinzugefügt"
#: templates/js/barcode.js:499
-#, fuzzy
-#| msgid "Create new Stock Item"
msgid "Barcode does not match Stock Item"
-msgstr "Neues Lagerobjekt hinzufügen"
+msgstr "Barcode entspricht keinem BestandsObjekt"
#: templates/js/barcode.js:542
-#, fuzzy
-#| msgid "Include stock items in sub locations"
msgid "Check Into Location"
-msgstr "Lagerobjekte in untergeordneten Lagerorten einschließen"
+msgstr "In Lagerorten buchen"
#: templates/js/barcode.js:605
-#, fuzzy
-#| msgid "Create new Stock Item"
msgid "Barcode does not match a valid location"
-msgstr "Neues Lagerobjekt hinzufügen"
+msgstr "Barcode entspricht keinem Lagerort"
#: templates/js/bom.js:175 templates/js/build.js:934
msgid "Open subassembly"
@@ -5791,7 +5563,7 @@ msgstr "Keine Preisinformation verfügbar"
#: templates/js/bom.js:286 templates/js/bom.js:372
msgid "View BOM"
-msgstr "BOM anzeigen"
+msgstr "Stückliste anzeigen"
#: templates/js/bom.js:338 templates/js/build.js:571 templates/js/build.js:984
msgid "Actions"
@@ -5799,7 +5571,7 @@ msgstr "Aktionen"
#: templates/js/bom.js:346
msgid "Validate BOM Item"
-msgstr "BOM-Position validieren"
+msgstr "Stücklisten-Position validieren"
#: templates/js/bom.js:348
msgid "This line has been validated"
@@ -5807,61 +5579,47 @@ msgstr "Diese Position wurde validiert"
#: templates/js/bom.js:350
msgid "Edit BOM Item"
-msgstr "BOM-Position bearbeiten"
+msgstr "Stücklisten-Position bearbeiten"
#: templates/js/bom.js:352
msgid "Delete BOM Item"
-msgstr "BOM-Position löschen"
+msgstr "Stücklisten-Position löschen"
#: templates/js/bom.js:443 templates/js/build.js:305 templates/js/build.js:1032
msgid "No BOM items found"
-msgstr "Keine BOM-Einträge gefunden"
+msgstr "Keine Stücklisten-Position(en) gefunden"
#: templates/js/build.js:56
-#, fuzzy
-#| msgid "Installed in Stock Item"
msgid "Auto-allocate stock items to this output"
-msgstr "In Lagerobjekt installiert"
+msgstr "BestandsObjekte automatisch Bau-Ausgabe zuordnen"
#: templates/js/build.js:62
-#, fuzzy
-#| msgid "Complete Build"
msgid "Complete build output"
-msgstr "Bau fertigstellen"
+msgstr "Endprodukt fertigstellen"
#: templates/js/build.js:71
-#, fuzzy
-#| msgid "Allocate Stock to Build"
msgid "Unallocate stock from build output"
-msgstr "Lagerbestand dem Bau zuweisen"
+msgstr "Bestand von Endpordukt zurücknehmen"
#: templates/js/build.js:77
-#, fuzzy
-#| msgid "Delete Build"
msgid "Delete build output"
-msgstr "Bau entfernt"
+msgstr "Endprodukt entfernt"
#: templates/js/build.js:209 templates/stock_table.html:20
msgid "New Stock Item"
-msgstr "Neues Lagerobjekt"
+msgstr "Neues BestandsObjekt"
#: templates/js/build.js:493
-#, fuzzy
-#| msgid "Required"
msgid "Required Part"
-msgstr "benötigt"
+msgstr "benötigter Teil"
#: templates/js/build.js:514
-#, fuzzy
-#| msgid "Quantity"
msgid "Quantity Per"
-msgstr "Anzahl"
+msgstr "Anzahl pro"
#: templates/js/build.js:578 templates/js/build.js:992
-#, fuzzy
-#| msgid "Builds"
msgid "Build stock"
-msgstr "Baue"
+msgstr "Baue Bestand"
#: templates/js/build.js:582 templates/js/build.js:996
#: templates/stock_table.html:57
@@ -5882,26 +5640,20 @@ msgid "Select"
msgstr "Auswählen"
#: templates/js/build.js:669
-#, fuzzy
-#| msgid "Build order allocation is complete"
msgid "Build order is overdue"
-msgstr "Bau-Zuweisung ist vollständig"
+msgstr "Bauauftrag ist überfällig"
#: templates/js/build.js:767
msgid "No parts allocated for"
msgstr "Keine Teile zugeordnet zu"
#: templates/js/company.js:74
-#, fuzzy
-#| msgid "Suppliers"
msgid "Parts Supplied"
-msgstr "Zulieferer"
+msgstr "Teile geliefert"
#: templates/js/company.js:83
-#, fuzzy
-#| msgid "Manufacturer"
msgid "Parts Manufactured"
-msgstr "Hersteller"
+msgstr "Teile gefertigt"
#: templates/js/company.js:96
msgid "No company information found"
@@ -5909,7 +5661,7 @@ msgstr "Keine Firmeninformation gefunden"
#: templates/js/company.js:129
msgid "No supplier parts found"
-msgstr "Keine Zuliefererteile gefunden"
+msgstr "Keine Zulieferer-Teile gefunden"
#: templates/js/company.js:147 templates/js/part.js:59 templates/js/part.js:144
msgid "Template part"
@@ -5920,28 +5672,21 @@ msgid "Assembled part"
msgstr "Baugruppe"
#: templates/js/label.js:10 templates/js/report.js:98
-#, fuzzy
-#| msgid "Delete Stock Items"
msgid "Select Stock Items"
-msgstr "Lagerobjekte löschen"
+msgstr "BestandsObjekte auswählen"
#: templates/js/label.js:11
-#, fuzzy
-#| msgid "StockItem has been allocated"
msgid "Stock item(s) must be selected before printing labels"
-msgstr "Lagerobjekt wurde zugewiesen"
+msgstr ""
+"BestandsObjekt(e) müssen ausgewählt sein bevor Labels gedruckt werden können"
#: templates/js/label.js:29 templates/js/label.js:79
-#, fuzzy
-#| msgid "No parts found"
msgid "No Labels Found"
-msgstr "Keine Teile gefunden"
+msgstr "Keine Labels gefunden"
#: templates/js/label.js:30
-#, fuzzy
-#| msgid "Remove selected BOM items"
msgid "No labels found which match selected stock item(s)"
-msgstr "Ausgewählte Stücklistenpositionen entfernen"
+msgstr "Keine Labels die zu BestandsObjekt(e) passen gefunden"
#: templates/js/label.js:61
msgid "Select Stock Locations"
@@ -5949,41 +5694,33 @@ msgstr "Bestands-Lagerort auswählen"
#: templates/js/label.js:62
msgid "Stock location(s) must be selected before printing labels"
-msgstr ""
+msgstr "Bestands-Lagerort(e) müssen ausgewählt sein um Labels zu drucken"
#: templates/js/label.js:80
msgid "No labels found which match selected stock location(s)"
-msgstr ""
+msgstr "Keine Labels für die ausgewählten Bestands-Lagerort(e) gefunden"
#: templates/js/label.js:154
-#, fuzzy
-#| msgid "StockItem has been allocated"
msgid "stock items selected"
-msgstr "Lagerobjekt wurde zugewiesen"
+msgstr "BestandsObjekte ausgewählt"
#: templates/js/label.js:162
-#, fuzzy
-#| msgid "Select valid part"
msgid "Select Label"
-msgstr "Bitte ein gültiges Teil auswählen"
+msgstr "Label auswählen"
#: templates/js/label.js:177
-#, fuzzy
-#| msgid "Select valid part"
msgid "Select Label Template"
-msgstr "Bitte ein gültiges Teil auswählen"
+msgstr "Label-Vorlage auswählen"
#: templates/js/modals.js:406
-#, fuzzy
-#| msgid "Show pricing information"
msgid "Show Error Information"
-msgstr "Kosteninformationen ansehen"
+msgstr "Fehler-Informationen anzeigen"
-#: templates/js/modals.js:473 templates/modals.html:66
+#: templates/js/modals.js:473 templates/modals.html:73
msgid "Accept"
msgstr "Akzeptieren"
-#: templates/js/modals.js:474 templates/modals.html:65
+#: templates/js/modals.js:474 templates/modals.html:72
msgid "Cancel"
msgstr "abbrechen"
@@ -5991,87 +5728,87 @@ msgstr "abbrechen"
msgid "Loading Data"
msgstr "Lade Daten"
-#: templates/js/modals.js:549 templates/js/modals.js:807
-#: templates/modals.html:22 templates/modals.html:46
+#: templates/js/modals.js:549 templates/js/modals.js:808
+#: templates/modals.html:29 templates/modals.html:53
msgid "Submit"
msgstr "abschicken"
-#: templates/js/modals.js:550 templates/js/modals.js:808
-#: templates/modals.html:21 templates/modals.html:45 templates/modals.html:84
+#: templates/js/modals.js:550 templates/js/modals.js:809
+#: templates/modals.html:28 templates/modals.html:52 templates/modals.html:93
msgid "Close"
msgstr "Schliessen"
-#: templates/js/modals.js:759
+#: templates/js/modals.js:760
msgid "Invalid response from server"
msgstr "ungültige Antwort vom Server"
-#: templates/js/modals.js:759
+#: templates/js/modals.js:760
msgid "Form data missing from server response"
msgstr "Formulardaten fehlen bei Serverantwort"
-#: templates/js/modals.js:772
+#: templates/js/modals.js:773
msgid "Error posting form data"
msgstr "Formulardaten fehlerhaft"
-#: templates/js/modals.js:856
+#: templates/js/modals.js:857
msgid "JSON response missing form data"
-msgstr ""
+msgstr "JSON Antwort enthält keine Formulardaten"
-#: templates/js/modals.js:866
+#: templates/js/modals.js:867
msgid "No Response"
msgstr "Keine Antwort"
-#: templates/js/modals.js:867
+#: templates/js/modals.js:868
msgid "No response from the InvenTree server"
msgstr "keine Antwort vom InvenTree Server"
-#: templates/js/modals.js:871
-msgid "Error 400: Bad Request"
-msgstr ""
-
#: templates/js/modals.js:872
-msgid "Server returned error code 400"
-msgstr ""
+msgid "Error 400: Bad Request"
+msgstr "Fehler 400: Ungültige Anfrage"
-#: templates/js/modals.js:876
-msgid "Error 401: Not Authenticated"
-msgstr ""
+#: templates/js/modals.js:873
+msgid "Server returned error code 400"
+msgstr "Fehler 400 von Server erhalten"
#: templates/js/modals.js:877
+msgid "Error 401: Not Authenticated"
+msgstr "Fehler 401: Nicht Angemeldet"
+
+#: templates/js/modals.js:878
msgid "Authentication credentials not supplied"
msgstr "Authentication Kredentials nicht angegeben"
-#: templates/js/modals.js:881
-msgid "Error 403: Permission Denied"
-msgstr ""
-
#: templates/js/modals.js:882
-msgid "You do not have the required permissions to access this function"
-msgstr ""
+msgid "Error 403: Permission Denied"
+msgstr "Fehler 403: keine Berechtigung"
-#: templates/js/modals.js:886
-msgid "Error 404: Resource Not Found"
-msgstr ""
+#: templates/js/modals.js:883
+msgid "You do not have the required permissions to access this function"
+msgstr "Fehlende Berechtigung für diese Aktion"
#: templates/js/modals.js:887
-msgid "The requested resource could not be located on the server"
-msgstr ""
+msgid "Error 404: Resource Not Found"
+msgstr "Fehler 404: Ressource nicht gefunden"
-#: templates/js/modals.js:891
-msgid "Error 408: Timeout"
-msgstr ""
+#: templates/js/modals.js:888
+msgid "The requested resource could not be located on the server"
+msgstr "Die angefragte Ressource kann auf diesem Server nicht gefunden werden"
#: templates/js/modals.js:892
+msgid "Error 408: Timeout"
+msgstr "Fehler 408: Zeitüberschreitung"
+
+#: templates/js/modals.js:893
msgid "Connection timeout while requesting data from server"
msgstr "Verbindungszeitüberschreitung bei der Datenanforderung"
-#: templates/js/modals.js:895
+#: templates/js/modals.js:896
msgid "Error requesting form data"
-msgstr ""
+msgstr "Fehler bei Formulardaten-Anfrage"
#: templates/js/order.js:138
msgid "No purchase orders found"
-msgstr "Keine EK-Bestellungen gefunden"
+msgstr "Keine Bestellungen gefunden"
#: templates/js/order.js:162 templates/js/order.js:257
msgid "Order is overdue"
@@ -6079,7 +5816,7 @@ msgstr "Bestellung überfällig"
#: templates/js/order.js:234
msgid "No sales orders found"
-msgstr "Keine VK-Aufträge gefunden"
+msgstr "Keine Aufträge gefunden"
#: templates/js/order.js:303
msgid "Shipment Date"
@@ -6113,7 +5850,7 @@ msgstr "Keine Teile gefunden"
msgid "No category"
msgstr "Keine Kategorie"
-#: templates/js/part.js:408 templates/js/table_filters.js:291
+#: templates/js/part.js:408 templates/js/table_filters.js:296
msgid "Low stock"
msgstr "Bestand niedrig"
@@ -6143,7 +5880,7 @@ msgstr "Dieses Testergebnis ist für ein Hauptteil"
#: templates/js/report.js:47
msgid "items selected"
-msgstr "Lagerobjekte ausgewählt"
+msgstr "BestandsObjekt ausgewählt"
#: templates/js/report.js:55
msgid "Select Report Template"
@@ -6155,16 +5892,17 @@ msgstr "Test Report Vorlage auswählen"
#: templates/js/report.js:99
msgid "Stock item(s) must be selected before printing reports"
-msgstr "Lagerobjekt(e) müssen vor dem Reportdruck ausgewählt werden"
+msgstr "BestandsObjekt(e) müssen vor dem Reportdruck ausgewählt werden"
#: templates/js/report.js:116 templates/js/report.js:169
-#: templates/js/report.js:223
+#: templates/js/report.js:223 templates/js/report.js:277
+#: templates/js/report.js:331
msgid "No Reports Found"
msgstr "Keine Reports gefunden"
#: templates/js/report.js:117
msgid "No report templates found which match selected stock item(s)"
-msgstr "Keine Reportvorlagen für ausgewählte Lagerobjekte gefunden"
+msgstr "Keine Berichtsvorlagen für ausgewählte BestandsObjekt(e) gefunden"
#: templates/js/report.js:152
msgid "Select Builds"
@@ -6176,7 +5914,7 @@ msgstr "Bau muss vor dem Reportdruck ausgewählt werden"
#: templates/js/report.js:170
msgid "No report templates found which match selected build(s)"
-msgstr "Keine Reportvorlagen für ausgewählten Bau gefunden"
+msgstr "Keine Berichtvorlagen für ausgewählten Bau gefunden"
#: templates/js/report.js:205
msgid "Select Parts"
@@ -6188,7 +5926,27 @@ msgstr "Teil muss vor dem Reportdruck ausgewählt werden"
#: templates/js/report.js:224
msgid "No report templates found which match selected part(s)"
-msgstr "Keine Reportvorlagen für ausgewählte Teile gefunden"
+msgstr "Keine Berichtvorlagen für ausgewählte Teile gefunden"
+
+#: templates/js/report.js:259
+msgid "Select Purchase Orders"
+msgstr "Bestellungen auswählen"
+
+#: templates/js/report.js:260
+msgid "Purchase Order(s) must be selected before printing report"
+msgstr "Bestellung muss vor dem Reportdruck ausgewählt werden"
+
+#: templates/js/report.js:278 templates/js/report.js:332
+msgid "No report templates found which match selected orders"
+msgstr "Keine Berichtvorlagen für ausgewählte Bestellungen gefunden"
+
+#: templates/js/report.js:313
+msgid "Select Sales Orders"
+msgstr "Aufträge auswählen"
+
+#: templates/js/report.js:314
+msgid "Sales Order(s) must be selected before printing report"
+msgstr "Auftrag muss vor dem Reportdruck ausgewählt werden"
#: templates/js/stock.js:38
msgid "PASS"
@@ -6220,15 +5978,15 @@ msgstr "In Arbeit"
#: templates/js/stock.js:297
msgid "Installed in Stock Item"
-msgstr "In Lagerobjekt installiert"
+msgstr "In BestandsObjekt installiert"
#: templates/js/stock.js:305
msgid "Assigned to Sales Order"
-msgstr "VK-Auftrag zugewiesen"
+msgstr "Auftrag zugewiesen"
#: templates/js/stock.js:337
msgid "No stock items matching query"
-msgstr "Keine zur Anfrage passenden Lagerobjekte"
+msgstr "Keine zur Anfrage passenden BestandsObjekte"
#: templates/js/stock.js:479
msgid "Undefined location"
@@ -6236,51 +5994,51 @@ msgstr "unbekannter Lagerort"
#: templates/js/stock.js:575
msgid "Stock item is in production"
-msgstr "Lagerobjekt wird produziert"
+msgstr "BestandsObjekt wird produziert"
#: templates/js/stock.js:580
msgid "Stock item assigned to sales order"
-msgstr "Lagerobjekt wurde Auftrag zugewiesen"
+msgstr "BestandsObjekt wurde Auftrag zugewiesen"
#: templates/js/stock.js:583
msgid "Stock item assigned to customer"
-msgstr "Lagerobjekt wurde Kunden zugewiesen"
+msgstr "BestandsObjekt wurde Kunden zugewiesen"
#: templates/js/stock.js:587
msgid "Stock item has expired"
-msgstr "Lagerobjekt ist abgelaufen"
+msgstr "BestandsObjekt ist abgelaufen"
#: templates/js/stock.js:589
msgid "Stock item will expire soon"
-msgstr "Lagerobjekt läuft demnächst ab"
+msgstr "BestandsObjekt läuft demnächst ab"
#: templates/js/stock.js:593
msgid "Stock item has been allocated"
-msgstr "Lagerobjekt ist zugewiesen"
+msgstr "BestandsObjekt zugewiesen"
#: templates/js/stock.js:597
msgid "Stock item has been installed in another item"
-msgstr "Lagerobjekt wurde in anderem Element verbaut"
+msgstr "BestandsObjekt in anderem Element verbaut"
#: templates/js/stock.js:605
msgid "Stock item has been rejected"
-msgstr "Lagerobjekt wurde abgewiesen"
+msgstr "BestandsObjekt abgewiesen"
#: templates/js/stock.js:609
msgid "Stock item is lost"
-msgstr "Lagerobjekt verloren"
+msgstr "BestandsObjekt verloren"
#: templates/js/stock.js:612
msgid "Stock item is destroyed"
-msgstr "Lagerobjekt ist zerstört"
+msgstr "BestandsObjekt zerstört"
-#: templates/js/stock.js:616 templates/js/table_filters.js:111
+#: templates/js/stock.js:616 templates/js/table_filters.js:116
msgid "Depleted"
msgstr "gelöscht"
#: templates/js/stock.js:645
msgid "Stocktake"
-msgstr "Bestandsaufnahme"
+msgstr "Inventur"
#: templates/js/stock.js:821
msgid "Stock Status"
@@ -6304,13 +6062,13 @@ msgstr "Keine Benutzerinformation"
#: templates/js/stock.js:1089
msgid "Create New Location"
-msgstr "Neuen Standort anlegen"
+msgstr "Neuen Lagerort anlegen"
#: templates/js/stock.js:1188
msgid "Serial"
msgstr "Seriennummer"
-#: templates/js/stock.js:1281 templates/js/table_filters.js:144
+#: templates/js/stock.js:1281 templates/js/table_filters.js:149
msgid "Installed"
msgstr "Installiert"
@@ -6326,36 +6084,36 @@ msgstr "nachverfolgbares Teil"
msgid "Validated"
msgstr "überprüft"
-#: templates/js/table_filters.js:70 templates/js/table_filters.js:154
+#: templates/js/table_filters.js:70 templates/js/table_filters.js:159
msgid "Is Serialized"
msgstr "ist mit Seriennummer"
-#: templates/js/table_filters.js:73 templates/js/table_filters.js:161
+#: templates/js/table_filters.js:73 templates/js/table_filters.js:166
msgid "Serial number GTE"
msgstr "Seriennummer >="
-#: templates/js/table_filters.js:74 templates/js/table_filters.js:162
+#: templates/js/table_filters.js:74 templates/js/table_filters.js:167
msgid "Serial number greater than or equal to"
msgstr "Seriennummer größer oder gleich"
-#: templates/js/table_filters.js:77 templates/js/table_filters.js:165
+#: templates/js/table_filters.js:77 templates/js/table_filters.js:170
msgid "Serial number LTE"
msgstr "Seriennummer <="
-#: templates/js/table_filters.js:78 templates/js/table_filters.js:166
+#: templates/js/table_filters.js:78 templates/js/table_filters.js:171
msgid "Serial number less than or equal to"
msgstr "Seriennummern kleiner oder gleich"
#: templates/js/table_filters.js:81 templates/js/table_filters.js:82
-#: templates/js/table_filters.js:157 templates/js/table_filters.js:158
+#: templates/js/table_filters.js:162 templates/js/table_filters.js:163
msgid "Serial number"
msgstr "Seriennummer"
-#: templates/js/table_filters.js:86 templates/js/table_filters.js:175
+#: templates/js/table_filters.js:86 templates/js/table_filters.js:180
msgid "Batch code"
msgstr "Losnummer"
-#: templates/js/table_filters.js:96 templates/js/table_filters.js:258
+#: templates/js/table_filters.js:96 templates/js/table_filters.js:263
msgid "Active parts"
msgstr "Aktive Teile"
@@ -6363,119 +6121,115 @@ msgstr "Aktive Teile"
msgid "Show stock for active parts"
msgstr "Bestand aktiver Teile anzeigen"
-#: templates/js/table_filters.js:101
+#: templates/js/table_filters.js:102
+msgid "Part is an assembly"
+msgstr "Teil ist eine Baugruppe"
+
+#: templates/js/table_filters.js:106
msgid "Is allocated"
msgstr "Ist zugeordnet"
-#: templates/js/table_filters.js:102
-msgid "Item has been alloacted"
-msgstr "Position wurde zugeordnet"
-
-#: templates/js/table_filters.js:106
-msgid "Include sublocations"
-msgstr "Unterlagerorte einschließen"
-
#: templates/js/table_filters.js:107
-msgid "Include stock in sublocations"
-msgstr "Bestand in Unterlagerorten einschließen"
+msgid "Item has been allocated"
+msgstr "Teil wurde zugeordnet"
+
+#: templates/js/table_filters.js:111
+msgid "Include sublocations"
+msgstr "Unter-Lagerorte einschließen"
#: templates/js/table_filters.js:112
-msgid "Show stock items which are depleted"
-msgstr "zeige aufgebrauchte Lagerobjekte "
+msgid "Include stock in sublocations"
+msgstr "Bestand in Unter-Lagerorten einschließen"
-#: templates/js/table_filters.js:119
-msgid "Show stock items which have expired"
-msgstr "Zeige überfällige Lagerobjekte"
+#: templates/js/table_filters.js:117
+msgid "Show stock items which are depleted"
+msgstr "Zeige aufgebrauchte BestandsObjekte"
#: templates/js/table_filters.js:124
-#, fuzzy
-#| msgid "Delete this Stock Item when stock is depleted"
-msgid "Show stock which is close to expiring"
-msgstr "Objekt löschen wenn Lagerbestand aufgebraucht"
+msgid "Show stock items which have expired"
+msgstr "Zeige abgelaufene BestandsObjekte"
-#: templates/js/table_filters.js:130
+#: templates/js/table_filters.js:129
+msgid "Show stock which is close to expiring"
+msgstr "Bestand, der bald ablaufen, anzeigen"
+
+#: templates/js/table_filters.js:135
msgid "Show items which are in stock"
msgstr "Zeige Objekte welche im Lager sind"
-#: templates/js/table_filters.js:134
+#: templates/js/table_filters.js:139
msgid "In Production"
msgstr "In Arbeit"
-#: templates/js/table_filters.js:135
-#, fuzzy
-#| msgid "Delete this Stock Item when stock is depleted"
+#: templates/js/table_filters.js:140
msgid "Show items which are in production"
-msgstr "Objekt löschen wenn Lagerbestand aufgebraucht"
+msgstr "Elemente, die in Produktion sind, anzeigen"
-#: templates/js/table_filters.js:139
+#: templates/js/table_filters.js:144
msgid "Include Variants"
msgstr "Varianten hinzufügen"
-#: templates/js/table_filters.js:140
-#, fuzzy
-#| msgid "Include stock items in sub locations"
-msgid "Include stock items for variant parts"
-msgstr "Lagerobjekte in untergeordneten Lagerorten einschließen"
-
#: templates/js/table_filters.js:145
-#, fuzzy
-#| msgid "Is this item installed in another item?"
-msgid "Show stock items which are installed in another item"
-msgstr "Ist dieses Teil in einem anderen verbaut?"
-
-#: templates/js/table_filters.js:149
-msgid "Sent to customer"
-msgstr "bereits zum Kunden geschickt"
+msgid "Include stock items for variant parts"
+msgstr "BestandsObjekte für Teil-Varianten einschließen"
#: templates/js/table_filters.js:150
+msgid "Show stock items which are installed in another item"
+msgstr "BestandsObjekte, die in anderen Elementen verbaut sind, anzeigen"
+
+#: templates/js/table_filters.js:154
+msgid "Sent to customer"
+msgstr "Zum Kunden geschickt"
+
+#: templates/js/table_filters.js:155
msgid "Show items which have been assigned to a customer"
msgstr "zeige zu Kunden zugeordnete Einträge"
-#: templates/js/table_filters.js:170 templates/js/table_filters.js:171
+#: templates/js/table_filters.js:175 templates/js/table_filters.js:176
msgid "Stock status"
msgstr "Bestandsstatus"
-#: templates/js/table_filters.js:204
+#: templates/js/table_filters.js:209
msgid "Build status"
msgstr "Bau-Status"
-#: templates/js/table_filters.js:223 templates/js/table_filters.js:240
+#: templates/js/table_filters.js:228 templates/js/table_filters.js:245
msgid "Order status"
msgstr "Bestellstatus"
-#: templates/js/table_filters.js:228 templates/js/table_filters.js:245
+#: templates/js/table_filters.js:233 templates/js/table_filters.js:250
msgid "Outstanding"
msgstr "ausstehend"
-#: templates/js/table_filters.js:268
+#: templates/js/table_filters.js:273
msgid "Include subcategories"
msgstr "Unterkategorien einschließen"
-#: templates/js/table_filters.js:269
+#: templates/js/table_filters.js:274
msgid "Include parts in subcategories"
msgstr "Teile in Unterkategorien einschließen"
-#: templates/js/table_filters.js:273
+#: templates/js/table_filters.js:278
msgid "Has IPN"
msgstr "Hat IPN"
-#: templates/js/table_filters.js:274
+#: templates/js/table_filters.js:279
msgid "Part has internal part number"
msgstr "Teil hat Interne Teilenummer"
-#: templates/js/table_filters.js:279
+#: templates/js/table_filters.js:284
msgid "Show active parts"
msgstr "Aktive Teile anzeigen"
-#: templates/js/table_filters.js:287
+#: templates/js/table_filters.js:292
msgid "Stock available"
msgstr "verfügbarer Lagerbestand"
-#: templates/js/table_filters.js:303
+#: templates/js/table_filters.js:308
msgid "Starred"
msgstr "Favorit"
-#: templates/js/table_filters.js:315
+#: templates/js/table_filters.js:320
msgid "Purchasable"
msgstr "Käuflich"
@@ -6532,7 +6286,7 @@ msgstr "Spalten"
msgid "All"
msgstr "Alle"
-#: templates/modals.html:14 templates/modals.html:39
+#: templates/modals.html:21 templates/modals.html:46
msgid "Form errors exist"
msgstr "Fehler in Formular"
@@ -6642,23 +6396,23 @@ msgstr "Test Reports drucken"
#: templates/stock_table.html:53
msgid "Add to selected stock items"
-msgstr "zu ausgewähltenLagerobjekten hinzufügen"
+msgstr "Zu ausgewählten BestandsObjekten hinzufügen"
#: templates/stock_table.html:54
msgid "Remove from selected stock items"
-msgstr "von ausgewählten Lagerobjekten entfernen"
+msgstr "Von ausgewählten BestandsObjekten entfernen"
#: templates/stock_table.html:55
msgid "Stocktake selected stock items"
-msgstr "Bestandsänderung gewählte Lagerobjekte"
+msgstr "Inventur für gewählte BestandsObjekte"
#: templates/stock_table.html:56
msgid "Move selected stock items"
-msgstr "ausgewählte Lagerobjekte bewegen"
+msgstr "Ausgewählte BestandsObjekte verschieben"
#: templates/stock_table.html:56
msgid "Move stock"
-msgstr "Bestand bewegen"
+msgstr "Bestand verschieben"
#: templates/stock_table.html:57
msgid "Order selected items"
@@ -6704,39 +6458,39 @@ msgstr "Berechtigungen"
msgid "Important dates"
msgstr "wichtige Daten"
-#: users/models.py:151
+#: users/models.py:153
msgid "Permission set"
msgstr "Berechtigung geändert"
-#: users/models.py:159
+#: users/models.py:161
msgid "Group"
msgstr "Gruppe"
-#: users/models.py:162
+#: users/models.py:164
msgid "View"
msgstr "Ansicht"
-#: users/models.py:162
+#: users/models.py:164
msgid "Permission to view items"
msgstr "Berechtigung Einträge anzuzeigen"
-#: users/models.py:164
+#: users/models.py:166
msgid "Add"
msgstr "Hinzufügen"
-#: users/models.py:164
+#: users/models.py:166
msgid "Permission to add items"
msgstr "Berechtigung Einträge zu erstellen"
-#: users/models.py:166
+#: users/models.py:168
msgid "Change"
msgstr "Ändern"
-#: users/models.py:166
+#: users/models.py:168
msgid "Permissions to edit items"
msgstr "Berechtigungen Einträge zu ändern"
-#: users/models.py:168
+#: users/models.py:170
msgid "Permission to delete items"
msgstr "Berechtigung Einträge zu löschen"
@@ -6756,12 +6510,7 @@ msgstr "Berechtigung Einträge zu löschen"
#, fuzzy
#~| msgid "Move Stock Items"
#~ msgid "Must provide valid StockItem(s)"
-#~ msgstr "Lagerobjekte bewegen"
-
-#, fuzzy
-#~| msgid "Add Line Item"
-#~ msgid "Line Items"
-#~ msgstr "Position hinzufügen"
+#~ msgstr "BestandsObjekt bewegen"
#~ msgid "Order Items"
#~ msgstr "Bestellungspositionen"
@@ -6840,10 +6589,10 @@ msgstr "Berechtigung Einträge zu löschen"
#~ msgstr "BOM validieren"
#~ msgid "Added stock to {n} items"
-#~ msgstr "Vorrat zu {n} Lagerobjekten hinzugefügt"
+#~ msgstr "Vorrat zu {n} BestandsObjekten hinzugefügt"
#~ msgid "Removed stock from {n} items"
-#~ msgstr "Vorrat von {n} Lagerobjekten entfernt"
+#~ msgstr "Vorrat von {n} BestandsObjekten entfernt"
#, fuzzy
#~| msgid "Confirm stock adjustment"
@@ -6874,10 +6623,10 @@ msgstr "Berechtigung Einträge zu löschen"
#~ msgstr "Ungültige Teileauswahl"
#~ msgid "Created {n} new stock items"
-#~ msgstr "{n} neue Lagerobjekte erstellt"
+#~ msgstr "{n} neue BestandsObjekt erstellt"
#~ msgid "Created new stock item"
-#~ msgstr "Neues Lagerobjekt erstellt"
+#~ msgstr "Neues BestandsObjekt erstellt"
#~ msgid "Statistics"
#~ msgstr "Statistiken"
@@ -6946,7 +6695,8 @@ msgstr "Berechtigung Einträge zu löschen"
#~ msgid ""
#~ "Where the following conditions are met, stock will be automatically "
#~ "allocated to this build"
-#~ msgstr "Keine Lagerobjekt gefunden, die diesem Bau zugewiesen werden können"
+#~ msgstr ""
+#~ "Keine BestandsObjekt gefunden, die diesem Bau zugewiesen werden können"
#, fuzzy
#~| msgid "Part is not a virtual part"
@@ -6956,12 +6706,12 @@ msgstr "Berechtigung Einträge zu löschen"
#, fuzzy
#~| msgid "Installed in Stock Item"
#~ msgid "Only single stock items exists"
-#~ msgstr "In Lagerobjekt installiert"
+#~ msgstr "In BestandsObjekt installiert"
#, fuzzy
#~| msgid "This stock item is allocated to Build"
#~ msgid "The stock item is not already allocated to this build"
-#~ msgstr "Dieses Lagerobjekt ist dem Bau zugewiesen"
+#~ msgstr "Dieses BestandsObjekt ist dem Bau zugewiesen"
#~ msgid "Warning: Build order allocation is not complete"
#~ msgstr "Warnung: Bau-Zuweisung ist unvollständig"
@@ -6970,7 +6720,7 @@ msgstr "Berechtigung Einträge zu löschen"
#~ "Build Order has not been fully allocated. Ensure that all Stock Items "
#~ "have been allocated to the Build"
#~ msgstr ""
-#~ "Bau-Zuweisung ist unvollständig. Sicherstellen, dass alle Lagerobjekte "
+#~ "Bau-Zuweisung ist unvollständig. Sicherstellen, dass alle BestandsObjekt "
#~ "dem Bau zugewiesen wurden"
#~ msgid "The following actions will be performed:"
@@ -7023,8 +6773,8 @@ msgstr "Berechtigung Einträge zu löschen"
#~ "Stock Items are selected for automatic allocation if there is only a "
#~ "single stock item available."
#~ msgstr ""
-#~ "Teile werden automatisch zugewiesen, wenn nur ein Lagerobjekt verfügbar "
-#~ "ist"
+#~ "Teile werden automatisch zugewiesen, wenn nur ein BestandsObjekt "
+#~ "verfügbar ist"
#~ msgid "Title"
#~ msgstr "Titel"
@@ -7089,7 +6839,7 @@ msgstr "Berechtigung Einträge zu löschen"
#, fuzzy
#~| msgid "Added stock to {n} items"
#~ msgid "Uninstall selected stock items"
-#~ msgstr "Vorrat zu {n} Lagerobjekten hinzugefügt"
+#~ msgstr "Vorrat zu {n} BestandsObjekten hinzugefügt"
#~ msgid "Order Multiple"
#~ msgstr "Bestellvielfaches"
@@ -7112,14 +6862,14 @@ msgstr "Berechtigung Einträge zu löschen"
#~| "quantity cannot be adjusted."
#~ msgid "Stock item is serialized and quantity cannot be adjusted"
#~ msgstr ""
-#~ "Dieses Lagerobjekt ist serialisiert. Es hat eine eindeutige Seriennummer "
-#~ "und die Anzahl kann nicht angepasst werden."
+#~ "Dieses BestandsObjekt ist serialisiert. Es hat eine eindeutige "
+#~ "Seriennummer und die Anzahl kann nicht angepasst werden."
#~ msgid "Used for Build"
#~ msgstr "Verwendet für Bau"
#~ msgid "Count stock items"
-#~ msgstr "Lagerobjekte zählen"
+#~ msgstr "BestandsObjekt zählen"
#~ msgid "Barcode successfully decoded"
#~ msgstr "Strichcode erfolgreich dekodiert"
@@ -7131,7 +6881,7 @@ msgstr "Berechtigung Einträge zu löschen"
#~ msgstr "Lagerort existiert nicht"
#~ msgid "StockItem does not exist"
-#~ msgstr "Lagerobjekt existiert nicht"
+#~ msgstr "BestandsObjekt existiert nicht"
#, fuzzy
#~| msgid "Add stock"
@@ -7144,7 +6894,7 @@ msgstr "Berechtigung Einträge zu löschen"
#~ msgstr "Aus Lagerbestand entfernen"
#~ msgid "Copy Stock Item"
-#~ msgstr "Lagerobjekt kopieren"
+#~ msgstr "BestandsObjekt kopieren"
#~ msgid "Part cannot be a variant of another part if it is already a template"
#~ msgstr ""
@@ -7161,6 +6911,3 @@ msgstr "Berechtigung Einträge zu löschen"
#~ msgid "Line"
#~ msgstr "Position"
-
-#~ msgid "URL"
-#~ msgstr "URL"
diff --git a/InvenTree/locale/en/LC_MESSAGES/django.po b/InvenTree/locale/en/LC_MESSAGES/django.po
index e13bb2fcdb..d229c67b45 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-03-09 11:11+0100\n"
+"POT-Creation-Date: 2021-03-28 16:04+0000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME \n"
"Language-Team: LANGUAGE \n"
@@ -58,7 +58,7 @@ msgstr ""
msgid "Select Category"
msgstr ""
-#: InvenTree/helpers.py:361 order/models.py:232 order/models.py:331
+#: InvenTree/helpers.py:361 order/models.py:242 order/models.py:341
#: stock/views.py:1762
msgid "Invalid quantity provided"
msgstr ""
@@ -106,7 +106,7 @@ msgid "User"
msgstr ""
#: InvenTree/models.py:106 label/models.py:101 part/models.py:685
-#: part/templates/part/params.html:27 report/models.py:162
+#: part/templates/part/params.html:27 report/models.py:179
#: templates/js/part.js:109
msgid "Name"
msgstr ""
@@ -172,7 +172,7 @@ msgid "Returned"
msgstr ""
#: InvenTree/status_codes.py:136
-#: order/templates/order/sales_order_base.html:121
+#: order/templates/order/sales_order_base.html:124
msgid "Shipped"
msgstr ""
@@ -317,8 +317,8 @@ msgstr ""
#: build/forms.py:85 build/templates/build/auto_allocate.html:17
#: build/templates/build/build_base.html:91
-#: build/templates/build/detail.html:31 common/models.py:682
-#: company/forms.py:112 company/templates/company/supplier_part_pricing.html:77
+#: build/templates/build/detail.html:31 common/models.py:696
+#: company/forms.py:130 company/templates/company/supplier_part_pricing.html:77
#: order/templates/order/order_wizard/select_parts.html:32
#: order/templates/order/purchase_order_detail.html:193
#: order/templates/order/sales_order_detail.html:77
@@ -326,11 +326,13 @@ msgstr ""
#: part/templates/part/allocation.html:19
#: part/templates/part/allocation.html:53
#: part/templates/part/sale_prices.html:85
-#: report/templates/report/inventree_build_order_base.html:117
+#: report/templates/report/inventree_build_order_base.html:114
+#: report/templates/report/inventree_po_report.html:91
+#: report/templates/report/inventree_so_report.html:91
#: report/templates/report/inventree_test_report_base.html:77
#: stock/forms.py:307 stock/templates/stock/item_base.html:51
#: stock/templates/stock/item_base.html:57
-#: stock/templates/stock/item_base.html:234
+#: stock/templates/stock/item_base.html:240
#: stock/templates/stock/stock_adjust.html:18 templates/js/barcode.js:364
#: templates/js/bom.js:205 templates/js/build.js:420 templates/js/build.js:954
#: templates/js/stock.js:952 templates/js/stock.js:1190
@@ -350,7 +352,7 @@ msgid "Enter serial numbers for build outputs"
msgstr ""
#: build/forms.py:98
-msgid "Confirm creation of build outut"
+msgid "Confirm creation of build output"
msgstr ""
#: build/forms.py:118
@@ -392,7 +394,7 @@ msgstr ""
#: build/models.py:65 build/templates/build/build_base.html:8
#: build/templates/build/build_base.html:35
#: part/templates/part/allocation.html:23
-#: report/templates/report/inventree_build_order_base.html:109
+#: report/templates/report/inventree_build_order_base.html:106
msgid "Build Order"
msgstr ""
@@ -411,7 +413,9 @@ msgid "Build Order Reference"
msgstr ""
#: build/models.py:127 order/templates/order/purchase_order_detail.html:188
-#: templates/js/bom.js:197 templates/js/build.js:509 templates/js/build.js:948
+#: report/templates/report/inventree_po_report.html:92
+#: report/templates/report/inventree_so_report.html:92 templates/js/bom.js:197
+#: templates/js/build.js:509 templates/js/build.js:948
msgid "Reference"
msgstr ""
@@ -421,8 +425,8 @@ msgstr ""
#: company/templates/company/supplier_part_detail.html:31 label/models.py:108
#: order/templates/order/purchase_order_detail.html:168 part/models.py:709
#: part/templates/part/detail.html:54 part/templates/part/set_category.html:14
-#: report/models.py:175
-#: report/templates/report/inventree_build_order_base.html:121
+#: report/models.py:192
+#: report/templates/report/inventree_build_order_base.html:118
#: templates/InvenTree/search.html:208
#: templates/InvenTree/settings/header.html:9 templates/js/bom.js:190
#: templates/js/build.js:677 templates/js/build.js:944
@@ -448,14 +452,16 @@ msgstr ""
#: build/models.py:152 build/templates/build/auto_allocate.html:16
#: build/templates/build/build_base.html:86
-#: build/templates/build/detail.html:26 order/models.py:652
+#: build/templates/build/detail.html:26 order/models.py:662
#: order/templates/order/order_wizard/select_parts.html:30
#: order/templates/order/purchase_order_detail.html:156
#: order/templates/order/receive_parts.html:19 part/models.py:320
#: part/templates/part/part_app_base.html:7 part/templates/part/related.html:29
#: part/templates/part/set_category.html:13
#: part/templates/part/subcategories.html:17
-#: report/templates/report/inventree_build_order_base.html:113
+#: report/templates/report/inventree_build_order_base.html:110
+#: report/templates/report/inventree_po_report.html:90
+#: report/templates/report/inventree_so_report.html:90
#: templates/InvenTree/search.html:111 templates/InvenTree/search.html:194
#: templates/js/barcode.js:362 templates/js/bom.js:163
#: templates/js/build.js:681 templates/js/build.js:921
@@ -527,7 +533,7 @@ msgstr ""
msgid "Batch code for this build output"
msgstr ""
-#: build/models.py:223 order/models.py:437
+#: build/models.py:223 order/models.py:447
msgid "Target completion date"
msgstr ""
@@ -543,7 +549,7 @@ msgstr ""
#: company/templates/company/supplier_part_base.html:77
#: company/templates/company/supplier_part_detail.html:28
#: part/templates/part/detail.html:83 part/templates/part/part_base.html:100
-#: stock/models.py:423 stock/templates/stock/item_base.html:324
+#: stock/models.py:423 stock/templates/stock/item_base.html:330
msgid "External Link"
msgstr ""
@@ -560,7 +566,7 @@ msgstr ""
#: order/templates/order/so_navbar.html:33
#: order/templates/order/so_navbar.html:36 part/models.py:869
#: part/templates/part/navbar.html:122
-#: report/templates/report/inventree_build_order_base.html:176
+#: report/templates/report/inventree_build_order_base.html:173
#: stock/forms.py:316 stock/forms.py:348 stock/forms.py:376 stock/models.py:495
#: stock/models.py:1663 stock/templates/stock/navbar.html:57
#: templates/js/barcode.js:37 templates/js/bom.js:329 templates/js/stock.js:128
@@ -606,11 +612,11 @@ msgstr ""
msgid "Allocated quantity ({n}) must not exceed available quantity ({q})"
msgstr ""
-#: build/models.py:1031 order/models.py:736
+#: build/models.py:1031 order/models.py:746
msgid "StockItem is over-allocated"
msgstr ""
-#: build/models.py:1035 order/models.py:739
+#: build/models.py:1035 order/models.py:749
msgid "Allocation quantity must be greater than zero"
msgstr ""
@@ -699,7 +705,7 @@ msgid ""
msgstr ""
#: build/templates/build/auto_allocate.html:18 stock/forms.py:346
-#: stock/templates/stock/item_base.html:264
+#: stock/templates/stock/item_base.html:270
#: stock/templates/stock/stock_adjust.html:17
#: templates/InvenTree/search.html:244 templates/js/barcode.js:363
#: templates/js/barcode.js:531 templates/js/build.js:434
@@ -724,7 +730,7 @@ msgid "This Build Order is a child of Build Order"
msgstr ""
#: build/templates/build/build_base.html:37
-#: company/templates/company/company_base.html:27
+#: company/templates/company/company_base.html:40
#: company/templates/company/supplier_part_base.html:25
#: order/templates/order/order_base.html:26
#: order/templates/order/sales_order_base.html:35
@@ -737,11 +743,11 @@ msgstr ""
#: build/templates/build/build_base.html:43
#: build/templates/build/build_base.html:108
#: order/templates/order/order_base.html:32
-#: order/templates/order/order_base.html:83
+#: order/templates/order/order_base.html:86
#: order/templates/order/sales_order_base.html:41
-#: order/templates/order/sales_order_base.html:83
-#: templates/js/table_filters.js:213 templates/js/table_filters.js:232
-#: templates/js/table_filters.js:249
+#: order/templates/order/sales_order_base.html:86
+#: templates/js/table_filters.js:218 templates/js/table_filters.js:237
+#: templates/js/table_filters.js:254
msgid "Overdue"
msgstr ""
@@ -777,7 +783,7 @@ msgstr ""
#: build/templates/build/build_base.html:96
#: build/templates/build/detail.html:59
#: order/templates/order/receive_parts.html:24
-#: stock/templates/stock/item_base.html:370 templates/InvenTree/search.html:236
+#: stock/templates/stock/item_base.html:376 templates/InvenTree/search.html:236
#: templates/js/barcode.js:119 templates/js/build.js:710
#: templates/js/order.js:187 templates/js/order.js:285
#: templates/js/stock.js:624 templates/js/stock.js:1198
@@ -786,9 +792,9 @@ msgstr ""
#: build/templates/build/build_base.html:104
#: build/templates/build/detail.html:121
-#: order/templates/order/order_base.html:121
-#: order/templates/order/sales_order_base.html:114
-#: report/templates/report/inventree_build_order_base.html:129
+#: order/templates/order/order_base.html:124
+#: order/templates/order/sales_order_base.html:117
+#: report/templates/report/inventree_build_order_base.html:126
#: templates/js/build.js:723 templates/js/order.js:200
#: templates/js/order.js:298
msgid "Target Date"
@@ -804,25 +810,28 @@ msgid "Progress"
msgstr ""
#: build/templates/build/build_base.html:128
-#: build/templates/build/detail.html:84 order/models.py:650
+#: build/templates/build/detail.html:84 order/models.py:660
#: order/templates/order/sales_order_base.html:9
#: order/templates/order/sales_order_base.html:33
#: order/templates/order/sales_order_ship.html:25
#: part/templates/part/allocation.html:30
-#: report/templates/report/inventree_build_order_base.html:139
-#: stock/templates/stock/item_base.html:258 templates/js/order.js:245
+#: report/templates/report/inventree_build_order_base.html:136
+#: report/templates/report/inventree_so_report.html:77
+#: stock/templates/stock/item_base.html:264 templates/js/order.js:245
msgid "Sales Order"
msgstr ""
#: build/templates/build/build_base.html:135
#: build/templates/build/detail.html:98
-#: report/templates/report/inventree_build_order_base.html:156
+#: report/templates/report/inventree_build_order_base.html:153
msgid "Issued By"
msgstr ""
#: build/templates/build/build_base.html:142
-#: build/templates/build/detail.html:105
-#: report/templates/report/inventree_build_order_base.html:162
+#: build/templates/build/detail.html:105 order/models.py:118
+#: order/templates/order/order_base.html:138
+#: order/templates/order/sales_order_base.html:138
+#: report/templates/report/inventree_build_order_base.html:159
msgid "Responsible"
msgstr ""
@@ -929,15 +938,15 @@ msgid "Destination location not specified"
msgstr ""
#: build/templates/build/detail.html:70
-#: stock/templates/stock/item_base.html:282 templates/js/stock.js:632
+#: stock/templates/stock/item_base.html:288 templates/js/stock.js:632
#: templates/js/stock.js:1205 templates/js/table_filters.js:85
-#: templates/js/table_filters.js:174
+#: templates/js/table_filters.js:179
msgid "Batch"
msgstr ""
#: build/templates/build/detail.html:116
-#: order/templates/order/order_base.html:108
-#: order/templates/order/sales_order_base.html:108 templates/js/build.js:718
+#: order/templates/order/order_base.html:111
+#: order/templates/order/sales_order_base.html:111 templates/js/build.js:718
msgid "Created"
msgstr ""
@@ -967,14 +976,14 @@ msgid "Print Build Orders"
msgstr ""
#: build/templates/build/index.html:43
-#: order/templates/order/purchase_orders.html:22
-#: order/templates/order/sales_orders.html:22
+#: order/templates/order/purchase_orders.html:27
+#: order/templates/order/sales_orders.html:27
msgid "Display calendar view"
msgstr ""
#: build/templates/build/index.html:46
-#: order/templates/order/purchase_orders.html:25
-#: order/templates/order/sales_orders.html:25
+#: order/templates/order/purchase_orders.html:30
+#: order/templates/order/sales_orders.html:30
msgid "Display list view"
msgstr ""
@@ -1161,7 +1170,7 @@ msgstr ""
msgid "Add Build Order Attachment"
msgstr ""
-#: build/views.py:1062 order/views.py:107 order/views.py:159 part/views.py:167
+#: build/views.py:1062 order/views.py:107 order/views.py:159 part/views.py:172
#: stock/views.py:277
msgid "Added attachment"
msgstr ""
@@ -1215,294 +1224,310 @@ msgid "Default currency"
msgstr ""
#: common/models.py:82
-msgid "Barcode Support"
+msgid "Download from URL"
msgstr ""
#: common/models.py:83
-msgid "Enable barcode scanner support"
+msgid "Allow download of remote images and files from external URL"
msgstr ""
#: common/models.py:89
-msgid "IPN Regex"
+msgid "Barcode Support"
msgstr ""
#: common/models.py:90
+msgid "Enable barcode scanner support"
+msgstr ""
+
+#: common/models.py:96
+msgid "IPN Regex"
+msgstr ""
+
+#: common/models.py:97
msgid "Regular expression pattern for matching Part IPN"
msgstr ""
-#: common/models.py:94
+#: common/models.py:101
msgid "Allow Duplicate IPN"
msgstr ""
-#: common/models.py:95
+#: common/models.py:102
msgid "Allow multiple parts to share the same IPN"
msgstr ""
-#: common/models.py:101
-msgid "Copy Part BOM Data"
-msgstr ""
-
-#: common/models.py:102
-msgid "Copy BOM data by default when duplicating a part"
-msgstr ""
-
#: common/models.py:108
-msgid "Copy Part Parameter Data"
+msgid "Allow Editing IPN"
msgstr ""
#: common/models.py:109
-msgid "Copy parameter data by default when duplicating a part"
+msgid "Allow changing the IPN value while editing a part"
msgstr ""
#: common/models.py:115
-msgid "Copy Part Test Data"
+msgid "Copy Part BOM Data"
msgstr ""
#: common/models.py:116
-msgid "Copy test data by default when duplicating a part"
+msgid "Copy BOM data by default when duplicating a part"
msgstr ""
#: common/models.py:122
-msgid "Copy Category Parameter Templates"
+msgid "Copy Part Parameter Data"
msgstr ""
#: common/models.py:123
-msgid "Copy category parameter templates when creating a part"
+msgid "Copy parameter data by default when duplicating a part"
msgstr ""
#: common/models.py:129
-msgid "Recent Part Count"
+msgid "Copy Part Test Data"
msgstr ""
#: common/models.py:130
-msgid "Number of recent parts to display on index page"
+msgid "Copy test data by default when duplicating a part"
msgstr ""
-#: common/models.py:136 part/templates/part/detail.html:160
-#: report/models.py:168 stock/forms.py:258 templates/js/table_filters.js:24
-#: templates/js/table_filters.js:283
-msgid "Template"
+#: common/models.py:136
+msgid "Copy Category Parameter Templates"
msgstr ""
#: common/models.py:137
-msgid "Parts are templates by default"
+msgid "Copy category parameter templates when creating a part"
msgstr ""
-#: common/models.py:143 part/models.py:832 part/templates/part/detail.html:170
-#: templates/js/table_filters.js:295
-msgid "Assembly"
+#: common/models.py:143
+msgid "Recent Part Count"
msgstr ""
#: common/models.py:144
-msgid "Parts can be assembled from other components by default"
+msgid "Number of recent parts to display on index page"
msgstr ""
-#: common/models.py:150 part/models.py:838 part/templates/part/detail.html:180
-#: templates/js/table_filters.js:299
-msgid "Component"
+#: common/models.py:150 part/templates/part/detail.html:160
+#: report/models.py:185 stock/forms.py:258 templates/js/table_filters.js:24
+#: templates/js/table_filters.js:288
+msgid "Template"
msgstr ""
#: common/models.py:151
-msgid "Parts can be used as sub-components by default"
+msgid "Parts are templates by default"
msgstr ""
-#: common/models.py:157 part/models.py:849 part/templates/part/detail.html:200
-msgid "Purchaseable"
+#: common/models.py:157 part/models.py:832 part/templates/part/detail.html:170
+#: templates/js/table_filters.js:101 templates/js/table_filters.js:300
+msgid "Assembly"
msgstr ""
#: common/models.py:158
-msgid "Parts are purchaseable by default"
+msgid "Parts can be assembled from other components by default"
msgstr ""
-#: common/models.py:164 part/models.py:854 part/templates/part/detail.html:210
-#: templates/js/table_filters.js:307
-msgid "Salable"
+#: common/models.py:164 part/models.py:838 part/templates/part/detail.html:180
+#: templates/js/table_filters.js:304
+msgid "Component"
msgstr ""
#: common/models.py:165
-msgid "Parts are salable by default"
+msgid "Parts can be used as sub-components by default"
msgstr ""
-#: common/models.py:171 part/models.py:844 part/templates/part/detail.html:190
-#: templates/js/table_filters.js:32 templates/js/table_filters.js:311
-msgid "Trackable"
+#: common/models.py:171 part/models.py:849 part/templates/part/detail.html:200
+msgid "Purchaseable"
msgstr ""
#: common/models.py:172
+msgid "Parts are purchaseable by default"
+msgstr ""
+
+#: common/models.py:178 part/models.py:854 part/templates/part/detail.html:210
+#: templates/js/table_filters.js:312
+msgid "Salable"
+msgstr ""
+
+#: common/models.py:179
+msgid "Parts are salable by default"
+msgstr ""
+
+#: common/models.py:185 part/models.py:844 part/templates/part/detail.html:190
+#: templates/js/table_filters.js:32 templates/js/table_filters.js:316
+msgid "Trackable"
+msgstr ""
+
+#: common/models.py:186
msgid "Parts are trackable by default"
msgstr ""
-#: common/models.py:178 part/models.py:864 part/templates/part/detail.html:150
+#: common/models.py:192 part/models.py:864 part/templates/part/detail.html:150
#: templates/js/table_filters.js:28
msgid "Virtual"
msgstr ""
-#: common/models.py:179
+#: common/models.py:193
msgid "Parts are virtual by default"
msgstr ""
-#: common/models.py:185
+#: common/models.py:199
msgid "Show Quantity in Forms"
msgstr ""
-#: common/models.py:186
+#: common/models.py:200
msgid "Display available part quantity in some forms"
msgstr ""
-#: common/models.py:192
+#: common/models.py:206
msgid "Debug Mode"
msgstr ""
-#: common/models.py:193
+#: common/models.py:207
msgid "Generate reports in debug mode (HTML output)"
msgstr ""
-#: common/models.py:199
+#: common/models.py:213
msgid "Page Size"
msgstr ""
-#: common/models.py:200
+#: common/models.py:214
msgid "Default page size for PDF reports"
msgstr ""
-#: common/models.py:210
+#: common/models.py:224
msgid "Test Reports"
msgstr ""
-#: common/models.py:211
+#: common/models.py:225
msgid "Enable generation of test reports"
msgstr ""
-#: common/models.py:217
+#: common/models.py:231
msgid "Stock Expiry"
msgstr ""
-#: common/models.py:218
+#: common/models.py:232
msgid "Enable stock expiry functionality"
msgstr ""
-#: common/models.py:224
+#: common/models.py:238
msgid "Sell Expired Stock"
msgstr ""
-#: common/models.py:225
+#: common/models.py:239
msgid "Allow sale of expired stock"
msgstr ""
-#: common/models.py:231
+#: common/models.py:245
msgid "Stock Stale Time"
msgstr ""
-#: common/models.py:232
+#: common/models.py:246
msgid "Number of days stock items are considered stale before expiring"
msgstr ""
-#: common/models.py:234 part/templates/part/detail.html:121
+#: common/models.py:248 part/templates/part/detail.html:121
msgid "days"
msgstr ""
-#: common/models.py:239
+#: common/models.py:253
msgid "Build Expired Stock"
msgstr ""
-#: common/models.py:240
+#: common/models.py:254
msgid "Allow building with expired stock"
msgstr ""
-#: common/models.py:246
+#: common/models.py:260
msgid "Stock Ownership Control"
msgstr ""
-#: common/models.py:247
+#: common/models.py:261
msgid "Enable ownership control over stock locations and items"
msgstr ""
-#: common/models.py:253
+#: common/models.py:267
msgid "Group by Part"
msgstr ""
-#: common/models.py:254
+#: common/models.py:268
msgid "Group stock items by part reference in table views"
msgstr ""
-#: common/models.py:260
+#: common/models.py:274
msgid "Recent Stock Count"
msgstr ""
-#: common/models.py:261
+#: common/models.py:275
msgid "Number of recent stock items to display on index page"
msgstr ""
-#: common/models.py:267
+#: common/models.py:281
msgid "Build Order Reference Prefix"
msgstr ""
-#: common/models.py:268
+#: common/models.py:282
msgid "Prefix value for build order reference"
msgstr ""
-#: common/models.py:273
+#: common/models.py:287
msgid "Build Order Reference Regex"
msgstr ""
-#: common/models.py:274
+#: common/models.py:288
msgid "Regular expression pattern for matching build order reference"
msgstr ""
-#: common/models.py:278
+#: common/models.py:292
msgid "Sales Order Reference Prefix"
msgstr ""
-#: common/models.py:279
+#: common/models.py:293
msgid "Prefix value for sales order reference"
msgstr ""
-#: common/models.py:284
+#: common/models.py:298
msgid "Purchase Order Reference Prefix"
msgstr ""
-#: common/models.py:285
+#: common/models.py:299
msgid "Prefix value for purchase order reference"
msgstr ""
-#: common/models.py:508
+#: common/models.py:522
msgid "Settings key (must be unique - case insensitive"
msgstr ""
-#: common/models.py:510
+#: common/models.py:524
msgid "Settings value"
msgstr ""
-#: common/models.py:545
+#: common/models.py:559
msgid "Must be an integer value"
msgstr ""
-#: common/models.py:568
+#: common/models.py:582
msgid "Value must be a boolean value"
msgstr ""
-#: common/models.py:579
+#: common/models.py:593
msgid "Value must be an integer value"
msgstr ""
-#: common/models.py:602
+#: common/models.py:616
msgid "Key string must be unique"
msgstr ""
-#: common/models.py:683 company/forms.py:113
+#: common/models.py:697 company/forms.py:131
msgid "Price break quantity"
msgstr ""
-#: common/models.py:691 company/templates/company/supplier_part_pricing.html:82
+#: common/models.py:705 company/templates/company/supplier_part_pricing.html:82
#: part/templates/part/sale_prices.html:90 templates/js/bom.js:255
msgid "Price"
msgstr ""
-#: common/models.py:692
+#: common/models.py:706
msgid "Unit price at specified quantity"
msgstr ""
-#: common/models.py:715
+#: common/models.py:729
msgid "Default"
msgstr ""
@@ -1526,11 +1551,19 @@ msgstr ""
msgid "Default currency used for this company"
msgstr ""
-#: company/forms.py:80
+#: company/forms.py:75 part/forms.py:46
+msgid "URL"
+msgstr ""
+
+#: company/forms.py:76 part/forms.py:47
+msgid "Image URL"
+msgstr ""
+
+#: company/forms.py:98
msgid "Single Price"
msgstr ""
-#: company/forms.py:82
+#: company/forms.py:100
msgid "Single quantity price"
msgstr ""
@@ -1542,7 +1575,7 @@ msgstr ""
msgid "Description of the company"
msgstr ""
-#: company/models.py:100 company/templates/company/company_base.html:57
+#: company/models.py:100 company/templates/company/company_base.html:70
#: company/templates/company/detail.html:31 templates/js/company.js:60
msgid "Website"
msgstr ""
@@ -1551,7 +1584,7 @@ msgstr ""
msgid "Company website URL"
msgstr ""
-#: company/models.py:103 company/templates/company/company_base.html:64
+#: company/models.py:103 company/templates/company/company_base.html:77
msgid "Address"
msgstr ""
@@ -1567,7 +1600,7 @@ msgstr ""
msgid "Contact phone number"
msgstr ""
-#: company/models.py:111 company/templates/company/company_base.html:78
+#: company/models.py:111 company/templates/company/company_base.html:91
msgid "Email"
msgstr ""
@@ -1575,7 +1608,7 @@ msgstr ""
msgid "Contact email address"
msgstr ""
-#: company/models.py:114 company/templates/company/company_base.html:85
+#: company/models.py:114 company/templates/company/company_base.html:98
msgid "Contact"
msgstr ""
@@ -1604,7 +1637,7 @@ msgid "Currency"
msgstr ""
#: company/models.py:313 stock/models.py:370
-#: stock/templates/stock/item_base.html:214
+#: stock/templates/stock/item_base.html:220
msgid "Base Part"
msgstr ""
@@ -1615,9 +1648,9 @@ msgstr ""
#: company/models.py:323 company/templates/company/detail.html:60
#: company/templates/company/supplier_part_base.html:83
#: company/templates/company/supplier_part_detail.html:25
-#: order/templates/order/order_base.html:89
+#: order/templates/order/order_base.html:92
#: order/templates/order/order_wizard/select_pos.html:30 part/bom.py:170
-#: stock/templates/stock/item_base.html:331 templates/js/company.js:48
+#: stock/templates/stock/item_base.html:337 templates/js/company.js:48
#: templates/js/company.js:164 templates/js/order.js:170
msgid "Supplier"
msgstr ""
@@ -1659,7 +1692,7 @@ msgid "Manufacturer part number"
msgstr ""
#: company/models.py:353 part/models.py:742
-#: report/templates/report/inventree_build_order_base.html:168
+#: report/templates/report/inventree_build_order_base.html:165
#: templates/js/company.js:208 templates/js/part.js:430
msgid "Link"
msgstr ""
@@ -1674,6 +1707,8 @@ msgstr ""
#: company/models.py:365 company/templates/company/supplier_part_base.html:113
#: company/templates/company/supplier_part_detail.html:38
+#: report/templates/report/inventree_po_report.html:93
+#: report/templates/report/inventree_so_report.html:93
msgid "Note"
msgstr ""
@@ -1691,19 +1726,29 @@ msgstr ""
msgid "Assigned Stock"
msgstr ""
-#: company/templates/company/company_base.html:7
-#: company/templates/company/company_base.html:22
+#: company/templates/company/company_base.html:9
+#: company/templates/company/company_base.html:35
#: templates/InvenTree/search.html:288 templates/js/company.js:33
msgid "Company"
msgstr ""
-#: company/templates/company/company_base.html:51
+#: company/templates/company/company_base.html:25
+#: part/templates/part/part_thumb.html:21
+msgid "Upload new image"
+msgstr ""
+
+#: company/templates/company/company_base.html:27
+#: part/templates/part/part_thumb.html:23
+msgid "Download image from URL"
+msgstr ""
+
+#: company/templates/company/company_base.html:64
#: company/templates/company/detail.html:10
#: company/templates/company/navbar.html:12
msgid "Company Details"
msgstr ""
-#: company/templates/company/company_base.html:71
+#: company/templates/company/company_base.html:84
msgid "Phone"
msgstr ""
@@ -1720,8 +1765,8 @@ msgid "Uses default currency"
msgstr ""
#: company/templates/company/detail.html:65
-#: order/templates/order/sales_order_base.html:89 stock/models.py:412
-#: stock/models.py:413 stock/templates/stock/item_base.html:241
+#: order/templates/order/sales_order_base.html:92 stock/models.py:412
+#: stock/models.py:413 stock/templates/stock/item_base.html:247
#: templates/js/company.js:40 templates/js/order.js:267
msgid "Customer"
msgstr ""
@@ -1770,23 +1815,23 @@ msgstr ""
msgid "Create new Part"
msgstr ""
-#: company/templates/company/detail_part.html:72 company/views.py:56
-#: order/templates/order/purchase_orders.html:164
+#: company/templates/company/detail_part.html:72 company/views.py:62
+#: order/templates/order/purchase_orders.html:182
#: part/templates/part/supplier.html:50
msgid "New Supplier"
msgstr ""
-#: company/templates/company/detail_part.html:73 company/views.py:195
-#: order/templates/order/purchase_orders.html:165
+#: company/templates/company/detail_part.html:73 company/views.py:279
+#: order/templates/order/purchase_orders.html:183
msgid "Create new Supplier"
msgstr ""
-#: company/templates/company/detail_part.html:78 company/views.py:63
+#: company/templates/company/detail_part.html:78 company/views.py:69
#: part/templates/part/supplier.html:56
msgid "New Manufacturer"
msgstr ""
-#: company/templates/company/detail_part.html:79 company/views.py:198
+#: company/templates/company/detail_part.html:79 company/views.py:282
msgid "Create new Manufacturer"
msgstr ""
@@ -1897,28 +1942,28 @@ msgid "Are you sure you want to delete the following Supplier Parts?"
msgstr ""
#: company/templates/company/purchase_orders.html:18
-#: order/templates/order/purchase_orders.html:19
+#: order/templates/order/purchase_orders.html:20
msgid "Create new purchase order"
msgstr ""
#: company/templates/company/purchase_orders.html:19
-#: order/templates/order/purchase_orders.html:20
+#: order/templates/order/purchase_orders.html:21
msgid "New Purchase Order"
msgstr ""
#: company/templates/company/sales_orders.html:19
-#: order/templates/order/sales_orders.html:19
+#: order/templates/order/sales_orders.html:20
msgid "Create new sales order"
msgstr ""
#: company/templates/company/sales_orders.html:20
-#: order/templates/order/sales_orders.html:20
+#: order/templates/order/sales_orders.html:21
msgid "New Sales Order"
msgstr ""
#: company/templates/company/supplier_part_base.html:6
#: company/templates/company/supplier_part_base.html:19 stock/models.py:379
-#: stock/templates/stock/item_base.html:336 templates/js/company.js:180
+#: stock/templates/stock/item_base.html:342 templates/js/company.js:180
msgid "Supplier Part"
msgstr ""
@@ -1946,7 +1991,7 @@ msgid "Internal Part"
msgstr ""
#: company/templates/company/supplier_part_base.html:106 stock/models.py:394
-#: stock/templates/stock/item_base.html:289 templates/js/stock.js:663
+#: stock/templates/stock/item_base.html:295 templates/js/stock.js:663
msgid "Packaging"
msgstr ""
@@ -1959,8 +2004,8 @@ msgstr ""
msgid "Pricing Information"
msgstr ""
-#: company/templates/company/supplier_part_pricing.html:19 company/views.py:485
-#: part/templates/part/sale_prices.html:17 part/views.py:2511
+#: company/templates/company/supplier_part_pricing.html:19 company/views.py:569
+#: part/templates/part/sale_prices.html:17 part/views.py:2618
msgid "Add Price Break"
msgstr ""
@@ -1979,95 +2024,107 @@ msgstr ""
msgid "Delete price break"
msgstr ""
-#: company/views.py:55 part/templates/part/navbar.html:72
+#: company/views.py:61 part/templates/part/navbar.html:72
#: part/templates/part/navbar.html:75 templates/InvenTree/search.html:291
#: templates/navbar.html:35
msgid "Suppliers"
msgstr ""
-#: company/views.py:62 templates/InvenTree/search.html:308
+#: company/views.py:68 templates/InvenTree/search.html:308
#: templates/navbar.html:36
msgid "Manufacturers"
msgstr ""
-#: company/views.py:69 templates/InvenTree/search.html:321
+#: company/views.py:75 templates/InvenTree/search.html:321
#: templates/navbar.html:45
msgid "Customers"
msgstr ""
-#: company/views.py:70
+#: company/views.py:76 order/templates/order/sales_orders.html:184
msgid "New Customer"
msgstr ""
-#: company/views.py:78
+#: company/views.py:84
msgid "Companies"
msgstr ""
-#: company/views.py:79
+#: company/views.py:85
msgid "New Company"
msgstr ""
-#: company/views.py:157
+#: company/views.py:167 part/views.py:848
+msgid "Download Image"
+msgstr ""
+
+#: company/views.py:196 part/views.py:880
+msgid "Image size exceeds maximum allowable size for download"
+msgstr ""
+
+#: company/views.py:212 part/views.py:896
+msgid "Supplied URL is not a valid image file"
+msgstr ""
+
+#: company/views.py:241
msgid "Update Company Image"
msgstr ""
-#: company/views.py:163
+#: company/views.py:247
msgid "Updated company image"
msgstr ""
-#: company/views.py:173
+#: company/views.py:257
msgid "Edit Company"
msgstr ""
-#: company/views.py:178
+#: company/views.py:262
msgid "Edited company information"
msgstr ""
-#: company/views.py:201
+#: company/views.py:285 order/templates/order/sales_orders.html:185
msgid "Create new Customer"
msgstr ""
-#: company/views.py:203
+#: company/views.py:287
msgid "Create new Company"
msgstr ""
-#: company/views.py:230
+#: company/views.py:314
msgid "Created new company"
msgstr ""
-#: company/views.py:240
+#: company/views.py:324
msgid "Delete Company"
msgstr ""
-#: company/views.py:246
+#: company/views.py:330
msgid "Company was deleted"
msgstr ""
-#: company/views.py:271
+#: company/views.py:355
msgid "Edit Supplier Part"
msgstr ""
-#: company/views.py:294 templates/js/stock.js:1083
+#: company/views.py:378 templates/js/stock.js:1083
msgid "Create new Supplier Part"
msgstr ""
-#: company/views.py:413
+#: company/views.py:497
msgid "Delete Supplier Part"
msgstr ""
-#: company/views.py:490 part/views.py:2515
+#: company/views.py:574 part/views.py:2622
msgid "Added new price break"
msgstr ""
-#: company/views.py:546 part/views.py:2559
+#: company/views.py:630 part/views.py:2666
msgid "Edit Price Break"
msgstr ""
-#: company/views.py:561 part/views.py:2573
+#: company/views.py:645 part/views.py:2680
msgid "Delete Price Break"
msgstr ""
-#: label/api.py:56 report/api.py:162
+#: label/api.py:56 report/api.py:201
msgid "No valid objects provided to template"
msgstr ""
@@ -2087,7 +2144,7 @@ msgstr ""
msgid "Label template file"
msgstr ""
-#: label/models.py:123 report/models.py:257
+#: label/models.py:123 report/models.py:274
msgid "Enabled"
msgstr ""
@@ -2111,24 +2168,25 @@ msgstr ""
msgid "Query filters (comma-separated list of key=value pairs"
msgstr ""
-#: label/models.py:223 label/models.py:274 report/models.py:277
+#: label/models.py:223 label/models.py:274 report/models.py:294
+#: report/models.py:415 report/models.py:449
msgid "Filters"
msgstr ""
-#: order/forms.py:25 order/templates/order/order_base.html:44
+#: order/forms.py:25 order/templates/order/order_base.html:47
msgid "Place order"
msgstr ""
-#: order/forms.py:36 order/templates/order/order_base.html:51
+#: order/forms.py:36 order/templates/order/order_base.html:54
msgid "Mark order as complete"
msgstr ""
-#: order/forms.py:47 order/forms.py:58 order/templates/order/order_base.html:56
-#: order/templates/order/sales_order_base.html:56
+#: order/forms.py:47 order/forms.py:58 order/templates/order/order_base.html:59
+#: order/templates/order/sales_order_base.html:59
msgid "Cancel order"
msgstr ""
-#: order/forms.py:69 order/templates/order/sales_order_base.html:53
+#: order/forms.py:69 order/templates/order/sales_order_base.html:56
msgid "Ship order"
msgstr ""
@@ -2144,153 +2202,158 @@ msgstr ""
msgid "Target date for order delivery. Order will be overdue after this date."
msgstr ""
-#: order/forms.py:134
+#: order/forms.py:135
msgid "Enter sales order number"
msgstr ""
-#: order/forms.py:140 order/models.py:438
+#: order/forms.py:141 order/models.py:448
msgid ""
"Target date for order completion. Order will be overdue after this date."
msgstr ""
-#: order/models.py:98
+#: order/models.py:99
msgid "Order reference"
msgstr ""
-#: order/models.py:100
+#: order/models.py:101
msgid "Order description"
msgstr ""
-#: order/models.py:102
+#: order/models.py:103
msgid "Link to external page"
msgstr ""
-#: order/models.py:112
+#: order/models.py:117
+msgid "User or group responsible for this order"
+msgstr ""
+
+#: order/models.py:122
msgid "Order notes"
msgstr ""
-#: order/models.py:171 order/models.py:431
+#: order/models.py:181 order/models.py:441
msgid "Purchase order status"
msgstr ""
-#: order/models.py:179
+#: order/models.py:189
msgid "Company from which the items are being ordered"
msgstr ""
-#: order/models.py:182
+#: order/models.py:192
msgid "Supplier order reference code"
msgstr ""
-#: order/models.py:193
+#: order/models.py:203
msgid "Issue Date"
msgstr ""
-#: order/models.py:194
+#: order/models.py:204
msgid "Date order was issued"
msgstr ""
-#: order/models.py:199
+#: order/models.py:209
msgid "Target Delivery Date"
msgstr ""
-#: order/models.py:200
+#: order/models.py:210
msgid ""
"Expected date for order delivery. Order will be overdue after this date."
msgstr ""
-#: order/models.py:205
+#: order/models.py:215
msgid "Completion Date"
msgstr ""
-#: order/models.py:206
+#: order/models.py:216
msgid "Date order was completed"
msgstr ""
-#: order/models.py:230 order/models.py:329 part/views.py:1479
+#: order/models.py:240 order/models.py:339 part/views.py:1586
#: stock/models.py:269 stock/models.py:948
msgid "Quantity must be greater than zero"
msgstr ""
-#: order/models.py:235
+#: order/models.py:245
msgid "Part supplier must match PO supplier"
msgstr ""
-#: order/models.py:324
+#: order/models.py:334
msgid "Lines can only be received against an order marked as 'Placed'"
msgstr ""
-#: order/models.py:346
+#: order/models.py:356
msgid "Received items"
msgstr ""
-#: order/models.py:427
+#: order/models.py:437
msgid "Company to which the items are being sold"
msgstr ""
-#: order/models.py:433
+#: order/models.py:443
msgid "Customer order reference code"
msgstr ""
-#: order/models.py:491
+#: order/models.py:501
msgid "SalesOrder cannot be shipped as it is not currently pending"
msgstr ""
-#: order/models.py:578
+#: order/models.py:588
msgid "Item quantity"
msgstr ""
-#: order/models.py:580
+#: order/models.py:590
msgid "Line item reference"
msgstr ""
-#: order/models.py:582
+#: order/models.py:592
msgid "Line item notes"
msgstr ""
-#: order/models.py:608 order/templates/order/order_base.html:9
+#: order/models.py:618 order/templates/order/order_base.html:9
#: order/templates/order/order_base.html:24
-#: stock/templates/stock/item_base.html:303 templates/js/order.js:148
+#: report/templates/report/inventree_po_report.html:77
+#: stock/templates/stock/item_base.html:309 templates/js/order.js:148
msgid "Purchase Order"
msgstr ""
-#: order/models.py:621
+#: order/models.py:631
msgid "Supplier part"
msgstr ""
-#: order/models.py:624
+#: order/models.py:634
msgid "Number of items received"
msgstr ""
-#: order/models.py:631 stock/models.py:505
-#: stock/templates/stock/item_base.html:310
+#: order/models.py:641 stock/models.py:505
+#: stock/templates/stock/item_base.html:316
msgid "Purchase Price"
msgstr ""
-#: order/models.py:632
+#: order/models.py:642
msgid "Unit purchase price"
msgstr ""
-#: order/models.py:727
+#: order/models.py:737
msgid "Cannot allocate stock item to a line with a different part"
msgstr ""
-#: order/models.py:729
+#: order/models.py:739
msgid "Cannot allocate stock to a line without a part"
msgstr ""
-#: order/models.py:732
+#: order/models.py:742
msgid "Allocation quantity cannot exceed stock quantity"
msgstr ""
-#: order/models.py:742
+#: order/models.py:752
msgid "Quantity must be 1 for serialized stock item"
msgstr ""
-#: order/models.py:758
+#: order/models.py:768
msgid "Select stock item to allocate"
msgstr ""
-#: order/models.py:761
+#: order/models.py:771
msgid "Enter stock allocation quantity"
msgstr ""
@@ -2300,46 +2363,51 @@ msgstr ""
msgid "Are you sure you want to delete this attachment?"
msgstr ""
-#: order/templates/order/order_base.html:40
+#: order/templates/order/order_base.html:39
+#: order/templates/order/sales_order_base.html:48
+msgid "Print"
+msgstr ""
+
+#: order/templates/order/order_base.html:43
msgid "Edit order information"
msgstr ""
-#: order/templates/order/order_base.html:48
+#: order/templates/order/order_base.html:51
msgid "Receive items"
msgstr ""
-#: order/templates/order/order_base.html:61
+#: order/templates/order/order_base.html:64
msgid "Export order to file"
msgstr ""
-#: order/templates/order/order_base.html:69
+#: order/templates/order/order_base.html:72
#: order/templates/order/po_navbar.html:11
msgid "Purchase Order Details"
msgstr ""
-#: order/templates/order/order_base.html:74
-#: order/templates/order/sales_order_base.html:74
+#: order/templates/order/order_base.html:77
+#: order/templates/order/sales_order_base.html:77
msgid "Order Reference"
msgstr ""
-#: order/templates/order/order_base.html:79
-#: order/templates/order/sales_order_base.html:79
+#: order/templates/order/order_base.html:82
+#: order/templates/order/sales_order_base.html:82
msgid "Order Status"
msgstr ""
-#: order/templates/order/order_base.html:95 templates/js/order.js:179
+#: order/templates/order/order_base.html:98 templates/js/order.js:179
msgid "Supplier Reference"
msgstr ""
-#: order/templates/order/order_base.html:114
-#: report/templates/report/inventree_build_order_base.html:125
+#: order/templates/order/order_base.html:117
+#: report/templates/report/inventree_build_order_base.html:122
msgid "Issued"
msgstr ""
-#: order/templates/order/order_base.html:128
+#: order/templates/order/order_base.html:131
#: order/templates/order/purchase_order_detail.html:207
#: order/templates/order/receive_parts.html:22
-#: order/templates/order/sales_order_base.html:128
+#: order/templates/order/sales_order_base.html:131
msgid "Received"
msgstr ""
@@ -2451,6 +2519,11 @@ msgstr ""
msgid "Receive line item"
msgstr ""
+#: order/templates/order/purchase_orders.html:24
+#: order/templates/order/sales_orders.html:24
+msgid "Print Order Reports"
+msgstr ""
+
#: order/templates/order/receive_parts.html:8
msgid "Receive outstanding parts for"
msgstr ""
@@ -2480,16 +2553,16 @@ msgstr ""
msgid "This SalesOrder has not been fully allocated"
msgstr ""
-#: order/templates/order/sales_order_base.html:61
+#: order/templates/order/sales_order_base.html:64
msgid "Packing List"
msgstr ""
-#: order/templates/order/sales_order_base.html:69
+#: order/templates/order/sales_order_base.html:72
#: order/templates/order/so_navbar.html:12
msgid "Sales Order Details"
msgstr ""
-#: order/templates/order/sales_order_base.html:95 templates/js/order.js:275
+#: order/templates/order/sales_order_base.html:98 templates/js/order.js:275
msgid "Customer Reference"
msgstr ""
@@ -2507,7 +2580,7 @@ msgstr ""
#: order/templates/order/sales_order_detail.html:75
#: order/templates/order/sales_order_detail.html:157
#: report/templates/report/inventree_test_report_base.html:75
-#: stock/models.py:417 stock/templates/stock/item_base.html:228
+#: stock/models.py:417 stock/templates/stock/item_base.html:234
#: templates/js/build.js:418
msgid "Serial Number"
msgstr ""
@@ -2727,136 +2800,136 @@ msgstr ""
msgid "Available Stock"
msgstr ""
-#: part/bom.py:274
+#: part/bom.py:278
#, python-brace-format
msgid "Unsupported file format: {f}"
msgstr ""
-#: part/bom.py:279
+#: part/bom.py:283
msgid "Error reading BOM file (invalid data)"
msgstr ""
-#: part/bom.py:281
+#: part/bom.py:285
msgid "Error reading BOM file (incorrect row size)"
msgstr ""
-#: part/forms.py:71 stock/forms.py:264
+#: part/forms.py:89 stock/forms.py:264
msgid "File Format"
msgstr ""
-#: part/forms.py:71 stock/forms.py:264
+#: part/forms.py:89 stock/forms.py:264
msgid "Select output file format"
msgstr ""
-#: part/forms.py:73
+#: part/forms.py:91
msgid "Cascading"
msgstr ""
-#: part/forms.py:73
+#: part/forms.py:91
msgid "Download cascading / multi-level BOM"
msgstr ""
-#: part/forms.py:75
+#: part/forms.py:93
msgid "Levels"
msgstr ""
-#: part/forms.py:75
+#: part/forms.py:93
msgid "Select maximum number of BOM levels to export (0 = all levels)"
msgstr ""
-#: part/forms.py:77
+#: part/forms.py:95
msgid "Include Parameter Data"
msgstr ""
-#: part/forms.py:77
+#: part/forms.py:95
msgid "Include part parameters data in exported BOM"
msgstr ""
-#: part/forms.py:79
+#: part/forms.py:97
msgid "Include Stock Data"
msgstr ""
-#: part/forms.py:79
+#: part/forms.py:97
msgid "Include part stock data in exported BOM"
msgstr ""
-#: part/forms.py:81
+#: part/forms.py:99
msgid "Include Supplier Data"
msgstr ""
-#: part/forms.py:81
+#: part/forms.py:99
msgid "Include part supplier data in exported BOM"
msgstr ""
-#: part/forms.py:102 part/models.py:2053
+#: part/forms.py:120 part/models.py:2053
msgid "Parent Part"
msgstr ""
-#: part/forms.py:103 part/templates/part/bom_duplicate.html:7
+#: part/forms.py:121 part/templates/part/bom_duplicate.html:7
msgid "Select parent part to copy BOM from"
msgstr ""
-#: part/forms.py:109
+#: part/forms.py:127
msgid "Clear existing BOM items"
msgstr ""
-#: part/forms.py:114
+#: part/forms.py:132
msgid "Confirm BOM duplication"
msgstr ""
-#: part/forms.py:132
+#: part/forms.py:150
msgid "Confirm that the BOM is correct"
msgstr ""
-#: part/forms.py:144
+#: part/forms.py:162
msgid "Select BOM file to upload"
msgstr ""
-#: part/forms.py:163
+#: part/forms.py:181
msgid "Related Part"
msgstr ""
-#: part/forms.py:182
+#: part/forms.py:200
msgid "Select part category"
msgstr ""
-#: part/forms.py:199
+#: part/forms.py:217
msgid "Duplicate all BOM data for this part"
msgstr ""
-#: part/forms.py:200
+#: part/forms.py:218
msgid "Copy BOM"
msgstr ""
-#: part/forms.py:205
+#: part/forms.py:223
msgid "Duplicate all parameter data for this part"
msgstr ""
-#: part/forms.py:206
+#: part/forms.py:224
msgid "Copy Parameters"
msgstr ""
-#: part/forms.py:211
+#: part/forms.py:229
msgid "Confirm part creation"
msgstr ""
-#: part/forms.py:216
+#: part/forms.py:234
msgid "Include category parameter templates"
msgstr ""
-#: part/forms.py:221
+#: part/forms.py:239
msgid "Include parent categories parameter templates"
msgstr ""
-#: part/forms.py:301
+#: part/forms.py:319
msgid "Add parameter template to same level categories"
msgstr ""
-#: part/forms.py:305
+#: part/forms.py:323
msgid "Add parameter template to all categories"
msgstr ""
-#: part/forms.py:350
+#: part/forms.py:368
msgid "Input quantity for price calculation"
msgstr ""
@@ -2960,7 +3033,7 @@ msgstr ""
msgid "Part revision or version number"
msgstr ""
-#: part/models.py:737 part/templates/part/detail.html:35 report/models.py:181
+#: part/models.py:737 part/templates/part/detail.html:35 report/models.py:198
#: templates/js/part.js:164
msgid "Revision"
msgstr ""
@@ -3024,7 +3097,7 @@ msgstr ""
#: part/models.py:859 part/templates/part/detail.html:227
#: templates/js/table_filters.js:20 templates/js/table_filters.js:60
-#: templates/js/table_filters.js:209 templates/js/table_filters.js:278
+#: templates/js/table_filters.js:214 templates/js/table_filters.js:283
msgid "Active"
msgstr ""
@@ -3069,7 +3142,7 @@ msgid "Enter description for this test"
msgstr ""
#: part/models.py:1974 templates/js/part.js:570
-#: templates/js/table_filters.js:195
+#: templates/js/table_filters.js:200
msgid "Required"
msgstr ""
@@ -3159,7 +3232,7 @@ msgstr ""
msgid "This BOM item is inherited by BOMs for variant parts"
msgstr ""
-#: part/models.py:2243 part/views.py:1485 part/views.py:1537
+#: part/models.py:2243 part/views.py:1592 part/views.py:1644
#: stock/models.py:259
msgid "Quantity must be integer value for trackable parts"
msgstr ""
@@ -3197,7 +3270,7 @@ msgstr ""
#: part/templates/part/allocation.html:49
#: stock/templates/stock/item_base.html:8
#: stock/templates/stock/item_base.html:89
-#: stock/templates/stock/item_base.html:318
+#: stock/templates/stock/item_base.html:324
#: stock/templates/stock/stock_adjust.html:16 templates/js/build.js:771
#: templates/js/stock.js:923 templates/js/stock.js:1181
msgid "Stock Item"
@@ -3248,7 +3321,7 @@ msgstr ""
msgid "Validate Bill of Materials"
msgstr ""
-#: part/templates/part/bom.html:61 part/views.py:1776
+#: part/templates/part/bom.html:61 part/views.py:1883
msgid "Export Bill of Materials"
msgstr ""
@@ -3264,7 +3337,7 @@ msgstr ""
msgid "All selected BOM items will be deleted"
msgstr ""
-#: part/templates/part/bom.html:160 part/views.py:579
+#: part/templates/part/bom.html:160 part/views.py:584
#: templates/js/stock.js:1077
msgid "Create New Part"
msgstr ""
@@ -3366,7 +3439,7 @@ msgstr ""
msgid "All parts"
msgstr ""
-#: part/templates/part/category.html:25 part/views.py:2157
+#: part/templates/part/category.html:25 part/views.py:2264
msgid "Create new part category"
msgstr ""
@@ -3486,7 +3559,7 @@ msgstr ""
msgid "Part Parameters"
msgstr ""
-#: part/templates/part/copy_part.html:9 part/views.py:455
+#: part/templates/part/copy_part.html:9 part/views.py:460
msgid "Duplicate Part"
msgstr ""
@@ -3628,7 +3701,7 @@ msgstr ""
msgid "Part Test Templates"
msgstr ""
-#: part/templates/part/navbar.html:103 stock/templates/stock/item_base.html:376
+#: part/templates/part/navbar.html:103 stock/templates/stock/item_base.html:382
msgid "Tests"
msgstr ""
@@ -3647,7 +3720,7 @@ msgstr ""
#: part/templates/part/params.html:18
#: templates/InvenTree/settings/category.html:29
-#: templates/InvenTree/settings/part.html:43
+#: templates/InvenTree/settings/part.html:44
msgid "New Parameter"
msgstr ""
@@ -3663,7 +3736,7 @@ msgid "Edit"
msgstr ""
#: part/templates/part/params.html:44 part/templates/part/related.html:44
-#: part/templates/part/supplier.html:22 users/models.py:168
+#: part/templates/part/supplier.html:22 users/models.py:170
msgid "Delete"
msgstr ""
@@ -3726,7 +3799,7 @@ msgstr ""
msgid "Delete part"
msgstr ""
-#: part/templates/part/part_base.html:122 templates/js/table_filters.js:129
+#: part/templates/part/part_base.html:122 templates/js/table_filters.js:134
msgid "In Stock"
msgstr ""
@@ -3754,14 +3827,10 @@ msgstr ""
msgid "Add Test Template"
msgstr ""
-#: part/templates/part/part_thumb.html:16
+#: part/templates/part/part_thumb.html:20
msgid "Select from existing images"
msgstr ""
-#: part/templates/part/part_thumb.html:17
-msgid "Upload new image"
-msgstr ""
-
#: part/templates/part/related.html:18
msgid "Add Related"
msgstr ""
@@ -3847,283 +3916,296 @@ msgstr ""
msgid "New Variant"
msgstr ""
-#: part/views.py:84
+#: part/views.py:89
msgid "Add Related Part"
msgstr ""
-#: part/views.py:139
+#: part/views.py:144
msgid "Delete Related Part"
msgstr ""
-#: part/views.py:153
+#: part/views.py:158
msgid "Add part attachment"
msgstr ""
-#: part/views.py:206 templates/attachment_table.html:32
+#: part/views.py:211 templates/attachment_table.html:32
msgid "Edit attachment"
msgstr ""
-#: part/views.py:210
+#: part/views.py:215
msgid "Part attachment updated"
msgstr ""
-#: part/views.py:225
+#: part/views.py:230
msgid "Delete Part Attachment"
msgstr ""
-#: part/views.py:233
+#: part/views.py:238
msgid "Deleted part attachment"
msgstr ""
-#: part/views.py:242
+#: part/views.py:247
msgid "Create Test Template"
msgstr ""
-#: part/views.py:269
+#: part/views.py:274
msgid "Edit Test Template"
msgstr ""
-#: part/views.py:283
+#: part/views.py:288
msgid "Delete Test Template"
msgstr ""
-#: part/views.py:290
+#: part/views.py:295
msgid "Set Part Category"
msgstr ""
-#: part/views.py:340
+#: part/views.py:345
#, python-brace-format
msgid "Set category for {n} parts"
msgstr ""
-#: part/views.py:375
+#: part/views.py:380
msgid "Create Variant"
msgstr ""
-#: part/views.py:460
+#: part/views.py:465
msgid "Copied part"
msgstr ""
-#: part/views.py:514 part/views.py:652
+#: part/views.py:519 part/views.py:657
msgid "Possible matches exist - confirm creation of new part"
msgstr ""
-#: part/views.py:584
+#: part/views.py:589
msgid "Created new part"
msgstr ""
-#: part/views.py:820
+#: part/views.py:825
msgid "Part QR Code"
msgstr ""
-#: part/views.py:839
+#: part/views.py:927
msgid "Upload Part Image"
msgstr ""
-#: part/views.py:845 part/views.py:880
+#: part/views.py:933 part/views.py:968
msgid "Updated part image"
msgstr ""
-#: part/views.py:854
+#: part/views.py:942
msgid "Select Part Image"
msgstr ""
-#: part/views.py:883
+#: part/views.py:971
msgid "Part image not found"
msgstr ""
-#: part/views.py:894
+#: part/views.py:982
msgid "Edit Part Properties"
msgstr ""
-#: part/views.py:923
+#: part/views.py:1017
msgid "Duplicate BOM"
msgstr ""
-#: part/views.py:953
+#: part/views.py:1047
msgid "Confirm duplication of BOM from parent"
msgstr ""
-#: part/views.py:974
+#: part/views.py:1068
msgid "Validate BOM"
msgstr ""
-#: part/views.py:995
+#: part/views.py:1089
msgid "Confirm that the BOM is valid"
msgstr ""
-#: part/views.py:1006
+#: part/views.py:1100
msgid "Validated Bill of Materials"
msgstr ""
-#: part/views.py:1140
+#: part/views.py:1234
msgid "No BOM file provided"
msgstr ""
-#: part/views.py:1488
+#: part/views.py:1595
msgid "Enter a valid quantity"
msgstr ""
-#: part/views.py:1513 part/views.py:1516
+#: part/views.py:1620 part/views.py:1623
msgid "Select valid part"
msgstr ""
-#: part/views.py:1522
+#: part/views.py:1629
msgid "Duplicate part selected"
msgstr ""
-#: part/views.py:1560
+#: part/views.py:1667
msgid "Select a part"
msgstr ""
-#: part/views.py:1566
+#: part/views.py:1673
msgid "Selected part creates a circular BOM"
msgstr ""
-#: part/views.py:1570
+#: part/views.py:1677
msgid "Specify quantity"
msgstr ""
-#: part/views.py:1826
+#: part/views.py:1933
msgid "Confirm Part Deletion"
msgstr ""
-#: part/views.py:1833
+#: part/views.py:1940
msgid "Part was deleted"
msgstr ""
-#: part/views.py:1842
+#: part/views.py:1949
msgid "Part Pricing"
msgstr ""
-#: part/views.py:1956
+#: part/views.py:2063
msgid "Create Part Parameter Template"
msgstr ""
-#: part/views.py:1966
+#: part/views.py:2073
msgid "Edit Part Parameter Template"
msgstr ""
-#: part/views.py:1973
+#: part/views.py:2080
msgid "Delete Part Parameter Template"
msgstr ""
-#: part/views.py:1981
+#: part/views.py:2088
msgid "Create Part Parameter"
msgstr ""
-#: part/views.py:2031
+#: part/views.py:2138
msgid "Edit Part Parameter"
msgstr ""
-#: part/views.py:2045
+#: part/views.py:2152
msgid "Delete Part Parameter"
msgstr ""
-#: part/views.py:2105
+#: part/views.py:2212
msgid "Edit Part Category"
msgstr ""
-#: part/views.py:2143
+#: part/views.py:2250
msgid "Delete Part Category"
msgstr ""
-#: part/views.py:2149
+#: part/views.py:2256
msgid "Part category was deleted"
msgstr ""
-#: part/views.py:2201
+#: part/views.py:2308
msgid "Create Category Parameter Template"
msgstr ""
-#: part/views.py:2302
+#: part/views.py:2409
msgid "Edit Category Parameter Template"
msgstr ""
-#: part/views.py:2358
+#: part/views.py:2465
msgid "Delete Category Parameter Template"
msgstr ""
-#: part/views.py:2377
+#: part/views.py:2484
msgid "Create BOM Item"
msgstr ""
-#: part/views.py:2447
+#: part/views.py:2554
msgid "Edit BOM item"
msgstr ""
-#: part/views.py:2503
+#: part/views.py:2610
msgid "Confim BOM item deletion"
msgstr ""
-#: report/models.py:163
+#: report/models.py:180
msgid "Template name"
msgstr ""
-#: report/models.py:169
+#: report/models.py:186
msgid "Report template file"
msgstr ""
-#: report/models.py:176
+#: report/models.py:193
msgid "Report template description"
msgstr ""
-#: report/models.py:182
+#: report/models.py:199
msgid "Report revision number (auto-increments)"
msgstr ""
-#: report/models.py:258
+#: report/models.py:275
msgid "Report template is enabled"
msgstr ""
-#: report/models.py:278
+#: report/models.py:295
msgid "StockItem query filters (comma-separated list of key=value pairs)"
msgstr ""
-#: report/models.py:286
+#: report/models.py:303
msgid "Include Installed Tests"
msgstr ""
-#: report/models.py:287
+#: report/models.py:304
msgid "Include test results for stock items installed inside assembled item"
msgstr ""
-#: report/models.py:330
+#: report/models.py:347
msgid "Build Filters"
msgstr ""
-#: report/models.py:331
+#: report/models.py:348
msgid "Build query filters (comma-separated list of key=value pairs"
msgstr ""
-#: report/models.py:368
+#: report/models.py:385
msgid "Part Filters"
msgstr ""
-#: report/models.py:369
+#: report/models.py:386
msgid "Part query filters (comma-separated list of key=value pairs"
msgstr ""
-#: report/models.py:415
+#: report/models.py:416
+msgid "Purchase order query filters"
+msgstr ""
+
+#: report/models.py:450
+msgid "Sales order query filters"
+msgstr ""
+
+#: report/models.py:500
msgid "Report snippet file"
msgstr ""
-#: report/models.py:419
+#: report/models.py:504
msgid "Snippet file description"
msgstr ""
-#: report/models.py:454
+#: report/models.py:539
msgid "Report asset file"
msgstr ""
-#: report/models.py:457
+#: report/models.py:542
msgid "Asset file description"
msgstr ""
-#: report/templates/report/inventree_build_order_base.html:150
+#: report/templates/report/inventree_build_order_base.html:147
msgid "Required For"
msgstr ""
+#: report/templates/report/inventree_po_report.html:85
+#: report/templates/report/inventree_so_report.html:85
+msgid "Line Items"
+msgstr ""
+
#: report/templates/report/inventree_test_report_base.html:21
msgid "Stock Item Test Report"
msgstr ""
@@ -4276,7 +4358,7 @@ msgstr ""
msgid "Packaging this stock item is stored in"
msgstr ""
-#: stock/models.py:400 stock/templates/stock/item_base.html:249
+#: stock/models.py:400 stock/templates/stock/item_base.html:255
msgid "Installed In"
msgstr ""
@@ -4316,7 +4398,7 @@ msgstr ""
msgid "Destination Sales Order"
msgstr ""
-#: stock/models.py:472 stock/templates/stock/item_base.html:343
+#: stock/models.py:472 stock/templates/stock/item_base.html:349
#: templates/js/stock.js:652
msgid "Expiry Date"
msgstr ""
@@ -4433,7 +4515,7 @@ msgstr ""
msgid "Test name"
msgstr ""
-#: stock/models.py:1645 templates/js/table_filters.js:185
+#: stock/models.py:1645 templates/js/table_filters.js:190
msgid "Test result"
msgstr ""
@@ -4507,12 +4589,12 @@ msgid ""
msgstr ""
#: stock/templates/stock/item_base.html:91
-#: stock/templates/stock/item_base.html:347 templates/js/table_filters.js:118
+#: stock/templates/stock/item_base.html:353 templates/js/table_filters.js:123
msgid "Expired"
msgstr ""
#: stock/templates/stock/item_base.html:95
-#: stock/templates/stock/item_base.html:349 templates/js/table_filters.js:123
+#: stock/templates/stock/item_base.html:355 templates/js/table_filters.js:128
msgid "Stale"
msgstr ""
@@ -4547,97 +4629,97 @@ msgstr ""
msgid "Count stock"
msgstr ""
-#: stock/templates/stock/item_base.html:161 templates/stock_table.html:53
+#: stock/templates/stock/item_base.html:163 templates/stock_table.html:53
msgid "Add stock"
msgstr ""
-#: stock/templates/stock/item_base.html:162 templates/stock_table.html:54
+#: stock/templates/stock/item_base.html:166 templates/stock_table.html:54
msgid "Remove stock"
msgstr ""
-#: stock/templates/stock/item_base.html:164
+#: stock/templates/stock/item_base.html:169
msgid "Transfer stock"
msgstr ""
-#: stock/templates/stock/item_base.html:166
+#: stock/templates/stock/item_base.html:172
msgid "Serialize stock"
msgstr ""
-#: stock/templates/stock/item_base.html:170
+#: stock/templates/stock/item_base.html:176
msgid "Assign to customer"
msgstr ""
-#: stock/templates/stock/item_base.html:173
+#: stock/templates/stock/item_base.html:179
msgid "Return to stock"
msgstr ""
-#: stock/templates/stock/item_base.html:177 templates/js/stock.js:1218
+#: stock/templates/stock/item_base.html:183 templates/js/stock.js:1218
msgid "Uninstall stock item"
msgstr ""
-#: stock/templates/stock/item_base.html:177
+#: stock/templates/stock/item_base.html:183
msgid "Uninstall"
msgstr ""
-#: stock/templates/stock/item_base.html:186
+#: stock/templates/stock/item_base.html:192
#: stock/templates/stock/location.html:55
msgid "Stock actions"
msgstr ""
-#: stock/templates/stock/item_base.html:189
+#: stock/templates/stock/item_base.html:195
msgid "Convert to variant"
msgstr ""
-#: stock/templates/stock/item_base.html:192
+#: stock/templates/stock/item_base.html:198
msgid "Duplicate stock item"
msgstr ""
-#: stock/templates/stock/item_base.html:194
+#: stock/templates/stock/item_base.html:200
msgid "Edit stock item"
msgstr ""
-#: stock/templates/stock/item_base.html:197
+#: stock/templates/stock/item_base.html:203
msgid "Delete stock item"
msgstr ""
-#: stock/templates/stock/item_base.html:209
+#: stock/templates/stock/item_base.html:215
msgid "Stock Item Details"
msgstr ""
-#: stock/templates/stock/item_base.html:268 templates/js/build.js:442
+#: stock/templates/stock/item_base.html:274 templates/js/build.js:442
msgid "No location set"
msgstr ""
-#: stock/templates/stock/item_base.html:275
+#: stock/templates/stock/item_base.html:281
msgid "Barcode Identifier"
msgstr ""
-#: stock/templates/stock/item_base.html:296 templates/InvenTree/search.html:167
+#: stock/templates/stock/item_base.html:302 templates/InvenTree/search.html:167
#: templates/js/build.js:655 templates/navbar.html:29
msgid "Build"
msgstr ""
-#: stock/templates/stock/item_base.html:317
+#: stock/templates/stock/item_base.html:323
msgid "Parent Item"
msgstr ""
-#: stock/templates/stock/item_base.html:347
+#: stock/templates/stock/item_base.html:353
msgid "This StockItem expired on"
msgstr ""
-#: stock/templates/stock/item_base.html:349
+#: stock/templates/stock/item_base.html:355
msgid "This StockItem expires on"
msgstr ""
-#: stock/templates/stock/item_base.html:356 templates/js/stock.js:658
+#: stock/templates/stock/item_base.html:362 templates/js/stock.js:658
msgid "Last Updated"
msgstr ""
-#: stock/templates/stock/item_base.html:361
+#: stock/templates/stock/item_base.html:367
msgid "Last Stocktake"
msgstr ""
-#: stock/templates/stock/item_base.html:365
+#: stock/templates/stock/item_base.html:371
msgid "No stocktake performed"
msgstr ""
@@ -5096,12 +5178,12 @@ msgid "Default Value"
msgstr ""
#: templates/InvenTree/settings/category.html:70
-#: templates/InvenTree/settings/part.html:80
+#: templates/InvenTree/settings/part.html:81
msgid "Edit Template"
msgstr ""
#: templates/InvenTree/settings/category.html:71
-#: templates/InvenTree/settings/part.html:81
+#: templates/InvenTree/settings/part.html:82
msgid "Delete Template"
msgstr ""
@@ -5109,7 +5191,7 @@ msgstr ""
msgid "Global InvenTree Settings"
msgstr ""
-#: templates/InvenTree/settings/global.html:25
+#: templates/InvenTree/settings/global.html:26
msgid "Barcode Settings"
msgstr ""
@@ -5125,11 +5207,11 @@ msgstr ""
msgid "Part Options"
msgstr ""
-#: templates/InvenTree/settings/part.html:39
+#: templates/InvenTree/settings/part.html:40
msgid "Part Parameter Templates"
msgstr ""
-#: templates/InvenTree/settings/part.html:60
+#: templates/InvenTree/settings/part.html:61
msgid "No part parameter templates found"
msgstr ""
@@ -5294,6 +5376,22 @@ msgstr ""
msgid "Delete attachment"
msgstr ""
+#: templates/image_download.html:8
+msgid "Specify URL for downloading image"
+msgstr ""
+
+#: templates/image_download.html:11
+msgid "Must be a valid image URL"
+msgstr ""
+
+#: templates/image_download.html:12
+msgid "Remote server must be accessible"
+msgstr ""
+
+#: templates/image_download.html:13
+msgid "Remote image must not exceed maximum allowable file size"
+msgstr ""
+
#: templates/js/barcode.js:8
msgid "Scan barcode data here using wedge scanner"
msgstr ""
@@ -5322,7 +5420,7 @@ msgstr ""
msgid "Unknown response from server"
msgstr ""
-#: templates/js/barcode.js:119 templates/js/modals.js:856
+#: templates/js/barcode.js:119 templates/js/modals.js:857
msgid "Invalid server response"
msgstr ""
@@ -5553,11 +5651,11 @@ msgstr ""
msgid "Show Error Information"
msgstr ""
-#: templates/js/modals.js:473 templates/modals.html:66
+#: templates/js/modals.js:473 templates/modals.html:73
msgid "Accept"
msgstr ""
-#: templates/js/modals.js:474 templates/modals.html:65
+#: templates/js/modals.js:474 templates/modals.html:72
msgid "Cancel"
msgstr ""
@@ -5565,81 +5663,81 @@ msgstr ""
msgid "Loading Data"
msgstr ""
-#: templates/js/modals.js:549 templates/js/modals.js:807
-#: templates/modals.html:22 templates/modals.html:46
+#: templates/js/modals.js:549 templates/js/modals.js:808
+#: templates/modals.html:29 templates/modals.html:53
msgid "Submit"
msgstr ""
-#: templates/js/modals.js:550 templates/js/modals.js:808
-#: templates/modals.html:21 templates/modals.html:45 templates/modals.html:84
+#: templates/js/modals.js:550 templates/js/modals.js:809
+#: templates/modals.html:28 templates/modals.html:52 templates/modals.html:93
msgid "Close"
msgstr ""
-#: templates/js/modals.js:759
+#: templates/js/modals.js:760
msgid "Invalid response from server"
msgstr ""
-#: templates/js/modals.js:759
+#: templates/js/modals.js:760
msgid "Form data missing from server response"
msgstr ""
-#: templates/js/modals.js:772
+#: templates/js/modals.js:773
msgid "Error posting form data"
msgstr ""
-#: templates/js/modals.js:856
+#: templates/js/modals.js:857
msgid "JSON response missing form data"
msgstr ""
-#: templates/js/modals.js:866
+#: templates/js/modals.js:867
msgid "No Response"
msgstr ""
-#: templates/js/modals.js:867
+#: templates/js/modals.js:868
msgid "No response from the InvenTree server"
msgstr ""
-#: templates/js/modals.js:871
+#: templates/js/modals.js:872
msgid "Error 400: Bad Request"
msgstr ""
-#: templates/js/modals.js:872
+#: templates/js/modals.js:873
msgid "Server returned error code 400"
msgstr ""
-#: templates/js/modals.js:876
+#: templates/js/modals.js:877
msgid "Error 401: Not Authenticated"
msgstr ""
-#: templates/js/modals.js:877
+#: templates/js/modals.js:878
msgid "Authentication credentials not supplied"
msgstr ""
-#: templates/js/modals.js:881
+#: templates/js/modals.js:882
msgid "Error 403: Permission Denied"
msgstr ""
-#: templates/js/modals.js:882
+#: templates/js/modals.js:883
msgid "You do not have the required permissions to access this function"
msgstr ""
-#: templates/js/modals.js:886
+#: templates/js/modals.js:887
msgid "Error 404: Resource Not Found"
msgstr ""
-#: templates/js/modals.js:887
+#: templates/js/modals.js:888
msgid "The requested resource could not be located on the server"
msgstr ""
-#: templates/js/modals.js:891
+#: templates/js/modals.js:892
msgid "Error 408: Timeout"
msgstr ""
-#: templates/js/modals.js:892
+#: templates/js/modals.js:893
msgid "Connection timeout while requesting data from server"
msgstr ""
-#: templates/js/modals.js:895
+#: templates/js/modals.js:896
msgid "Error requesting form data"
msgstr ""
@@ -5687,7 +5785,7 @@ msgstr ""
msgid "No category"
msgstr ""
-#: templates/js/part.js:408 templates/js/table_filters.js:291
+#: templates/js/part.js:408 templates/js/table_filters.js:296
msgid "Low stock"
msgstr ""
@@ -5732,7 +5830,8 @@ msgid "Stock item(s) must be selected before printing reports"
msgstr ""
#: templates/js/report.js:116 templates/js/report.js:169
-#: templates/js/report.js:223
+#: templates/js/report.js:223 templates/js/report.js:277
+#: templates/js/report.js:331
msgid "No Reports Found"
msgstr ""
@@ -5764,6 +5863,26 @@ msgstr ""
msgid "No report templates found which match selected part(s)"
msgstr ""
+#: templates/js/report.js:259
+msgid "Select Purchase Orders"
+msgstr ""
+
+#: templates/js/report.js:260
+msgid "Purchase Order(s) must be selected before printing report"
+msgstr ""
+
+#: templates/js/report.js:278 templates/js/report.js:332
+msgid "No report templates found which match selected orders"
+msgstr ""
+
+#: templates/js/report.js:313
+msgid "Select Sales Orders"
+msgstr ""
+
+#: templates/js/report.js:314
+msgid "Sales Order(s) must be selected before printing report"
+msgstr ""
+
#: templates/js/stock.js:38
msgid "PASS"
msgstr ""
@@ -5848,7 +5967,7 @@ msgstr ""
msgid "Stock item is destroyed"
msgstr ""
-#: templates/js/stock.js:616 templates/js/table_filters.js:111
+#: templates/js/stock.js:616 templates/js/table_filters.js:116
msgid "Depleted"
msgstr ""
@@ -5884,7 +6003,7 @@ msgstr ""
msgid "Serial"
msgstr ""
-#: templates/js/stock.js:1281 templates/js/table_filters.js:144
+#: templates/js/stock.js:1281 templates/js/table_filters.js:149
msgid "Installed"
msgstr ""
@@ -5900,36 +6019,36 @@ msgstr ""
msgid "Validated"
msgstr ""
-#: templates/js/table_filters.js:70 templates/js/table_filters.js:154
+#: templates/js/table_filters.js:70 templates/js/table_filters.js:159
msgid "Is Serialized"
msgstr ""
-#: templates/js/table_filters.js:73 templates/js/table_filters.js:161
+#: templates/js/table_filters.js:73 templates/js/table_filters.js:166
msgid "Serial number GTE"
msgstr ""
-#: templates/js/table_filters.js:74 templates/js/table_filters.js:162
+#: templates/js/table_filters.js:74 templates/js/table_filters.js:167
msgid "Serial number greater than or equal to"
msgstr ""
-#: templates/js/table_filters.js:77 templates/js/table_filters.js:165
+#: templates/js/table_filters.js:77 templates/js/table_filters.js:170
msgid "Serial number LTE"
msgstr ""
-#: templates/js/table_filters.js:78 templates/js/table_filters.js:166
+#: templates/js/table_filters.js:78 templates/js/table_filters.js:171
msgid "Serial number less than or equal to"
msgstr ""
#: templates/js/table_filters.js:81 templates/js/table_filters.js:82
-#: templates/js/table_filters.js:157 templates/js/table_filters.js:158
+#: templates/js/table_filters.js:162 templates/js/table_filters.js:163
msgid "Serial number"
msgstr ""
-#: templates/js/table_filters.js:86 templates/js/table_filters.js:175
+#: templates/js/table_filters.js:86 templates/js/table_filters.js:180
msgid "Batch code"
msgstr ""
-#: templates/js/table_filters.js:96 templates/js/table_filters.js:258
+#: templates/js/table_filters.js:96 templates/js/table_filters.js:263
msgid "Active parts"
msgstr ""
@@ -5937,111 +6056,115 @@ msgstr ""
msgid "Show stock for active parts"
msgstr ""
-#: templates/js/table_filters.js:101
-msgid "Is allocated"
-msgstr ""
-
#: templates/js/table_filters.js:102
-msgid "Item has been alloacted"
+msgid "Part is an assembly"
msgstr ""
#: templates/js/table_filters.js:106
-msgid "Include sublocations"
+msgid "Is allocated"
msgstr ""
#: templates/js/table_filters.js:107
-msgid "Include stock in sublocations"
+msgid "Item has been allocated"
+msgstr ""
+
+#: templates/js/table_filters.js:111
+msgid "Include sublocations"
msgstr ""
#: templates/js/table_filters.js:112
+msgid "Include stock in sublocations"
+msgstr ""
+
+#: templates/js/table_filters.js:117
msgid "Show stock items which are depleted"
msgstr ""
-#: templates/js/table_filters.js:119
+#: templates/js/table_filters.js:124
msgid "Show stock items which have expired"
msgstr ""
-#: templates/js/table_filters.js:124
+#: templates/js/table_filters.js:129
msgid "Show stock which is close to expiring"
msgstr ""
-#: templates/js/table_filters.js:130
+#: templates/js/table_filters.js:135
msgid "Show items which are in stock"
msgstr ""
-#: templates/js/table_filters.js:134
+#: templates/js/table_filters.js:139
msgid "In Production"
msgstr ""
-#: templates/js/table_filters.js:135
+#: templates/js/table_filters.js:140
msgid "Show items which are in production"
msgstr ""
-#: templates/js/table_filters.js:139
+#: templates/js/table_filters.js:144
msgid "Include Variants"
msgstr ""
-#: templates/js/table_filters.js:140
+#: templates/js/table_filters.js:145
msgid "Include stock items for variant parts"
msgstr ""
-#: templates/js/table_filters.js:145
+#: templates/js/table_filters.js:150
msgid "Show stock items which are installed in another item"
msgstr ""
-#: templates/js/table_filters.js:149
+#: templates/js/table_filters.js:154
msgid "Sent to customer"
msgstr ""
-#: templates/js/table_filters.js:150
+#: templates/js/table_filters.js:155
msgid "Show items which have been assigned to a customer"
msgstr ""
-#: templates/js/table_filters.js:170 templates/js/table_filters.js:171
+#: templates/js/table_filters.js:175 templates/js/table_filters.js:176
msgid "Stock status"
msgstr ""
-#: templates/js/table_filters.js:204
+#: templates/js/table_filters.js:209
msgid "Build status"
msgstr ""
-#: templates/js/table_filters.js:223 templates/js/table_filters.js:240
+#: templates/js/table_filters.js:228 templates/js/table_filters.js:245
msgid "Order status"
msgstr ""
-#: templates/js/table_filters.js:228 templates/js/table_filters.js:245
+#: templates/js/table_filters.js:233 templates/js/table_filters.js:250
msgid "Outstanding"
msgstr ""
-#: templates/js/table_filters.js:268
+#: templates/js/table_filters.js:273
msgid "Include subcategories"
msgstr ""
-#: templates/js/table_filters.js:269
+#: templates/js/table_filters.js:274
msgid "Include parts in subcategories"
msgstr ""
-#: templates/js/table_filters.js:273
+#: templates/js/table_filters.js:278
msgid "Has IPN"
msgstr ""
-#: templates/js/table_filters.js:274
+#: templates/js/table_filters.js:279
msgid "Part has internal part number"
msgstr ""
-#: templates/js/table_filters.js:279
+#: templates/js/table_filters.js:284
msgid "Show active parts"
msgstr ""
-#: templates/js/table_filters.js:287
+#: templates/js/table_filters.js:292
msgid "Stock available"
msgstr ""
-#: templates/js/table_filters.js:303
+#: templates/js/table_filters.js:308
msgid "Starred"
msgstr ""
-#: templates/js/table_filters.js:315
+#: templates/js/table_filters.js:320
msgid "Purchasable"
msgstr ""
@@ -6098,7 +6221,7 @@ msgstr ""
msgid "All"
msgstr ""
-#: templates/modals.html:14 templates/modals.html:39
+#: templates/modals.html:21 templates/modals.html:46
msgid "Form errors exist"
msgstr ""
@@ -6270,38 +6393,38 @@ msgstr ""
msgid "Important dates"
msgstr ""
-#: users/models.py:151
+#: users/models.py:153
msgid "Permission set"
msgstr ""
-#: users/models.py:159
+#: users/models.py:161
msgid "Group"
msgstr ""
-#: users/models.py:162
+#: users/models.py:164
msgid "View"
msgstr ""
-#: users/models.py:162
+#: users/models.py:164
msgid "Permission to view items"
msgstr ""
-#: users/models.py:164
+#: users/models.py:166
msgid "Add"
msgstr ""
-#: users/models.py:164
+#: users/models.py:166
msgid "Permission to add items"
msgstr ""
-#: users/models.py:166
+#: users/models.py:168
msgid "Change"
msgstr ""
-#: users/models.py:166
+#: users/models.py:168
msgid "Permissions to edit items"
msgstr ""
-#: users/models.py:168
+#: users/models.py:170
msgid "Permission to delete items"
msgstr ""
diff --git a/InvenTree/locale/es/LC_MESSAGES/django.po b/InvenTree/locale/es/LC_MESSAGES/django.po
index e13bb2fcdb..d229c67b45 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-03-09 11:11+0100\n"
+"POT-Creation-Date: 2021-03-28 16:04+0000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME \n"
"Language-Team: LANGUAGE \n"
@@ -58,7 +58,7 @@ msgstr ""
msgid "Select Category"
msgstr ""
-#: InvenTree/helpers.py:361 order/models.py:232 order/models.py:331
+#: InvenTree/helpers.py:361 order/models.py:242 order/models.py:341
#: stock/views.py:1762
msgid "Invalid quantity provided"
msgstr ""
@@ -106,7 +106,7 @@ msgid "User"
msgstr ""
#: InvenTree/models.py:106 label/models.py:101 part/models.py:685
-#: part/templates/part/params.html:27 report/models.py:162
+#: part/templates/part/params.html:27 report/models.py:179
#: templates/js/part.js:109
msgid "Name"
msgstr ""
@@ -172,7 +172,7 @@ msgid "Returned"
msgstr ""
#: InvenTree/status_codes.py:136
-#: order/templates/order/sales_order_base.html:121
+#: order/templates/order/sales_order_base.html:124
msgid "Shipped"
msgstr ""
@@ -317,8 +317,8 @@ msgstr ""
#: build/forms.py:85 build/templates/build/auto_allocate.html:17
#: build/templates/build/build_base.html:91
-#: build/templates/build/detail.html:31 common/models.py:682
-#: company/forms.py:112 company/templates/company/supplier_part_pricing.html:77
+#: build/templates/build/detail.html:31 common/models.py:696
+#: company/forms.py:130 company/templates/company/supplier_part_pricing.html:77
#: order/templates/order/order_wizard/select_parts.html:32
#: order/templates/order/purchase_order_detail.html:193
#: order/templates/order/sales_order_detail.html:77
@@ -326,11 +326,13 @@ msgstr ""
#: part/templates/part/allocation.html:19
#: part/templates/part/allocation.html:53
#: part/templates/part/sale_prices.html:85
-#: report/templates/report/inventree_build_order_base.html:117
+#: report/templates/report/inventree_build_order_base.html:114
+#: report/templates/report/inventree_po_report.html:91
+#: report/templates/report/inventree_so_report.html:91
#: report/templates/report/inventree_test_report_base.html:77
#: stock/forms.py:307 stock/templates/stock/item_base.html:51
#: stock/templates/stock/item_base.html:57
-#: stock/templates/stock/item_base.html:234
+#: stock/templates/stock/item_base.html:240
#: stock/templates/stock/stock_adjust.html:18 templates/js/barcode.js:364
#: templates/js/bom.js:205 templates/js/build.js:420 templates/js/build.js:954
#: templates/js/stock.js:952 templates/js/stock.js:1190
@@ -350,7 +352,7 @@ msgid "Enter serial numbers for build outputs"
msgstr ""
#: build/forms.py:98
-msgid "Confirm creation of build outut"
+msgid "Confirm creation of build output"
msgstr ""
#: build/forms.py:118
@@ -392,7 +394,7 @@ msgstr ""
#: build/models.py:65 build/templates/build/build_base.html:8
#: build/templates/build/build_base.html:35
#: part/templates/part/allocation.html:23
-#: report/templates/report/inventree_build_order_base.html:109
+#: report/templates/report/inventree_build_order_base.html:106
msgid "Build Order"
msgstr ""
@@ -411,7 +413,9 @@ msgid "Build Order Reference"
msgstr ""
#: build/models.py:127 order/templates/order/purchase_order_detail.html:188
-#: templates/js/bom.js:197 templates/js/build.js:509 templates/js/build.js:948
+#: report/templates/report/inventree_po_report.html:92
+#: report/templates/report/inventree_so_report.html:92 templates/js/bom.js:197
+#: templates/js/build.js:509 templates/js/build.js:948
msgid "Reference"
msgstr ""
@@ -421,8 +425,8 @@ msgstr ""
#: company/templates/company/supplier_part_detail.html:31 label/models.py:108
#: order/templates/order/purchase_order_detail.html:168 part/models.py:709
#: part/templates/part/detail.html:54 part/templates/part/set_category.html:14
-#: report/models.py:175
-#: report/templates/report/inventree_build_order_base.html:121
+#: report/models.py:192
+#: report/templates/report/inventree_build_order_base.html:118
#: templates/InvenTree/search.html:208
#: templates/InvenTree/settings/header.html:9 templates/js/bom.js:190
#: templates/js/build.js:677 templates/js/build.js:944
@@ -448,14 +452,16 @@ msgstr ""
#: build/models.py:152 build/templates/build/auto_allocate.html:16
#: build/templates/build/build_base.html:86
-#: build/templates/build/detail.html:26 order/models.py:652
+#: build/templates/build/detail.html:26 order/models.py:662
#: order/templates/order/order_wizard/select_parts.html:30
#: order/templates/order/purchase_order_detail.html:156
#: order/templates/order/receive_parts.html:19 part/models.py:320
#: part/templates/part/part_app_base.html:7 part/templates/part/related.html:29
#: part/templates/part/set_category.html:13
#: part/templates/part/subcategories.html:17
-#: report/templates/report/inventree_build_order_base.html:113
+#: report/templates/report/inventree_build_order_base.html:110
+#: report/templates/report/inventree_po_report.html:90
+#: report/templates/report/inventree_so_report.html:90
#: templates/InvenTree/search.html:111 templates/InvenTree/search.html:194
#: templates/js/barcode.js:362 templates/js/bom.js:163
#: templates/js/build.js:681 templates/js/build.js:921
@@ -527,7 +533,7 @@ msgstr ""
msgid "Batch code for this build output"
msgstr ""
-#: build/models.py:223 order/models.py:437
+#: build/models.py:223 order/models.py:447
msgid "Target completion date"
msgstr ""
@@ -543,7 +549,7 @@ msgstr ""
#: company/templates/company/supplier_part_base.html:77
#: company/templates/company/supplier_part_detail.html:28
#: part/templates/part/detail.html:83 part/templates/part/part_base.html:100
-#: stock/models.py:423 stock/templates/stock/item_base.html:324
+#: stock/models.py:423 stock/templates/stock/item_base.html:330
msgid "External Link"
msgstr ""
@@ -560,7 +566,7 @@ msgstr ""
#: order/templates/order/so_navbar.html:33
#: order/templates/order/so_navbar.html:36 part/models.py:869
#: part/templates/part/navbar.html:122
-#: report/templates/report/inventree_build_order_base.html:176
+#: report/templates/report/inventree_build_order_base.html:173
#: stock/forms.py:316 stock/forms.py:348 stock/forms.py:376 stock/models.py:495
#: stock/models.py:1663 stock/templates/stock/navbar.html:57
#: templates/js/barcode.js:37 templates/js/bom.js:329 templates/js/stock.js:128
@@ -606,11 +612,11 @@ msgstr ""
msgid "Allocated quantity ({n}) must not exceed available quantity ({q})"
msgstr ""
-#: build/models.py:1031 order/models.py:736
+#: build/models.py:1031 order/models.py:746
msgid "StockItem is over-allocated"
msgstr ""
-#: build/models.py:1035 order/models.py:739
+#: build/models.py:1035 order/models.py:749
msgid "Allocation quantity must be greater than zero"
msgstr ""
@@ -699,7 +705,7 @@ msgid ""
msgstr ""
#: build/templates/build/auto_allocate.html:18 stock/forms.py:346
-#: stock/templates/stock/item_base.html:264
+#: stock/templates/stock/item_base.html:270
#: stock/templates/stock/stock_adjust.html:17
#: templates/InvenTree/search.html:244 templates/js/barcode.js:363
#: templates/js/barcode.js:531 templates/js/build.js:434
@@ -724,7 +730,7 @@ msgid "This Build Order is a child of Build Order"
msgstr ""
#: build/templates/build/build_base.html:37
-#: company/templates/company/company_base.html:27
+#: company/templates/company/company_base.html:40
#: company/templates/company/supplier_part_base.html:25
#: order/templates/order/order_base.html:26
#: order/templates/order/sales_order_base.html:35
@@ -737,11 +743,11 @@ msgstr ""
#: build/templates/build/build_base.html:43
#: build/templates/build/build_base.html:108
#: order/templates/order/order_base.html:32
-#: order/templates/order/order_base.html:83
+#: order/templates/order/order_base.html:86
#: order/templates/order/sales_order_base.html:41
-#: order/templates/order/sales_order_base.html:83
-#: templates/js/table_filters.js:213 templates/js/table_filters.js:232
-#: templates/js/table_filters.js:249
+#: order/templates/order/sales_order_base.html:86
+#: templates/js/table_filters.js:218 templates/js/table_filters.js:237
+#: templates/js/table_filters.js:254
msgid "Overdue"
msgstr ""
@@ -777,7 +783,7 @@ msgstr ""
#: build/templates/build/build_base.html:96
#: build/templates/build/detail.html:59
#: order/templates/order/receive_parts.html:24
-#: stock/templates/stock/item_base.html:370 templates/InvenTree/search.html:236
+#: stock/templates/stock/item_base.html:376 templates/InvenTree/search.html:236
#: templates/js/barcode.js:119 templates/js/build.js:710
#: templates/js/order.js:187 templates/js/order.js:285
#: templates/js/stock.js:624 templates/js/stock.js:1198
@@ -786,9 +792,9 @@ msgstr ""
#: build/templates/build/build_base.html:104
#: build/templates/build/detail.html:121
-#: order/templates/order/order_base.html:121
-#: order/templates/order/sales_order_base.html:114
-#: report/templates/report/inventree_build_order_base.html:129
+#: order/templates/order/order_base.html:124
+#: order/templates/order/sales_order_base.html:117
+#: report/templates/report/inventree_build_order_base.html:126
#: templates/js/build.js:723 templates/js/order.js:200
#: templates/js/order.js:298
msgid "Target Date"
@@ -804,25 +810,28 @@ msgid "Progress"
msgstr ""
#: build/templates/build/build_base.html:128
-#: build/templates/build/detail.html:84 order/models.py:650
+#: build/templates/build/detail.html:84 order/models.py:660
#: order/templates/order/sales_order_base.html:9
#: order/templates/order/sales_order_base.html:33
#: order/templates/order/sales_order_ship.html:25
#: part/templates/part/allocation.html:30
-#: report/templates/report/inventree_build_order_base.html:139
-#: stock/templates/stock/item_base.html:258 templates/js/order.js:245
+#: report/templates/report/inventree_build_order_base.html:136
+#: report/templates/report/inventree_so_report.html:77
+#: stock/templates/stock/item_base.html:264 templates/js/order.js:245
msgid "Sales Order"
msgstr ""
#: build/templates/build/build_base.html:135
#: build/templates/build/detail.html:98
-#: report/templates/report/inventree_build_order_base.html:156
+#: report/templates/report/inventree_build_order_base.html:153
msgid "Issued By"
msgstr ""
#: build/templates/build/build_base.html:142
-#: build/templates/build/detail.html:105
-#: report/templates/report/inventree_build_order_base.html:162
+#: build/templates/build/detail.html:105 order/models.py:118
+#: order/templates/order/order_base.html:138
+#: order/templates/order/sales_order_base.html:138
+#: report/templates/report/inventree_build_order_base.html:159
msgid "Responsible"
msgstr ""
@@ -929,15 +938,15 @@ msgid "Destination location not specified"
msgstr ""
#: build/templates/build/detail.html:70
-#: stock/templates/stock/item_base.html:282 templates/js/stock.js:632
+#: stock/templates/stock/item_base.html:288 templates/js/stock.js:632
#: templates/js/stock.js:1205 templates/js/table_filters.js:85
-#: templates/js/table_filters.js:174
+#: templates/js/table_filters.js:179
msgid "Batch"
msgstr ""
#: build/templates/build/detail.html:116
-#: order/templates/order/order_base.html:108
-#: order/templates/order/sales_order_base.html:108 templates/js/build.js:718
+#: order/templates/order/order_base.html:111
+#: order/templates/order/sales_order_base.html:111 templates/js/build.js:718
msgid "Created"
msgstr ""
@@ -967,14 +976,14 @@ msgid "Print Build Orders"
msgstr ""
#: build/templates/build/index.html:43
-#: order/templates/order/purchase_orders.html:22
-#: order/templates/order/sales_orders.html:22
+#: order/templates/order/purchase_orders.html:27
+#: order/templates/order/sales_orders.html:27
msgid "Display calendar view"
msgstr ""
#: build/templates/build/index.html:46
-#: order/templates/order/purchase_orders.html:25
-#: order/templates/order/sales_orders.html:25
+#: order/templates/order/purchase_orders.html:30
+#: order/templates/order/sales_orders.html:30
msgid "Display list view"
msgstr ""
@@ -1161,7 +1170,7 @@ msgstr ""
msgid "Add Build Order Attachment"
msgstr ""
-#: build/views.py:1062 order/views.py:107 order/views.py:159 part/views.py:167
+#: build/views.py:1062 order/views.py:107 order/views.py:159 part/views.py:172
#: stock/views.py:277
msgid "Added attachment"
msgstr ""
@@ -1215,294 +1224,310 @@ msgid "Default currency"
msgstr ""
#: common/models.py:82
-msgid "Barcode Support"
+msgid "Download from URL"
msgstr ""
#: common/models.py:83
-msgid "Enable barcode scanner support"
+msgid "Allow download of remote images and files from external URL"
msgstr ""
#: common/models.py:89
-msgid "IPN Regex"
+msgid "Barcode Support"
msgstr ""
#: common/models.py:90
+msgid "Enable barcode scanner support"
+msgstr ""
+
+#: common/models.py:96
+msgid "IPN Regex"
+msgstr ""
+
+#: common/models.py:97
msgid "Regular expression pattern for matching Part IPN"
msgstr ""
-#: common/models.py:94
+#: common/models.py:101
msgid "Allow Duplicate IPN"
msgstr ""
-#: common/models.py:95
+#: common/models.py:102
msgid "Allow multiple parts to share the same IPN"
msgstr ""
-#: common/models.py:101
-msgid "Copy Part BOM Data"
-msgstr ""
-
-#: common/models.py:102
-msgid "Copy BOM data by default when duplicating a part"
-msgstr ""
-
#: common/models.py:108
-msgid "Copy Part Parameter Data"
+msgid "Allow Editing IPN"
msgstr ""
#: common/models.py:109
-msgid "Copy parameter data by default when duplicating a part"
+msgid "Allow changing the IPN value while editing a part"
msgstr ""
#: common/models.py:115
-msgid "Copy Part Test Data"
+msgid "Copy Part BOM Data"
msgstr ""
#: common/models.py:116
-msgid "Copy test data by default when duplicating a part"
+msgid "Copy BOM data by default when duplicating a part"
msgstr ""
#: common/models.py:122
-msgid "Copy Category Parameter Templates"
+msgid "Copy Part Parameter Data"
msgstr ""
#: common/models.py:123
-msgid "Copy category parameter templates when creating a part"
+msgid "Copy parameter data by default when duplicating a part"
msgstr ""
#: common/models.py:129
-msgid "Recent Part Count"
+msgid "Copy Part Test Data"
msgstr ""
#: common/models.py:130
-msgid "Number of recent parts to display on index page"
+msgid "Copy test data by default when duplicating a part"
msgstr ""
-#: common/models.py:136 part/templates/part/detail.html:160
-#: report/models.py:168 stock/forms.py:258 templates/js/table_filters.js:24
-#: templates/js/table_filters.js:283
-msgid "Template"
+#: common/models.py:136
+msgid "Copy Category Parameter Templates"
msgstr ""
#: common/models.py:137
-msgid "Parts are templates by default"
+msgid "Copy category parameter templates when creating a part"
msgstr ""
-#: common/models.py:143 part/models.py:832 part/templates/part/detail.html:170
-#: templates/js/table_filters.js:295
-msgid "Assembly"
+#: common/models.py:143
+msgid "Recent Part Count"
msgstr ""
#: common/models.py:144
-msgid "Parts can be assembled from other components by default"
+msgid "Number of recent parts to display on index page"
msgstr ""
-#: common/models.py:150 part/models.py:838 part/templates/part/detail.html:180
-#: templates/js/table_filters.js:299
-msgid "Component"
+#: common/models.py:150 part/templates/part/detail.html:160
+#: report/models.py:185 stock/forms.py:258 templates/js/table_filters.js:24
+#: templates/js/table_filters.js:288
+msgid "Template"
msgstr ""
#: common/models.py:151
-msgid "Parts can be used as sub-components by default"
+msgid "Parts are templates by default"
msgstr ""
-#: common/models.py:157 part/models.py:849 part/templates/part/detail.html:200
-msgid "Purchaseable"
+#: common/models.py:157 part/models.py:832 part/templates/part/detail.html:170
+#: templates/js/table_filters.js:101 templates/js/table_filters.js:300
+msgid "Assembly"
msgstr ""
#: common/models.py:158
-msgid "Parts are purchaseable by default"
+msgid "Parts can be assembled from other components by default"
msgstr ""
-#: common/models.py:164 part/models.py:854 part/templates/part/detail.html:210
-#: templates/js/table_filters.js:307
-msgid "Salable"
+#: common/models.py:164 part/models.py:838 part/templates/part/detail.html:180
+#: templates/js/table_filters.js:304
+msgid "Component"
msgstr ""
#: common/models.py:165
-msgid "Parts are salable by default"
+msgid "Parts can be used as sub-components by default"
msgstr ""
-#: common/models.py:171 part/models.py:844 part/templates/part/detail.html:190
-#: templates/js/table_filters.js:32 templates/js/table_filters.js:311
-msgid "Trackable"
+#: common/models.py:171 part/models.py:849 part/templates/part/detail.html:200
+msgid "Purchaseable"
msgstr ""
#: common/models.py:172
+msgid "Parts are purchaseable by default"
+msgstr ""
+
+#: common/models.py:178 part/models.py:854 part/templates/part/detail.html:210
+#: templates/js/table_filters.js:312
+msgid "Salable"
+msgstr ""
+
+#: common/models.py:179
+msgid "Parts are salable by default"
+msgstr ""
+
+#: common/models.py:185 part/models.py:844 part/templates/part/detail.html:190
+#: templates/js/table_filters.js:32 templates/js/table_filters.js:316
+msgid "Trackable"
+msgstr ""
+
+#: common/models.py:186
msgid "Parts are trackable by default"
msgstr ""
-#: common/models.py:178 part/models.py:864 part/templates/part/detail.html:150
+#: common/models.py:192 part/models.py:864 part/templates/part/detail.html:150
#: templates/js/table_filters.js:28
msgid "Virtual"
msgstr ""
-#: common/models.py:179
+#: common/models.py:193
msgid "Parts are virtual by default"
msgstr ""
-#: common/models.py:185
+#: common/models.py:199
msgid "Show Quantity in Forms"
msgstr ""
-#: common/models.py:186
+#: common/models.py:200
msgid "Display available part quantity in some forms"
msgstr ""
-#: common/models.py:192
+#: common/models.py:206
msgid "Debug Mode"
msgstr ""
-#: common/models.py:193
+#: common/models.py:207
msgid "Generate reports in debug mode (HTML output)"
msgstr ""
-#: common/models.py:199
+#: common/models.py:213
msgid "Page Size"
msgstr ""
-#: common/models.py:200
+#: common/models.py:214
msgid "Default page size for PDF reports"
msgstr ""
-#: common/models.py:210
+#: common/models.py:224
msgid "Test Reports"
msgstr ""
-#: common/models.py:211
+#: common/models.py:225
msgid "Enable generation of test reports"
msgstr ""
-#: common/models.py:217
+#: common/models.py:231
msgid "Stock Expiry"
msgstr ""
-#: common/models.py:218
+#: common/models.py:232
msgid "Enable stock expiry functionality"
msgstr ""
-#: common/models.py:224
+#: common/models.py:238
msgid "Sell Expired Stock"
msgstr ""
-#: common/models.py:225
+#: common/models.py:239
msgid "Allow sale of expired stock"
msgstr ""
-#: common/models.py:231
+#: common/models.py:245
msgid "Stock Stale Time"
msgstr ""
-#: common/models.py:232
+#: common/models.py:246
msgid "Number of days stock items are considered stale before expiring"
msgstr ""
-#: common/models.py:234 part/templates/part/detail.html:121
+#: common/models.py:248 part/templates/part/detail.html:121
msgid "days"
msgstr ""
-#: common/models.py:239
+#: common/models.py:253
msgid "Build Expired Stock"
msgstr ""
-#: common/models.py:240
+#: common/models.py:254
msgid "Allow building with expired stock"
msgstr ""
-#: common/models.py:246
+#: common/models.py:260
msgid "Stock Ownership Control"
msgstr ""
-#: common/models.py:247
+#: common/models.py:261
msgid "Enable ownership control over stock locations and items"
msgstr ""
-#: common/models.py:253
+#: common/models.py:267
msgid "Group by Part"
msgstr ""
-#: common/models.py:254
+#: common/models.py:268
msgid "Group stock items by part reference in table views"
msgstr ""
-#: common/models.py:260
+#: common/models.py:274
msgid "Recent Stock Count"
msgstr ""
-#: common/models.py:261
+#: common/models.py:275
msgid "Number of recent stock items to display on index page"
msgstr ""
-#: common/models.py:267
+#: common/models.py:281
msgid "Build Order Reference Prefix"
msgstr ""
-#: common/models.py:268
+#: common/models.py:282
msgid "Prefix value for build order reference"
msgstr ""
-#: common/models.py:273
+#: common/models.py:287
msgid "Build Order Reference Regex"
msgstr ""
-#: common/models.py:274
+#: common/models.py:288
msgid "Regular expression pattern for matching build order reference"
msgstr ""
-#: common/models.py:278
+#: common/models.py:292
msgid "Sales Order Reference Prefix"
msgstr ""
-#: common/models.py:279
+#: common/models.py:293
msgid "Prefix value for sales order reference"
msgstr ""
-#: common/models.py:284
+#: common/models.py:298
msgid "Purchase Order Reference Prefix"
msgstr ""
-#: common/models.py:285
+#: common/models.py:299
msgid "Prefix value for purchase order reference"
msgstr ""
-#: common/models.py:508
+#: common/models.py:522
msgid "Settings key (must be unique - case insensitive"
msgstr ""
-#: common/models.py:510
+#: common/models.py:524
msgid "Settings value"
msgstr ""
-#: common/models.py:545
+#: common/models.py:559
msgid "Must be an integer value"
msgstr ""
-#: common/models.py:568
+#: common/models.py:582
msgid "Value must be a boolean value"
msgstr ""
-#: common/models.py:579
+#: common/models.py:593
msgid "Value must be an integer value"
msgstr ""
-#: common/models.py:602
+#: common/models.py:616
msgid "Key string must be unique"
msgstr ""
-#: common/models.py:683 company/forms.py:113
+#: common/models.py:697 company/forms.py:131
msgid "Price break quantity"
msgstr ""
-#: common/models.py:691 company/templates/company/supplier_part_pricing.html:82
+#: common/models.py:705 company/templates/company/supplier_part_pricing.html:82
#: part/templates/part/sale_prices.html:90 templates/js/bom.js:255
msgid "Price"
msgstr ""
-#: common/models.py:692
+#: common/models.py:706
msgid "Unit price at specified quantity"
msgstr ""
-#: common/models.py:715
+#: common/models.py:729
msgid "Default"
msgstr ""
@@ -1526,11 +1551,19 @@ msgstr ""
msgid "Default currency used for this company"
msgstr ""
-#: company/forms.py:80
+#: company/forms.py:75 part/forms.py:46
+msgid "URL"
+msgstr ""
+
+#: company/forms.py:76 part/forms.py:47
+msgid "Image URL"
+msgstr ""
+
+#: company/forms.py:98
msgid "Single Price"
msgstr ""
-#: company/forms.py:82
+#: company/forms.py:100
msgid "Single quantity price"
msgstr ""
@@ -1542,7 +1575,7 @@ msgstr ""
msgid "Description of the company"
msgstr ""
-#: company/models.py:100 company/templates/company/company_base.html:57
+#: company/models.py:100 company/templates/company/company_base.html:70
#: company/templates/company/detail.html:31 templates/js/company.js:60
msgid "Website"
msgstr ""
@@ -1551,7 +1584,7 @@ msgstr ""
msgid "Company website URL"
msgstr ""
-#: company/models.py:103 company/templates/company/company_base.html:64
+#: company/models.py:103 company/templates/company/company_base.html:77
msgid "Address"
msgstr ""
@@ -1567,7 +1600,7 @@ msgstr ""
msgid "Contact phone number"
msgstr ""
-#: company/models.py:111 company/templates/company/company_base.html:78
+#: company/models.py:111 company/templates/company/company_base.html:91
msgid "Email"
msgstr ""
@@ -1575,7 +1608,7 @@ msgstr ""
msgid "Contact email address"
msgstr ""
-#: company/models.py:114 company/templates/company/company_base.html:85
+#: company/models.py:114 company/templates/company/company_base.html:98
msgid "Contact"
msgstr ""
@@ -1604,7 +1637,7 @@ msgid "Currency"
msgstr ""
#: company/models.py:313 stock/models.py:370
-#: stock/templates/stock/item_base.html:214
+#: stock/templates/stock/item_base.html:220
msgid "Base Part"
msgstr ""
@@ -1615,9 +1648,9 @@ msgstr ""
#: company/models.py:323 company/templates/company/detail.html:60
#: company/templates/company/supplier_part_base.html:83
#: company/templates/company/supplier_part_detail.html:25
-#: order/templates/order/order_base.html:89
+#: order/templates/order/order_base.html:92
#: order/templates/order/order_wizard/select_pos.html:30 part/bom.py:170
-#: stock/templates/stock/item_base.html:331 templates/js/company.js:48
+#: stock/templates/stock/item_base.html:337 templates/js/company.js:48
#: templates/js/company.js:164 templates/js/order.js:170
msgid "Supplier"
msgstr ""
@@ -1659,7 +1692,7 @@ msgid "Manufacturer part number"
msgstr ""
#: company/models.py:353 part/models.py:742
-#: report/templates/report/inventree_build_order_base.html:168
+#: report/templates/report/inventree_build_order_base.html:165
#: templates/js/company.js:208 templates/js/part.js:430
msgid "Link"
msgstr ""
@@ -1674,6 +1707,8 @@ msgstr ""
#: company/models.py:365 company/templates/company/supplier_part_base.html:113
#: company/templates/company/supplier_part_detail.html:38
+#: report/templates/report/inventree_po_report.html:93
+#: report/templates/report/inventree_so_report.html:93
msgid "Note"
msgstr ""
@@ -1691,19 +1726,29 @@ msgstr ""
msgid "Assigned Stock"
msgstr ""
-#: company/templates/company/company_base.html:7
-#: company/templates/company/company_base.html:22
+#: company/templates/company/company_base.html:9
+#: company/templates/company/company_base.html:35
#: templates/InvenTree/search.html:288 templates/js/company.js:33
msgid "Company"
msgstr ""
-#: company/templates/company/company_base.html:51
+#: company/templates/company/company_base.html:25
+#: part/templates/part/part_thumb.html:21
+msgid "Upload new image"
+msgstr ""
+
+#: company/templates/company/company_base.html:27
+#: part/templates/part/part_thumb.html:23
+msgid "Download image from URL"
+msgstr ""
+
+#: company/templates/company/company_base.html:64
#: company/templates/company/detail.html:10
#: company/templates/company/navbar.html:12
msgid "Company Details"
msgstr ""
-#: company/templates/company/company_base.html:71
+#: company/templates/company/company_base.html:84
msgid "Phone"
msgstr ""
@@ -1720,8 +1765,8 @@ msgid "Uses default currency"
msgstr ""
#: company/templates/company/detail.html:65
-#: order/templates/order/sales_order_base.html:89 stock/models.py:412
-#: stock/models.py:413 stock/templates/stock/item_base.html:241
+#: order/templates/order/sales_order_base.html:92 stock/models.py:412
+#: stock/models.py:413 stock/templates/stock/item_base.html:247
#: templates/js/company.js:40 templates/js/order.js:267
msgid "Customer"
msgstr ""
@@ -1770,23 +1815,23 @@ msgstr ""
msgid "Create new Part"
msgstr ""
-#: company/templates/company/detail_part.html:72 company/views.py:56
-#: order/templates/order/purchase_orders.html:164
+#: company/templates/company/detail_part.html:72 company/views.py:62
+#: order/templates/order/purchase_orders.html:182
#: part/templates/part/supplier.html:50
msgid "New Supplier"
msgstr ""
-#: company/templates/company/detail_part.html:73 company/views.py:195
-#: order/templates/order/purchase_orders.html:165
+#: company/templates/company/detail_part.html:73 company/views.py:279
+#: order/templates/order/purchase_orders.html:183
msgid "Create new Supplier"
msgstr ""
-#: company/templates/company/detail_part.html:78 company/views.py:63
+#: company/templates/company/detail_part.html:78 company/views.py:69
#: part/templates/part/supplier.html:56
msgid "New Manufacturer"
msgstr ""
-#: company/templates/company/detail_part.html:79 company/views.py:198
+#: company/templates/company/detail_part.html:79 company/views.py:282
msgid "Create new Manufacturer"
msgstr ""
@@ -1897,28 +1942,28 @@ msgid "Are you sure you want to delete the following Supplier Parts?"
msgstr ""
#: company/templates/company/purchase_orders.html:18
-#: order/templates/order/purchase_orders.html:19
+#: order/templates/order/purchase_orders.html:20
msgid "Create new purchase order"
msgstr ""
#: company/templates/company/purchase_orders.html:19
-#: order/templates/order/purchase_orders.html:20
+#: order/templates/order/purchase_orders.html:21
msgid "New Purchase Order"
msgstr ""
#: company/templates/company/sales_orders.html:19
-#: order/templates/order/sales_orders.html:19
+#: order/templates/order/sales_orders.html:20
msgid "Create new sales order"
msgstr ""
#: company/templates/company/sales_orders.html:20
-#: order/templates/order/sales_orders.html:20
+#: order/templates/order/sales_orders.html:21
msgid "New Sales Order"
msgstr ""
#: company/templates/company/supplier_part_base.html:6
#: company/templates/company/supplier_part_base.html:19 stock/models.py:379
-#: stock/templates/stock/item_base.html:336 templates/js/company.js:180
+#: stock/templates/stock/item_base.html:342 templates/js/company.js:180
msgid "Supplier Part"
msgstr ""
@@ -1946,7 +1991,7 @@ msgid "Internal Part"
msgstr ""
#: company/templates/company/supplier_part_base.html:106 stock/models.py:394
-#: stock/templates/stock/item_base.html:289 templates/js/stock.js:663
+#: stock/templates/stock/item_base.html:295 templates/js/stock.js:663
msgid "Packaging"
msgstr ""
@@ -1959,8 +2004,8 @@ msgstr ""
msgid "Pricing Information"
msgstr ""
-#: company/templates/company/supplier_part_pricing.html:19 company/views.py:485
-#: part/templates/part/sale_prices.html:17 part/views.py:2511
+#: company/templates/company/supplier_part_pricing.html:19 company/views.py:569
+#: part/templates/part/sale_prices.html:17 part/views.py:2618
msgid "Add Price Break"
msgstr ""
@@ -1979,95 +2024,107 @@ msgstr ""
msgid "Delete price break"
msgstr ""
-#: company/views.py:55 part/templates/part/navbar.html:72
+#: company/views.py:61 part/templates/part/navbar.html:72
#: part/templates/part/navbar.html:75 templates/InvenTree/search.html:291
#: templates/navbar.html:35
msgid "Suppliers"
msgstr ""
-#: company/views.py:62 templates/InvenTree/search.html:308
+#: company/views.py:68 templates/InvenTree/search.html:308
#: templates/navbar.html:36
msgid "Manufacturers"
msgstr ""
-#: company/views.py:69 templates/InvenTree/search.html:321
+#: company/views.py:75 templates/InvenTree/search.html:321
#: templates/navbar.html:45
msgid "Customers"
msgstr ""
-#: company/views.py:70
+#: company/views.py:76 order/templates/order/sales_orders.html:184
msgid "New Customer"
msgstr ""
-#: company/views.py:78
+#: company/views.py:84
msgid "Companies"
msgstr ""
-#: company/views.py:79
+#: company/views.py:85
msgid "New Company"
msgstr ""
-#: company/views.py:157
+#: company/views.py:167 part/views.py:848
+msgid "Download Image"
+msgstr ""
+
+#: company/views.py:196 part/views.py:880
+msgid "Image size exceeds maximum allowable size for download"
+msgstr ""
+
+#: company/views.py:212 part/views.py:896
+msgid "Supplied URL is not a valid image file"
+msgstr ""
+
+#: company/views.py:241
msgid "Update Company Image"
msgstr ""
-#: company/views.py:163
+#: company/views.py:247
msgid "Updated company image"
msgstr ""
-#: company/views.py:173
+#: company/views.py:257
msgid "Edit Company"
msgstr ""
-#: company/views.py:178
+#: company/views.py:262
msgid "Edited company information"
msgstr ""
-#: company/views.py:201
+#: company/views.py:285 order/templates/order/sales_orders.html:185
msgid "Create new Customer"
msgstr ""
-#: company/views.py:203
+#: company/views.py:287
msgid "Create new Company"
msgstr ""
-#: company/views.py:230
+#: company/views.py:314
msgid "Created new company"
msgstr ""
-#: company/views.py:240
+#: company/views.py:324
msgid "Delete Company"
msgstr ""
-#: company/views.py:246
+#: company/views.py:330
msgid "Company was deleted"
msgstr ""
-#: company/views.py:271
+#: company/views.py:355
msgid "Edit Supplier Part"
msgstr ""
-#: company/views.py:294 templates/js/stock.js:1083
+#: company/views.py:378 templates/js/stock.js:1083
msgid "Create new Supplier Part"
msgstr ""
-#: company/views.py:413
+#: company/views.py:497
msgid "Delete Supplier Part"
msgstr ""
-#: company/views.py:490 part/views.py:2515
+#: company/views.py:574 part/views.py:2622
msgid "Added new price break"
msgstr ""
-#: company/views.py:546 part/views.py:2559
+#: company/views.py:630 part/views.py:2666
msgid "Edit Price Break"
msgstr ""
-#: company/views.py:561 part/views.py:2573
+#: company/views.py:645 part/views.py:2680
msgid "Delete Price Break"
msgstr ""
-#: label/api.py:56 report/api.py:162
+#: label/api.py:56 report/api.py:201
msgid "No valid objects provided to template"
msgstr ""
@@ -2087,7 +2144,7 @@ msgstr ""
msgid "Label template file"
msgstr ""
-#: label/models.py:123 report/models.py:257
+#: label/models.py:123 report/models.py:274
msgid "Enabled"
msgstr ""
@@ -2111,24 +2168,25 @@ msgstr ""
msgid "Query filters (comma-separated list of key=value pairs"
msgstr ""
-#: label/models.py:223 label/models.py:274 report/models.py:277
+#: label/models.py:223 label/models.py:274 report/models.py:294
+#: report/models.py:415 report/models.py:449
msgid "Filters"
msgstr ""
-#: order/forms.py:25 order/templates/order/order_base.html:44
+#: order/forms.py:25 order/templates/order/order_base.html:47
msgid "Place order"
msgstr ""
-#: order/forms.py:36 order/templates/order/order_base.html:51
+#: order/forms.py:36 order/templates/order/order_base.html:54
msgid "Mark order as complete"
msgstr ""
-#: order/forms.py:47 order/forms.py:58 order/templates/order/order_base.html:56
-#: order/templates/order/sales_order_base.html:56
+#: order/forms.py:47 order/forms.py:58 order/templates/order/order_base.html:59
+#: order/templates/order/sales_order_base.html:59
msgid "Cancel order"
msgstr ""
-#: order/forms.py:69 order/templates/order/sales_order_base.html:53
+#: order/forms.py:69 order/templates/order/sales_order_base.html:56
msgid "Ship order"
msgstr ""
@@ -2144,153 +2202,158 @@ msgstr ""
msgid "Target date for order delivery. Order will be overdue after this date."
msgstr ""
-#: order/forms.py:134
+#: order/forms.py:135
msgid "Enter sales order number"
msgstr ""
-#: order/forms.py:140 order/models.py:438
+#: order/forms.py:141 order/models.py:448
msgid ""
"Target date for order completion. Order will be overdue after this date."
msgstr ""
-#: order/models.py:98
+#: order/models.py:99
msgid "Order reference"
msgstr ""
-#: order/models.py:100
+#: order/models.py:101
msgid "Order description"
msgstr ""
-#: order/models.py:102
+#: order/models.py:103
msgid "Link to external page"
msgstr ""
-#: order/models.py:112
+#: order/models.py:117
+msgid "User or group responsible for this order"
+msgstr ""
+
+#: order/models.py:122
msgid "Order notes"
msgstr ""
-#: order/models.py:171 order/models.py:431
+#: order/models.py:181 order/models.py:441
msgid "Purchase order status"
msgstr ""
-#: order/models.py:179
+#: order/models.py:189
msgid "Company from which the items are being ordered"
msgstr ""
-#: order/models.py:182
+#: order/models.py:192
msgid "Supplier order reference code"
msgstr ""
-#: order/models.py:193
+#: order/models.py:203
msgid "Issue Date"
msgstr ""
-#: order/models.py:194
+#: order/models.py:204
msgid "Date order was issued"
msgstr ""
-#: order/models.py:199
+#: order/models.py:209
msgid "Target Delivery Date"
msgstr ""
-#: order/models.py:200
+#: order/models.py:210
msgid ""
"Expected date for order delivery. Order will be overdue after this date."
msgstr ""
-#: order/models.py:205
+#: order/models.py:215
msgid "Completion Date"
msgstr ""
-#: order/models.py:206
+#: order/models.py:216
msgid "Date order was completed"
msgstr ""
-#: order/models.py:230 order/models.py:329 part/views.py:1479
+#: order/models.py:240 order/models.py:339 part/views.py:1586
#: stock/models.py:269 stock/models.py:948
msgid "Quantity must be greater than zero"
msgstr ""
-#: order/models.py:235
+#: order/models.py:245
msgid "Part supplier must match PO supplier"
msgstr ""
-#: order/models.py:324
+#: order/models.py:334
msgid "Lines can only be received against an order marked as 'Placed'"
msgstr ""
-#: order/models.py:346
+#: order/models.py:356
msgid "Received items"
msgstr ""
-#: order/models.py:427
+#: order/models.py:437
msgid "Company to which the items are being sold"
msgstr ""
-#: order/models.py:433
+#: order/models.py:443
msgid "Customer order reference code"
msgstr ""
-#: order/models.py:491
+#: order/models.py:501
msgid "SalesOrder cannot be shipped as it is not currently pending"
msgstr ""
-#: order/models.py:578
+#: order/models.py:588
msgid "Item quantity"
msgstr ""
-#: order/models.py:580
+#: order/models.py:590
msgid "Line item reference"
msgstr ""
-#: order/models.py:582
+#: order/models.py:592
msgid "Line item notes"
msgstr ""
-#: order/models.py:608 order/templates/order/order_base.html:9
+#: order/models.py:618 order/templates/order/order_base.html:9
#: order/templates/order/order_base.html:24
-#: stock/templates/stock/item_base.html:303 templates/js/order.js:148
+#: report/templates/report/inventree_po_report.html:77
+#: stock/templates/stock/item_base.html:309 templates/js/order.js:148
msgid "Purchase Order"
msgstr ""
-#: order/models.py:621
+#: order/models.py:631
msgid "Supplier part"
msgstr ""
-#: order/models.py:624
+#: order/models.py:634
msgid "Number of items received"
msgstr ""
-#: order/models.py:631 stock/models.py:505
-#: stock/templates/stock/item_base.html:310
+#: order/models.py:641 stock/models.py:505
+#: stock/templates/stock/item_base.html:316
msgid "Purchase Price"
msgstr ""
-#: order/models.py:632
+#: order/models.py:642
msgid "Unit purchase price"
msgstr ""
-#: order/models.py:727
+#: order/models.py:737
msgid "Cannot allocate stock item to a line with a different part"
msgstr ""
-#: order/models.py:729
+#: order/models.py:739
msgid "Cannot allocate stock to a line without a part"
msgstr ""
-#: order/models.py:732
+#: order/models.py:742
msgid "Allocation quantity cannot exceed stock quantity"
msgstr ""
-#: order/models.py:742
+#: order/models.py:752
msgid "Quantity must be 1 for serialized stock item"
msgstr ""
-#: order/models.py:758
+#: order/models.py:768
msgid "Select stock item to allocate"
msgstr ""
-#: order/models.py:761
+#: order/models.py:771
msgid "Enter stock allocation quantity"
msgstr ""
@@ -2300,46 +2363,51 @@ msgstr ""
msgid "Are you sure you want to delete this attachment?"
msgstr ""
-#: order/templates/order/order_base.html:40
+#: order/templates/order/order_base.html:39
+#: order/templates/order/sales_order_base.html:48
+msgid "Print"
+msgstr ""
+
+#: order/templates/order/order_base.html:43
msgid "Edit order information"
msgstr ""
-#: order/templates/order/order_base.html:48
+#: order/templates/order/order_base.html:51
msgid "Receive items"
msgstr ""
-#: order/templates/order/order_base.html:61
+#: order/templates/order/order_base.html:64
msgid "Export order to file"
msgstr ""
-#: order/templates/order/order_base.html:69
+#: order/templates/order/order_base.html:72
#: order/templates/order/po_navbar.html:11
msgid "Purchase Order Details"
msgstr ""
-#: order/templates/order/order_base.html:74
-#: order/templates/order/sales_order_base.html:74
+#: order/templates/order/order_base.html:77
+#: order/templates/order/sales_order_base.html:77
msgid "Order Reference"
msgstr ""
-#: order/templates/order/order_base.html:79
-#: order/templates/order/sales_order_base.html:79
+#: order/templates/order/order_base.html:82
+#: order/templates/order/sales_order_base.html:82
msgid "Order Status"
msgstr ""
-#: order/templates/order/order_base.html:95 templates/js/order.js:179
+#: order/templates/order/order_base.html:98 templates/js/order.js:179
msgid "Supplier Reference"
msgstr ""
-#: order/templates/order/order_base.html:114
-#: report/templates/report/inventree_build_order_base.html:125
+#: order/templates/order/order_base.html:117
+#: report/templates/report/inventree_build_order_base.html:122
msgid "Issued"
msgstr ""
-#: order/templates/order/order_base.html:128
+#: order/templates/order/order_base.html:131
#: order/templates/order/purchase_order_detail.html:207
#: order/templates/order/receive_parts.html:22
-#: order/templates/order/sales_order_base.html:128
+#: order/templates/order/sales_order_base.html:131
msgid "Received"
msgstr ""
@@ -2451,6 +2519,11 @@ msgstr ""
msgid "Receive line item"
msgstr ""
+#: order/templates/order/purchase_orders.html:24
+#: order/templates/order/sales_orders.html:24
+msgid "Print Order Reports"
+msgstr ""
+
#: order/templates/order/receive_parts.html:8
msgid "Receive outstanding parts for"
msgstr ""
@@ -2480,16 +2553,16 @@ msgstr ""
msgid "This SalesOrder has not been fully allocated"
msgstr ""
-#: order/templates/order/sales_order_base.html:61
+#: order/templates/order/sales_order_base.html:64
msgid "Packing List"
msgstr ""
-#: order/templates/order/sales_order_base.html:69
+#: order/templates/order/sales_order_base.html:72
#: order/templates/order/so_navbar.html:12
msgid "Sales Order Details"
msgstr ""
-#: order/templates/order/sales_order_base.html:95 templates/js/order.js:275
+#: order/templates/order/sales_order_base.html:98 templates/js/order.js:275
msgid "Customer Reference"
msgstr ""
@@ -2507,7 +2580,7 @@ msgstr ""
#: order/templates/order/sales_order_detail.html:75
#: order/templates/order/sales_order_detail.html:157
#: report/templates/report/inventree_test_report_base.html:75
-#: stock/models.py:417 stock/templates/stock/item_base.html:228
+#: stock/models.py:417 stock/templates/stock/item_base.html:234
#: templates/js/build.js:418
msgid "Serial Number"
msgstr ""
@@ -2727,136 +2800,136 @@ msgstr ""
msgid "Available Stock"
msgstr ""
-#: part/bom.py:274
+#: part/bom.py:278
#, python-brace-format
msgid "Unsupported file format: {f}"
msgstr ""
-#: part/bom.py:279
+#: part/bom.py:283
msgid "Error reading BOM file (invalid data)"
msgstr ""
-#: part/bom.py:281
+#: part/bom.py:285
msgid "Error reading BOM file (incorrect row size)"
msgstr ""
-#: part/forms.py:71 stock/forms.py:264
+#: part/forms.py:89 stock/forms.py:264
msgid "File Format"
msgstr ""
-#: part/forms.py:71 stock/forms.py:264
+#: part/forms.py:89 stock/forms.py:264
msgid "Select output file format"
msgstr ""
-#: part/forms.py:73
+#: part/forms.py:91
msgid "Cascading"
msgstr ""
-#: part/forms.py:73
+#: part/forms.py:91
msgid "Download cascading / multi-level BOM"
msgstr ""
-#: part/forms.py:75
+#: part/forms.py:93
msgid "Levels"
msgstr ""
-#: part/forms.py:75
+#: part/forms.py:93
msgid "Select maximum number of BOM levels to export (0 = all levels)"
msgstr ""
-#: part/forms.py:77
+#: part/forms.py:95
msgid "Include Parameter Data"
msgstr ""
-#: part/forms.py:77
+#: part/forms.py:95
msgid "Include part parameters data in exported BOM"
msgstr ""
-#: part/forms.py:79
+#: part/forms.py:97
msgid "Include Stock Data"
msgstr ""
-#: part/forms.py:79
+#: part/forms.py:97
msgid "Include part stock data in exported BOM"
msgstr ""
-#: part/forms.py:81
+#: part/forms.py:99
msgid "Include Supplier Data"
msgstr ""
-#: part/forms.py:81
+#: part/forms.py:99
msgid "Include part supplier data in exported BOM"
msgstr ""
-#: part/forms.py:102 part/models.py:2053
+#: part/forms.py:120 part/models.py:2053
msgid "Parent Part"
msgstr ""
-#: part/forms.py:103 part/templates/part/bom_duplicate.html:7
+#: part/forms.py:121 part/templates/part/bom_duplicate.html:7
msgid "Select parent part to copy BOM from"
msgstr ""
-#: part/forms.py:109
+#: part/forms.py:127
msgid "Clear existing BOM items"
msgstr ""
-#: part/forms.py:114
+#: part/forms.py:132
msgid "Confirm BOM duplication"
msgstr ""
-#: part/forms.py:132
+#: part/forms.py:150
msgid "Confirm that the BOM is correct"
msgstr ""
-#: part/forms.py:144
+#: part/forms.py:162
msgid "Select BOM file to upload"
msgstr ""
-#: part/forms.py:163
+#: part/forms.py:181
msgid "Related Part"
msgstr ""
-#: part/forms.py:182
+#: part/forms.py:200
msgid "Select part category"
msgstr ""
-#: part/forms.py:199
+#: part/forms.py:217
msgid "Duplicate all BOM data for this part"
msgstr ""
-#: part/forms.py:200
+#: part/forms.py:218
msgid "Copy BOM"
msgstr ""
-#: part/forms.py:205
+#: part/forms.py:223
msgid "Duplicate all parameter data for this part"
msgstr ""
-#: part/forms.py:206
+#: part/forms.py:224
msgid "Copy Parameters"
msgstr ""
-#: part/forms.py:211
+#: part/forms.py:229
msgid "Confirm part creation"
msgstr ""
-#: part/forms.py:216
+#: part/forms.py:234
msgid "Include category parameter templates"
msgstr ""
-#: part/forms.py:221
+#: part/forms.py:239
msgid "Include parent categories parameter templates"
msgstr ""
-#: part/forms.py:301
+#: part/forms.py:319
msgid "Add parameter template to same level categories"
msgstr ""
-#: part/forms.py:305
+#: part/forms.py:323
msgid "Add parameter template to all categories"
msgstr ""
-#: part/forms.py:350
+#: part/forms.py:368
msgid "Input quantity for price calculation"
msgstr ""
@@ -2960,7 +3033,7 @@ msgstr ""
msgid "Part revision or version number"
msgstr ""
-#: part/models.py:737 part/templates/part/detail.html:35 report/models.py:181
+#: part/models.py:737 part/templates/part/detail.html:35 report/models.py:198
#: templates/js/part.js:164
msgid "Revision"
msgstr ""
@@ -3024,7 +3097,7 @@ msgstr ""
#: part/models.py:859 part/templates/part/detail.html:227
#: templates/js/table_filters.js:20 templates/js/table_filters.js:60
-#: templates/js/table_filters.js:209 templates/js/table_filters.js:278
+#: templates/js/table_filters.js:214 templates/js/table_filters.js:283
msgid "Active"
msgstr ""
@@ -3069,7 +3142,7 @@ msgid "Enter description for this test"
msgstr ""
#: part/models.py:1974 templates/js/part.js:570
-#: templates/js/table_filters.js:195
+#: templates/js/table_filters.js:200
msgid "Required"
msgstr ""
@@ -3159,7 +3232,7 @@ msgstr ""
msgid "This BOM item is inherited by BOMs for variant parts"
msgstr ""
-#: part/models.py:2243 part/views.py:1485 part/views.py:1537
+#: part/models.py:2243 part/views.py:1592 part/views.py:1644
#: stock/models.py:259
msgid "Quantity must be integer value for trackable parts"
msgstr ""
@@ -3197,7 +3270,7 @@ msgstr ""
#: part/templates/part/allocation.html:49
#: stock/templates/stock/item_base.html:8
#: stock/templates/stock/item_base.html:89
-#: stock/templates/stock/item_base.html:318
+#: stock/templates/stock/item_base.html:324
#: stock/templates/stock/stock_adjust.html:16 templates/js/build.js:771
#: templates/js/stock.js:923 templates/js/stock.js:1181
msgid "Stock Item"
@@ -3248,7 +3321,7 @@ msgstr ""
msgid "Validate Bill of Materials"
msgstr ""
-#: part/templates/part/bom.html:61 part/views.py:1776
+#: part/templates/part/bom.html:61 part/views.py:1883
msgid "Export Bill of Materials"
msgstr ""
@@ -3264,7 +3337,7 @@ msgstr ""
msgid "All selected BOM items will be deleted"
msgstr ""
-#: part/templates/part/bom.html:160 part/views.py:579
+#: part/templates/part/bom.html:160 part/views.py:584
#: templates/js/stock.js:1077
msgid "Create New Part"
msgstr ""
@@ -3366,7 +3439,7 @@ msgstr ""
msgid "All parts"
msgstr ""
-#: part/templates/part/category.html:25 part/views.py:2157
+#: part/templates/part/category.html:25 part/views.py:2264
msgid "Create new part category"
msgstr ""
@@ -3486,7 +3559,7 @@ msgstr ""
msgid "Part Parameters"
msgstr ""
-#: part/templates/part/copy_part.html:9 part/views.py:455
+#: part/templates/part/copy_part.html:9 part/views.py:460
msgid "Duplicate Part"
msgstr ""
@@ -3628,7 +3701,7 @@ msgstr ""
msgid "Part Test Templates"
msgstr ""
-#: part/templates/part/navbar.html:103 stock/templates/stock/item_base.html:376
+#: part/templates/part/navbar.html:103 stock/templates/stock/item_base.html:382
msgid "Tests"
msgstr ""
@@ -3647,7 +3720,7 @@ msgstr ""
#: part/templates/part/params.html:18
#: templates/InvenTree/settings/category.html:29
-#: templates/InvenTree/settings/part.html:43
+#: templates/InvenTree/settings/part.html:44
msgid "New Parameter"
msgstr ""
@@ -3663,7 +3736,7 @@ msgid "Edit"
msgstr ""
#: part/templates/part/params.html:44 part/templates/part/related.html:44
-#: part/templates/part/supplier.html:22 users/models.py:168
+#: part/templates/part/supplier.html:22 users/models.py:170
msgid "Delete"
msgstr ""
@@ -3726,7 +3799,7 @@ msgstr ""
msgid "Delete part"
msgstr ""
-#: part/templates/part/part_base.html:122 templates/js/table_filters.js:129
+#: part/templates/part/part_base.html:122 templates/js/table_filters.js:134
msgid "In Stock"
msgstr ""
@@ -3754,14 +3827,10 @@ msgstr ""
msgid "Add Test Template"
msgstr ""
-#: part/templates/part/part_thumb.html:16
+#: part/templates/part/part_thumb.html:20
msgid "Select from existing images"
msgstr ""
-#: part/templates/part/part_thumb.html:17
-msgid "Upload new image"
-msgstr ""
-
#: part/templates/part/related.html:18
msgid "Add Related"
msgstr ""
@@ -3847,283 +3916,296 @@ msgstr ""
msgid "New Variant"
msgstr ""
-#: part/views.py:84
+#: part/views.py:89
msgid "Add Related Part"
msgstr ""
-#: part/views.py:139
+#: part/views.py:144
msgid "Delete Related Part"
msgstr ""
-#: part/views.py:153
+#: part/views.py:158
msgid "Add part attachment"
msgstr ""
-#: part/views.py:206 templates/attachment_table.html:32
+#: part/views.py:211 templates/attachment_table.html:32
msgid "Edit attachment"
msgstr ""
-#: part/views.py:210
+#: part/views.py:215
msgid "Part attachment updated"
msgstr ""
-#: part/views.py:225
+#: part/views.py:230
msgid "Delete Part Attachment"
msgstr ""
-#: part/views.py:233
+#: part/views.py:238
msgid "Deleted part attachment"
msgstr ""
-#: part/views.py:242
+#: part/views.py:247
msgid "Create Test Template"
msgstr ""
-#: part/views.py:269
+#: part/views.py:274
msgid "Edit Test Template"
msgstr ""
-#: part/views.py:283
+#: part/views.py:288
msgid "Delete Test Template"
msgstr ""
-#: part/views.py:290
+#: part/views.py:295
msgid "Set Part Category"
msgstr ""
-#: part/views.py:340
+#: part/views.py:345
#, python-brace-format
msgid "Set category for {n} parts"
msgstr ""
-#: part/views.py:375
+#: part/views.py:380
msgid "Create Variant"
msgstr ""
-#: part/views.py:460
+#: part/views.py:465
msgid "Copied part"
msgstr ""
-#: part/views.py:514 part/views.py:652
+#: part/views.py:519 part/views.py:657
msgid "Possible matches exist - confirm creation of new part"
msgstr ""
-#: part/views.py:584
+#: part/views.py:589
msgid "Created new part"
msgstr ""
-#: part/views.py:820
+#: part/views.py:825
msgid "Part QR Code"
msgstr ""
-#: part/views.py:839
+#: part/views.py:927
msgid "Upload Part Image"
msgstr ""
-#: part/views.py:845 part/views.py:880
+#: part/views.py:933 part/views.py:968
msgid "Updated part image"
msgstr ""
-#: part/views.py:854
+#: part/views.py:942
msgid "Select Part Image"
msgstr ""
-#: part/views.py:883
+#: part/views.py:971
msgid "Part image not found"
msgstr ""
-#: part/views.py:894
+#: part/views.py:982
msgid "Edit Part Properties"
msgstr ""
-#: part/views.py:923
+#: part/views.py:1017
msgid "Duplicate BOM"
msgstr ""
-#: part/views.py:953
+#: part/views.py:1047
msgid "Confirm duplication of BOM from parent"
msgstr ""
-#: part/views.py:974
+#: part/views.py:1068
msgid "Validate BOM"
msgstr ""
-#: part/views.py:995
+#: part/views.py:1089
msgid "Confirm that the BOM is valid"
msgstr ""
-#: part/views.py:1006
+#: part/views.py:1100
msgid "Validated Bill of Materials"
msgstr ""
-#: part/views.py:1140
+#: part/views.py:1234
msgid "No BOM file provided"
msgstr ""
-#: part/views.py:1488
+#: part/views.py:1595
msgid "Enter a valid quantity"
msgstr ""
-#: part/views.py:1513 part/views.py:1516
+#: part/views.py:1620 part/views.py:1623
msgid "Select valid part"
msgstr ""
-#: part/views.py:1522
+#: part/views.py:1629
msgid "Duplicate part selected"
msgstr ""
-#: part/views.py:1560
+#: part/views.py:1667
msgid "Select a part"
msgstr ""
-#: part/views.py:1566
+#: part/views.py:1673
msgid "Selected part creates a circular BOM"
msgstr ""
-#: part/views.py:1570
+#: part/views.py:1677
msgid "Specify quantity"
msgstr ""
-#: part/views.py:1826
+#: part/views.py:1933
msgid "Confirm Part Deletion"
msgstr ""
-#: part/views.py:1833
+#: part/views.py:1940
msgid "Part was deleted"
msgstr ""
-#: part/views.py:1842
+#: part/views.py:1949
msgid "Part Pricing"
msgstr ""
-#: part/views.py:1956
+#: part/views.py:2063
msgid "Create Part Parameter Template"
msgstr ""
-#: part/views.py:1966
+#: part/views.py:2073
msgid "Edit Part Parameter Template"
msgstr ""
-#: part/views.py:1973
+#: part/views.py:2080
msgid "Delete Part Parameter Template"
msgstr ""
-#: part/views.py:1981
+#: part/views.py:2088
msgid "Create Part Parameter"
msgstr ""
-#: part/views.py:2031
+#: part/views.py:2138
msgid "Edit Part Parameter"
msgstr ""
-#: part/views.py:2045
+#: part/views.py:2152
msgid "Delete Part Parameter"
msgstr ""
-#: part/views.py:2105
+#: part/views.py:2212
msgid "Edit Part Category"
msgstr ""
-#: part/views.py:2143
+#: part/views.py:2250
msgid "Delete Part Category"
msgstr ""
-#: part/views.py:2149
+#: part/views.py:2256
msgid "Part category was deleted"
msgstr ""
-#: part/views.py:2201
+#: part/views.py:2308
msgid "Create Category Parameter Template"
msgstr ""
-#: part/views.py:2302
+#: part/views.py:2409
msgid "Edit Category Parameter Template"
msgstr ""
-#: part/views.py:2358
+#: part/views.py:2465
msgid "Delete Category Parameter Template"
msgstr ""
-#: part/views.py:2377
+#: part/views.py:2484
msgid "Create BOM Item"
msgstr ""
-#: part/views.py:2447
+#: part/views.py:2554
msgid "Edit BOM item"
msgstr ""
-#: part/views.py:2503
+#: part/views.py:2610
msgid "Confim BOM item deletion"
msgstr ""
-#: report/models.py:163
+#: report/models.py:180
msgid "Template name"
msgstr ""
-#: report/models.py:169
+#: report/models.py:186
msgid "Report template file"
msgstr ""
-#: report/models.py:176
+#: report/models.py:193
msgid "Report template description"
msgstr ""
-#: report/models.py:182
+#: report/models.py:199
msgid "Report revision number (auto-increments)"
msgstr ""
-#: report/models.py:258
+#: report/models.py:275
msgid "Report template is enabled"
msgstr ""
-#: report/models.py:278
+#: report/models.py:295
msgid "StockItem query filters (comma-separated list of key=value pairs)"
msgstr ""
-#: report/models.py:286
+#: report/models.py:303
msgid "Include Installed Tests"
msgstr ""
-#: report/models.py:287
+#: report/models.py:304
msgid "Include test results for stock items installed inside assembled item"
msgstr ""
-#: report/models.py:330
+#: report/models.py:347
msgid "Build Filters"
msgstr ""
-#: report/models.py:331
+#: report/models.py:348
msgid "Build query filters (comma-separated list of key=value pairs"
msgstr ""
-#: report/models.py:368
+#: report/models.py:385
msgid "Part Filters"
msgstr ""
-#: report/models.py:369
+#: report/models.py:386
msgid "Part query filters (comma-separated list of key=value pairs"
msgstr ""
-#: report/models.py:415
+#: report/models.py:416
+msgid "Purchase order query filters"
+msgstr ""
+
+#: report/models.py:450
+msgid "Sales order query filters"
+msgstr ""
+
+#: report/models.py:500
msgid "Report snippet file"
msgstr ""
-#: report/models.py:419
+#: report/models.py:504
msgid "Snippet file description"
msgstr ""
-#: report/models.py:454
+#: report/models.py:539
msgid "Report asset file"
msgstr ""
-#: report/models.py:457
+#: report/models.py:542
msgid "Asset file description"
msgstr ""
-#: report/templates/report/inventree_build_order_base.html:150
+#: report/templates/report/inventree_build_order_base.html:147
msgid "Required For"
msgstr ""
+#: report/templates/report/inventree_po_report.html:85
+#: report/templates/report/inventree_so_report.html:85
+msgid "Line Items"
+msgstr ""
+
#: report/templates/report/inventree_test_report_base.html:21
msgid "Stock Item Test Report"
msgstr ""
@@ -4276,7 +4358,7 @@ msgstr ""
msgid "Packaging this stock item is stored in"
msgstr ""
-#: stock/models.py:400 stock/templates/stock/item_base.html:249
+#: stock/models.py:400 stock/templates/stock/item_base.html:255
msgid "Installed In"
msgstr ""
@@ -4316,7 +4398,7 @@ msgstr ""
msgid "Destination Sales Order"
msgstr ""
-#: stock/models.py:472 stock/templates/stock/item_base.html:343
+#: stock/models.py:472 stock/templates/stock/item_base.html:349
#: templates/js/stock.js:652
msgid "Expiry Date"
msgstr ""
@@ -4433,7 +4515,7 @@ msgstr ""
msgid "Test name"
msgstr ""
-#: stock/models.py:1645 templates/js/table_filters.js:185
+#: stock/models.py:1645 templates/js/table_filters.js:190
msgid "Test result"
msgstr ""
@@ -4507,12 +4589,12 @@ msgid ""
msgstr ""
#: stock/templates/stock/item_base.html:91
-#: stock/templates/stock/item_base.html:347 templates/js/table_filters.js:118
+#: stock/templates/stock/item_base.html:353 templates/js/table_filters.js:123
msgid "Expired"
msgstr ""
#: stock/templates/stock/item_base.html:95
-#: stock/templates/stock/item_base.html:349 templates/js/table_filters.js:123
+#: stock/templates/stock/item_base.html:355 templates/js/table_filters.js:128
msgid "Stale"
msgstr ""
@@ -4547,97 +4629,97 @@ msgstr ""
msgid "Count stock"
msgstr ""
-#: stock/templates/stock/item_base.html:161 templates/stock_table.html:53
+#: stock/templates/stock/item_base.html:163 templates/stock_table.html:53
msgid "Add stock"
msgstr ""
-#: stock/templates/stock/item_base.html:162 templates/stock_table.html:54
+#: stock/templates/stock/item_base.html:166 templates/stock_table.html:54
msgid "Remove stock"
msgstr ""
-#: stock/templates/stock/item_base.html:164
+#: stock/templates/stock/item_base.html:169
msgid "Transfer stock"
msgstr ""
-#: stock/templates/stock/item_base.html:166
+#: stock/templates/stock/item_base.html:172
msgid "Serialize stock"
msgstr ""
-#: stock/templates/stock/item_base.html:170
+#: stock/templates/stock/item_base.html:176
msgid "Assign to customer"
msgstr ""
-#: stock/templates/stock/item_base.html:173
+#: stock/templates/stock/item_base.html:179
msgid "Return to stock"
msgstr ""
-#: stock/templates/stock/item_base.html:177 templates/js/stock.js:1218
+#: stock/templates/stock/item_base.html:183 templates/js/stock.js:1218
msgid "Uninstall stock item"
msgstr ""
-#: stock/templates/stock/item_base.html:177
+#: stock/templates/stock/item_base.html:183
msgid "Uninstall"
msgstr ""
-#: stock/templates/stock/item_base.html:186
+#: stock/templates/stock/item_base.html:192
#: stock/templates/stock/location.html:55
msgid "Stock actions"
msgstr ""
-#: stock/templates/stock/item_base.html:189
+#: stock/templates/stock/item_base.html:195
msgid "Convert to variant"
msgstr ""
-#: stock/templates/stock/item_base.html:192
+#: stock/templates/stock/item_base.html:198
msgid "Duplicate stock item"
msgstr ""
-#: stock/templates/stock/item_base.html:194
+#: stock/templates/stock/item_base.html:200
msgid "Edit stock item"
msgstr ""
-#: stock/templates/stock/item_base.html:197
+#: stock/templates/stock/item_base.html:203
msgid "Delete stock item"
msgstr ""
-#: stock/templates/stock/item_base.html:209
+#: stock/templates/stock/item_base.html:215
msgid "Stock Item Details"
msgstr ""
-#: stock/templates/stock/item_base.html:268 templates/js/build.js:442
+#: stock/templates/stock/item_base.html:274 templates/js/build.js:442
msgid "No location set"
msgstr ""
-#: stock/templates/stock/item_base.html:275
+#: stock/templates/stock/item_base.html:281
msgid "Barcode Identifier"
msgstr ""
-#: stock/templates/stock/item_base.html:296 templates/InvenTree/search.html:167
+#: stock/templates/stock/item_base.html:302 templates/InvenTree/search.html:167
#: templates/js/build.js:655 templates/navbar.html:29
msgid "Build"
msgstr ""
-#: stock/templates/stock/item_base.html:317
+#: stock/templates/stock/item_base.html:323
msgid "Parent Item"
msgstr ""
-#: stock/templates/stock/item_base.html:347
+#: stock/templates/stock/item_base.html:353
msgid "This StockItem expired on"
msgstr ""
-#: stock/templates/stock/item_base.html:349
+#: stock/templates/stock/item_base.html:355
msgid "This StockItem expires on"
msgstr ""
-#: stock/templates/stock/item_base.html:356 templates/js/stock.js:658
+#: stock/templates/stock/item_base.html:362 templates/js/stock.js:658
msgid "Last Updated"
msgstr ""
-#: stock/templates/stock/item_base.html:361
+#: stock/templates/stock/item_base.html:367
msgid "Last Stocktake"
msgstr ""
-#: stock/templates/stock/item_base.html:365
+#: stock/templates/stock/item_base.html:371
msgid "No stocktake performed"
msgstr ""
@@ -5096,12 +5178,12 @@ msgid "Default Value"
msgstr ""
#: templates/InvenTree/settings/category.html:70
-#: templates/InvenTree/settings/part.html:80
+#: templates/InvenTree/settings/part.html:81
msgid "Edit Template"
msgstr ""
#: templates/InvenTree/settings/category.html:71
-#: templates/InvenTree/settings/part.html:81
+#: templates/InvenTree/settings/part.html:82
msgid "Delete Template"
msgstr ""
@@ -5109,7 +5191,7 @@ msgstr ""
msgid "Global InvenTree Settings"
msgstr ""
-#: templates/InvenTree/settings/global.html:25
+#: templates/InvenTree/settings/global.html:26
msgid "Barcode Settings"
msgstr ""
@@ -5125,11 +5207,11 @@ msgstr ""
msgid "Part Options"
msgstr ""
-#: templates/InvenTree/settings/part.html:39
+#: templates/InvenTree/settings/part.html:40
msgid "Part Parameter Templates"
msgstr ""
-#: templates/InvenTree/settings/part.html:60
+#: templates/InvenTree/settings/part.html:61
msgid "No part parameter templates found"
msgstr ""
@@ -5294,6 +5376,22 @@ msgstr ""
msgid "Delete attachment"
msgstr ""
+#: templates/image_download.html:8
+msgid "Specify URL for downloading image"
+msgstr ""
+
+#: templates/image_download.html:11
+msgid "Must be a valid image URL"
+msgstr ""
+
+#: templates/image_download.html:12
+msgid "Remote server must be accessible"
+msgstr ""
+
+#: templates/image_download.html:13
+msgid "Remote image must not exceed maximum allowable file size"
+msgstr ""
+
#: templates/js/barcode.js:8
msgid "Scan barcode data here using wedge scanner"
msgstr ""
@@ -5322,7 +5420,7 @@ msgstr ""
msgid "Unknown response from server"
msgstr ""
-#: templates/js/barcode.js:119 templates/js/modals.js:856
+#: templates/js/barcode.js:119 templates/js/modals.js:857
msgid "Invalid server response"
msgstr ""
@@ -5553,11 +5651,11 @@ msgstr ""
msgid "Show Error Information"
msgstr ""
-#: templates/js/modals.js:473 templates/modals.html:66
+#: templates/js/modals.js:473 templates/modals.html:73
msgid "Accept"
msgstr ""
-#: templates/js/modals.js:474 templates/modals.html:65
+#: templates/js/modals.js:474 templates/modals.html:72
msgid "Cancel"
msgstr ""
@@ -5565,81 +5663,81 @@ msgstr ""
msgid "Loading Data"
msgstr ""
-#: templates/js/modals.js:549 templates/js/modals.js:807
-#: templates/modals.html:22 templates/modals.html:46
+#: templates/js/modals.js:549 templates/js/modals.js:808
+#: templates/modals.html:29 templates/modals.html:53
msgid "Submit"
msgstr ""
-#: templates/js/modals.js:550 templates/js/modals.js:808
-#: templates/modals.html:21 templates/modals.html:45 templates/modals.html:84
+#: templates/js/modals.js:550 templates/js/modals.js:809
+#: templates/modals.html:28 templates/modals.html:52 templates/modals.html:93
msgid "Close"
msgstr ""
-#: templates/js/modals.js:759
+#: templates/js/modals.js:760
msgid "Invalid response from server"
msgstr ""
-#: templates/js/modals.js:759
+#: templates/js/modals.js:760
msgid "Form data missing from server response"
msgstr ""
-#: templates/js/modals.js:772
+#: templates/js/modals.js:773
msgid "Error posting form data"
msgstr ""
-#: templates/js/modals.js:856
+#: templates/js/modals.js:857
msgid "JSON response missing form data"
msgstr ""
-#: templates/js/modals.js:866
+#: templates/js/modals.js:867
msgid "No Response"
msgstr ""
-#: templates/js/modals.js:867
+#: templates/js/modals.js:868
msgid "No response from the InvenTree server"
msgstr ""
-#: templates/js/modals.js:871
+#: templates/js/modals.js:872
msgid "Error 400: Bad Request"
msgstr ""
-#: templates/js/modals.js:872
+#: templates/js/modals.js:873
msgid "Server returned error code 400"
msgstr ""
-#: templates/js/modals.js:876
+#: templates/js/modals.js:877
msgid "Error 401: Not Authenticated"
msgstr ""
-#: templates/js/modals.js:877
+#: templates/js/modals.js:878
msgid "Authentication credentials not supplied"
msgstr ""
-#: templates/js/modals.js:881
+#: templates/js/modals.js:882
msgid "Error 403: Permission Denied"
msgstr ""
-#: templates/js/modals.js:882
+#: templates/js/modals.js:883
msgid "You do not have the required permissions to access this function"
msgstr ""
-#: templates/js/modals.js:886
+#: templates/js/modals.js:887
msgid "Error 404: Resource Not Found"
msgstr ""
-#: templates/js/modals.js:887
+#: templates/js/modals.js:888
msgid "The requested resource could not be located on the server"
msgstr ""
-#: templates/js/modals.js:891
+#: templates/js/modals.js:892
msgid "Error 408: Timeout"
msgstr ""
-#: templates/js/modals.js:892
+#: templates/js/modals.js:893
msgid "Connection timeout while requesting data from server"
msgstr ""
-#: templates/js/modals.js:895
+#: templates/js/modals.js:896
msgid "Error requesting form data"
msgstr ""
@@ -5687,7 +5785,7 @@ msgstr ""
msgid "No category"
msgstr ""
-#: templates/js/part.js:408 templates/js/table_filters.js:291
+#: templates/js/part.js:408 templates/js/table_filters.js:296
msgid "Low stock"
msgstr ""
@@ -5732,7 +5830,8 @@ msgid "Stock item(s) must be selected before printing reports"
msgstr ""
#: templates/js/report.js:116 templates/js/report.js:169
-#: templates/js/report.js:223
+#: templates/js/report.js:223 templates/js/report.js:277
+#: templates/js/report.js:331
msgid "No Reports Found"
msgstr ""
@@ -5764,6 +5863,26 @@ msgstr ""
msgid "No report templates found which match selected part(s)"
msgstr ""
+#: templates/js/report.js:259
+msgid "Select Purchase Orders"
+msgstr ""
+
+#: templates/js/report.js:260
+msgid "Purchase Order(s) must be selected before printing report"
+msgstr ""
+
+#: templates/js/report.js:278 templates/js/report.js:332
+msgid "No report templates found which match selected orders"
+msgstr ""
+
+#: templates/js/report.js:313
+msgid "Select Sales Orders"
+msgstr ""
+
+#: templates/js/report.js:314
+msgid "Sales Order(s) must be selected before printing report"
+msgstr ""
+
#: templates/js/stock.js:38
msgid "PASS"
msgstr ""
@@ -5848,7 +5967,7 @@ msgstr ""
msgid "Stock item is destroyed"
msgstr ""
-#: templates/js/stock.js:616 templates/js/table_filters.js:111
+#: templates/js/stock.js:616 templates/js/table_filters.js:116
msgid "Depleted"
msgstr ""
@@ -5884,7 +6003,7 @@ msgstr ""
msgid "Serial"
msgstr ""
-#: templates/js/stock.js:1281 templates/js/table_filters.js:144
+#: templates/js/stock.js:1281 templates/js/table_filters.js:149
msgid "Installed"
msgstr ""
@@ -5900,36 +6019,36 @@ msgstr ""
msgid "Validated"
msgstr ""
-#: templates/js/table_filters.js:70 templates/js/table_filters.js:154
+#: templates/js/table_filters.js:70 templates/js/table_filters.js:159
msgid "Is Serialized"
msgstr ""
-#: templates/js/table_filters.js:73 templates/js/table_filters.js:161
+#: templates/js/table_filters.js:73 templates/js/table_filters.js:166
msgid "Serial number GTE"
msgstr ""
-#: templates/js/table_filters.js:74 templates/js/table_filters.js:162
+#: templates/js/table_filters.js:74 templates/js/table_filters.js:167
msgid "Serial number greater than or equal to"
msgstr ""
-#: templates/js/table_filters.js:77 templates/js/table_filters.js:165
+#: templates/js/table_filters.js:77 templates/js/table_filters.js:170
msgid "Serial number LTE"
msgstr ""
-#: templates/js/table_filters.js:78 templates/js/table_filters.js:166
+#: templates/js/table_filters.js:78 templates/js/table_filters.js:171
msgid "Serial number less than or equal to"
msgstr ""
#: templates/js/table_filters.js:81 templates/js/table_filters.js:82
-#: templates/js/table_filters.js:157 templates/js/table_filters.js:158
+#: templates/js/table_filters.js:162 templates/js/table_filters.js:163
msgid "Serial number"
msgstr ""
-#: templates/js/table_filters.js:86 templates/js/table_filters.js:175
+#: templates/js/table_filters.js:86 templates/js/table_filters.js:180
msgid "Batch code"
msgstr ""
-#: templates/js/table_filters.js:96 templates/js/table_filters.js:258
+#: templates/js/table_filters.js:96 templates/js/table_filters.js:263
msgid "Active parts"
msgstr ""
@@ -5937,111 +6056,115 @@ msgstr ""
msgid "Show stock for active parts"
msgstr ""
-#: templates/js/table_filters.js:101
-msgid "Is allocated"
-msgstr ""
-
#: templates/js/table_filters.js:102
-msgid "Item has been alloacted"
+msgid "Part is an assembly"
msgstr ""
#: templates/js/table_filters.js:106
-msgid "Include sublocations"
+msgid "Is allocated"
msgstr ""
#: templates/js/table_filters.js:107
-msgid "Include stock in sublocations"
+msgid "Item has been allocated"
+msgstr ""
+
+#: templates/js/table_filters.js:111
+msgid "Include sublocations"
msgstr ""
#: templates/js/table_filters.js:112
+msgid "Include stock in sublocations"
+msgstr ""
+
+#: templates/js/table_filters.js:117
msgid "Show stock items which are depleted"
msgstr ""
-#: templates/js/table_filters.js:119
+#: templates/js/table_filters.js:124
msgid "Show stock items which have expired"
msgstr ""
-#: templates/js/table_filters.js:124
+#: templates/js/table_filters.js:129
msgid "Show stock which is close to expiring"
msgstr ""
-#: templates/js/table_filters.js:130
+#: templates/js/table_filters.js:135
msgid "Show items which are in stock"
msgstr ""
-#: templates/js/table_filters.js:134
+#: templates/js/table_filters.js:139
msgid "In Production"
msgstr ""
-#: templates/js/table_filters.js:135
+#: templates/js/table_filters.js:140
msgid "Show items which are in production"
msgstr ""
-#: templates/js/table_filters.js:139
+#: templates/js/table_filters.js:144
msgid "Include Variants"
msgstr ""
-#: templates/js/table_filters.js:140
+#: templates/js/table_filters.js:145
msgid "Include stock items for variant parts"
msgstr ""
-#: templates/js/table_filters.js:145
+#: templates/js/table_filters.js:150
msgid "Show stock items which are installed in another item"
msgstr ""
-#: templates/js/table_filters.js:149
+#: templates/js/table_filters.js:154
msgid "Sent to customer"
msgstr ""
-#: templates/js/table_filters.js:150
+#: templates/js/table_filters.js:155
msgid "Show items which have been assigned to a customer"
msgstr ""
-#: templates/js/table_filters.js:170 templates/js/table_filters.js:171
+#: templates/js/table_filters.js:175 templates/js/table_filters.js:176
msgid "Stock status"
msgstr ""
-#: templates/js/table_filters.js:204
+#: templates/js/table_filters.js:209
msgid "Build status"
msgstr ""
-#: templates/js/table_filters.js:223 templates/js/table_filters.js:240
+#: templates/js/table_filters.js:228 templates/js/table_filters.js:245
msgid "Order status"
msgstr ""
-#: templates/js/table_filters.js:228 templates/js/table_filters.js:245
+#: templates/js/table_filters.js:233 templates/js/table_filters.js:250
msgid "Outstanding"
msgstr ""
-#: templates/js/table_filters.js:268
+#: templates/js/table_filters.js:273
msgid "Include subcategories"
msgstr ""
-#: templates/js/table_filters.js:269
+#: templates/js/table_filters.js:274
msgid "Include parts in subcategories"
msgstr ""
-#: templates/js/table_filters.js:273
+#: templates/js/table_filters.js:278
msgid "Has IPN"
msgstr ""
-#: templates/js/table_filters.js:274
+#: templates/js/table_filters.js:279
msgid "Part has internal part number"
msgstr ""
-#: templates/js/table_filters.js:279
+#: templates/js/table_filters.js:284
msgid "Show active parts"
msgstr ""
-#: templates/js/table_filters.js:287
+#: templates/js/table_filters.js:292
msgid "Stock available"
msgstr ""
-#: templates/js/table_filters.js:303
+#: templates/js/table_filters.js:308
msgid "Starred"
msgstr ""
-#: templates/js/table_filters.js:315
+#: templates/js/table_filters.js:320
msgid "Purchasable"
msgstr ""
@@ -6098,7 +6221,7 @@ msgstr ""
msgid "All"
msgstr ""
-#: templates/modals.html:14 templates/modals.html:39
+#: templates/modals.html:21 templates/modals.html:46
msgid "Form errors exist"
msgstr ""
@@ -6270,38 +6393,38 @@ msgstr ""
msgid "Important dates"
msgstr ""
-#: users/models.py:151
+#: users/models.py:153
msgid "Permission set"
msgstr ""
-#: users/models.py:159
+#: users/models.py:161
msgid "Group"
msgstr ""
-#: users/models.py:162
+#: users/models.py:164
msgid "View"
msgstr ""
-#: users/models.py:162
+#: users/models.py:164
msgid "Permission to view items"
msgstr ""
-#: users/models.py:164
+#: users/models.py:166
msgid "Add"
msgstr ""
-#: users/models.py:164
+#: users/models.py:166
msgid "Permission to add items"
msgstr ""
-#: users/models.py:166
+#: users/models.py:168
msgid "Change"
msgstr ""
-#: users/models.py:166
+#: users/models.py:168
msgid "Permissions to edit items"
msgstr ""
-#: users/models.py:168
+#: users/models.py:170
msgid "Permission to delete items"
msgstr ""
diff --git a/InvenTree/order/forms.py b/InvenTree/order/forms.py
index b5edec386a..bb6cb40889 100644
--- a/InvenTree/order/forms.py
+++ b/InvenTree/order/forms.py
@@ -14,6 +14,8 @@ from InvenTree.forms import HelperForm
from InvenTree.fields import RoundingDecimalFormField
from InvenTree.fields import DatePickerFormField
+import part.models
+
from stock.models import StockLocation
from .models import PurchaseOrder, PurchaseOrderLineItem, PurchaseOrderAttachment
from .models import SalesOrder, SalesOrderLineItem, SalesOrderAttachment
@@ -211,7 +213,65 @@ class EditSalesOrderLineItemForm(HelperForm):
]
+class AllocateSerialsToSalesOrderForm(forms.Form):
+ """
+ Form for assigning stock to a sales order,
+ by serial number lookup
+ """
+
+ line = forms.ModelChoiceField(
+ queryset=SalesOrderLineItem.objects.all(),
+ )
+
+ part = forms.ModelChoiceField(
+ queryset=part.models.Part.objects.all(),
+ )
+
+ serials = forms.CharField(
+ label=_("Serial Numbers"),
+ required=True,
+ help_text=_('Enter stock item serial numbers'),
+ )
+
+ quantity = forms.IntegerField(
+ label=_('Quantity'),
+ required=True,
+ help_text=_('Enter quantity of stock items'),
+ initial=1,
+ min_value=1
+ )
+
+ class Meta:
+
+ fields = [
+ 'line',
+ 'part',
+ 'serials',
+ 'quantity',
+ ]
+
+
+class CreateSalesOrderAllocationForm(HelperForm):
+ """
+ Form for creating a SalesOrderAllocation item.
+ """
+
+ quantity = RoundingDecimalFormField(max_digits=10, decimal_places=5)
+
+ class Meta:
+ model = SalesOrderAllocation
+
+ fields = [
+ 'line',
+ 'item',
+ 'quantity',
+ ]
+
+
class EditSalesOrderAllocationForm(HelperForm):
+ """
+ Form for editing a SalesOrderAllocation item
+ """
quantity = RoundingDecimalFormField(max_digits=10, decimal_places=5)
diff --git a/InvenTree/order/migrations/0043_auto_20210330_0013.py b/InvenTree/order/migrations/0043_auto_20210330_0013.py
new file mode 100644
index 0000000000..35c4b99bcb
--- /dev/null
+++ b/InvenTree/order/migrations/0043_auto_20210330_0013.py
@@ -0,0 +1,17 @@
+# Generated by Django 3.0.7 on 2021-03-29 13:13
+
+from django.db import migrations
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('order', '0042_auto_20210310_1619'),
+ ]
+
+ operations = [
+ migrations.AlterUniqueTogether(
+ name='salesorderlineitem',
+ unique_together=set(),
+ ),
+ ]
diff --git a/InvenTree/order/models.py b/InvenTree/order/models.py
index c3b33eaace..cb78eabc6a 100644
--- a/InvenTree/order/models.py
+++ b/InvenTree/order/models.py
@@ -663,7 +663,6 @@ class SalesOrderLineItem(OrderLineItem):
class Meta:
unique_together = [
- ('order', 'part'),
]
def fulfilled_quantity(self):
@@ -732,6 +731,12 @@ class SalesOrderAllocation(models.Model):
errors = {}
+ try:
+ if not self.item:
+ raise ValidationError({'item': _('Stock item has not been assigned')})
+ except stock_models.StockItem.DoesNotExist:
+ raise ValidationError({'item': _('Stock item has not been assigned')})
+
try:
if not self.line.part == self.item.part:
errors['item'] = _('Cannot allocate stock item to a line with a different part')
diff --git a/InvenTree/order/templates/order/order_notes.html b/InvenTree/order/templates/order/order_notes.html
index f392816120..cdd121c412 100644
--- a/InvenTree/order/templates/order/order_notes.html
+++ b/InvenTree/order/templates/order/order_notes.html
@@ -11,6 +11,9 @@
{% block heading %}
{% trans "Order Notes" %}
+{% if roles.purchase_order.change and not editing %}
+
+{% endif %}
{% endblock %}
{% block details %}
@@ -21,21 +24,19 @@
{{ form }}
-
+ {% trans "Save" %}
{{ form.media }}
{% else %}
-{% if roles.purchase_order.change %}
-
-{% endif %}
-{% endif %}
+
{{ order.notes | markdownify }}
+{% endif %}
{% endblock %}
diff --git a/InvenTree/order/templates/order/sales_order_detail.html b/InvenTree/order/templates/order/sales_order_detail.html
index 27bbd542dd..7b4a4ed4f7 100644
--- a/InvenTree/order/templates/order/sales_order_detail.html
+++ b/InvenTree/order/templates/order/sales_order_detail.html
@@ -275,15 +275,20 @@ $("#so-lines-table").inventreeTable({
if (row.part) {
var part = row.part_detail;
+ if (part.trackable) {
+ html += makeIconButton('fa-hashtag icon-green', 'button-add-by-sn', pk, '{% trans "Allocate serial numbers" %}');
+ }
+
+ html += makeIconButton('fa-sign-in-alt icon-green', 'button-add', pk, '{% trans "Allocate stock" %}');
+
if (part.purchaseable) {
- html += makeIconButton('fa-shopping-cart', 'button-buy', row.part, '{% trans "Buy parts" %}');
+ html += makeIconButton('fa-shopping-cart', 'button-buy', row.part, '{% trans "Purchase stock" %}');
}
if (part.assembly) {
- html += makeIconButton('fa-tools', 'button-build', row.part, '{% trans "Build parts" %}');
+ html += makeIconButton('fa-tools', 'button-build', row.part, '{% trans "Build stock" %}');
}
- html += makeIconButton('fa-plus icon-green', 'button-add', pk, '{% trans "Allocate parts" %}');
}
html += makeIconButton('fa-edit icon-blue', 'button-edit', pk, '{% trans "Edit line item" %}');
@@ -316,10 +321,28 @@ function setupCallbacks() {
var pk = $(this).attr('pk');
launchModalForm(`/order/sales-order/line/${pk}/delete/`, {
- reload: true,
+ success: reloadTable,
});
});
+ table.find(".button-add-by-sn").click(function() {
+ var pk = $(this).attr('pk');
+
+ inventreeGet(`/api/order/so-line/${pk}/`, {},
+ {
+ success: function(response) {
+ launchModalForm('{% url "so-assign-serials" %}', {
+ success: reloadTable,
+ data: {
+ line: pk,
+ part: response.part,
+ }
+ });
+ }
+ }
+ );
+ });
+
table.find(".button-add").click(function() {
var pk = $(this).attr('pk');
diff --git a/InvenTree/order/templates/order/sales_order_notes.html b/InvenTree/order/templates/order/sales_order_notes.html
index 947ea339db..0a2e105b2e 100644
--- a/InvenTree/order/templates/order/sales_order_notes.html
+++ b/InvenTree/order/templates/order/sales_order_notes.html
@@ -12,6 +12,9 @@
{% block heading %}
{% trans "Sales Order Notes" %}
+{% if roles.sales_order.change and not editing %}
+
+{% endif %}
{% endblock %}
{% block details %}
@@ -23,13 +26,12 @@
{{ form }}
-
+ {% trans "Save" %}
{{ form.media }}
{% else %}
-
{{ order.notes | markdownify }}
diff --git a/InvenTree/order/templates/order/so_allocate_by_serial.html b/InvenTree/order/templates/order/so_allocate_by_serial.html
new file mode 100644
index 0000000000..3e11d658c7
--- /dev/null
+++ b/InvenTree/order/templates/order/so_allocate_by_serial.html
@@ -0,0 +1,12 @@
+{% extends "modal_form.html" %}
+{% load i18n %}
+
+{% block pre_form_content %}
+
+
+ {% include "hover_image.html" with image=part.image hover=true %}{{ part }}
+
+ {% trans "Allocate stock items by serial number" %}
+
+
+{% endblock %}
\ No newline at end of file
diff --git a/InvenTree/order/test_sales_order.py b/InvenTree/order/test_sales_order.py
index c619aec5bc..0b37b96409 100644
--- a/InvenTree/order/test_sales_order.py
+++ b/InvenTree/order/test_sales_order.py
@@ -3,7 +3,6 @@
from django.test import TestCase
from django.core.exceptions import ValidationError
-from django.db.utils import IntegrityError
from datetime import datetime, timedelta
@@ -73,10 +72,10 @@ class SalesOrderTest(TestCase):
self.assertFalse(self.order.is_fully_allocated())
def test_add_duplicate_line_item(self):
- # Adding a duplicate line item to a SalesOrder must throw an error
+ # Adding a duplicate line item to a SalesOrder is accepted
- with self.assertRaises(IntegrityError):
- SalesOrderLineItem.objects.create(order=self.order, part=self.part)
+ for ii in range(1, 5):
+ SalesOrderLineItem.objects.create(order=self.order, part=self.part, quantity=ii)
def allocate_stock(self, full=True):
diff --git a/InvenTree/order/urls.py b/InvenTree/order/urls.py
index 7707b73f37..97903d81c1 100644
--- a/InvenTree/order/urls.py
+++ b/InvenTree/order/urls.py
@@ -81,6 +81,7 @@ sales_order_urls = [
# URLs for sales order allocations
url(r'^allocation/', include([
url(r'^new/', views.SalesOrderAllocationCreate.as_view(), name='so-allocation-create'),
+ url(r'^assign-serials/', views.SalesOrderAssignSerials.as_view(), name='so-assign-serials'),
url(r'(?P
\d+)/', include([
url(r'^edit/', views.SalesOrderAllocationEdit.as_view(), name='so-allocation-edit'),
url(r'^delete/', views.SalesOrderAllocationDelete.as_view(), name='so-allocation-delete'),
diff --git a/InvenTree/order/views.py b/InvenTree/order/views.py
index 2cd8e8a4cb..bdf0407603 100644
--- a/InvenTree/order/views.py
+++ b/InvenTree/order/views.py
@@ -7,9 +7,11 @@ from __future__ import unicode_literals
from django.db import transaction
from django.shortcuts import get_object_or_404
+from django.core.exceptions import ValidationError
from django.urls import reverse
from django.utils.translation import ugettext as _
from django.views.generic import DetailView, ListView, UpdateView
+from django.views.generic.edit import FormMixin
from django.forms import HiddenInput
import logging
@@ -30,6 +32,7 @@ from . import forms as order_forms
from InvenTree.views import AjaxView, AjaxCreateView, AjaxUpdateView, AjaxDeleteView
from InvenTree.helpers import DownloadFile, str2bool
+from InvenTree.helpers import extract_serial_numbers
from InvenTree.views import InvenTreeRoleMixin
from InvenTree.status_codes import PurchaseOrderStatus, SalesOrderStatus, StockStatus
@@ -1291,11 +1294,179 @@ class SOLineItemDelete(AjaxDeleteView):
}
+class SalesOrderAssignSerials(AjaxView, FormMixin):
+ """
+ View for assigning stock items to a sales order,
+ by serial number lookup.
+ """
+
+ model = SalesOrderAllocation
+ role_required = 'sales_order.change'
+ ajax_template_name = 'order/so_allocate_by_serial.html'
+ ajax_form_title = _('Allocate Serial Numbers')
+ form_class = order_forms.AllocateSerialsToSalesOrderForm
+
+ # Keep track of SalesOrderLineItem and Part references
+ line = None
+ part = None
+
+ def get_initial(self):
+ """
+ Initial values are passed as query params
+ """
+
+ initials = super().get_initial()
+
+ try:
+ self.line = SalesOrderLineItem.objects.get(pk=self.request.GET.get('line', None))
+ initials['line'] = self.line
+ except (ValueError, SalesOrderLineItem.DoesNotExist):
+ pass
+
+ try:
+ self.part = Part.objects.get(pk=self.request.GET.get('part', None))
+ initials['part'] = self.part
+ except (ValueError, Part.DoesNotExist):
+ pass
+
+ return initials
+
+ def post(self, request, *args, **kwargs):
+
+ self.form = self.get_form()
+
+ # Validate the form
+ self.form.is_valid()
+ self.validate()
+
+ valid = self.form.is_valid()
+
+ if valid:
+ self.allocate_items()
+
+ data = {
+ 'form_valid': valid,
+ 'form_errors': self.form.errors.as_json(),
+ 'non_field_errors': self.form.non_field_errors().as_json(),
+ 'success': _("Allocated") + f" {len(self.stock_items)} " + _("items")
+ }
+
+ return self.renderJsonResponse(request, self.form, data)
+
+ def validate(self):
+
+ data = self.form.cleaned_data
+
+ # Extract hidden fields from posted data
+ self.line = data.get('line', None)
+ self.part = data.get('part', None)
+
+ if self.line:
+ self.form.fields['line'].widget = HiddenInput()
+ else:
+ self.form.add_error('line', _('Select line item'))
+
+ if self.part:
+ self.form.fields['part'].widget = HiddenInput()
+ else:
+ self.form.add_error('part', _('Select part'))
+
+ if not self.form.is_valid():
+ return
+
+ # Form is otherwise valid - check serial numbers
+ serials = data.get('serials', '')
+ quantity = data.get('quantity', 1)
+
+ # Save a list of serial_numbers
+ self.serial_numbers = None
+ self.stock_items = []
+
+ try:
+ self.serial_numbers = extract_serial_numbers(serials, quantity)
+
+ for serial in self.serial_numbers:
+ try:
+ # Find matching stock item
+ stock_item = StockItem.objects.get(
+ part=self.part,
+ serial=serial
+ )
+ except StockItem.DoesNotExist:
+ self.form.add_error(
+ 'serials',
+ _('No matching item for serial') + f" '{serial}'"
+ )
+ continue
+
+ # Now we have a valid stock item - but can it be added to the sales order?
+
+ # If not in stock, cannot be added to the order
+ if not stock_item.in_stock:
+ self.form.add_error(
+ 'serials',
+ f"'{serial}' " + _("is not in stock")
+ )
+ continue
+
+ # Already allocated to an order
+ if stock_item.is_allocated():
+ self.form.add_error(
+ 'serials',
+ f"'{serial}' " + _("already allocated to an order")
+ )
+ continue
+
+ # Add it to the list!
+ self.stock_items.append(stock_item)
+
+ except ValidationError as e:
+ self.form.add_error('serials', e.messages)
+
+ def allocate_items(self):
+ """
+ Create stock item allocations for each selected serial number
+ """
+
+ for stock_item in self.stock_items:
+ SalesOrderAllocation.objects.create(
+ item=stock_item,
+ line=self.line,
+ quantity=1,
+ )
+
+ def get_form(self):
+
+ form = super().get_form()
+
+ if self.line:
+ form.fields['line'].widget = HiddenInput()
+
+ if self.part:
+ form.fields['part'].widget = HiddenInput()
+
+ return form
+
+ def get_context_data(self):
+ return {
+ 'line': self.line,
+ 'part': self.part,
+ }
+
+ def get(self, request, *args, **kwargs):
+
+ return self.renderJsonResponse(
+ request,
+ self.get_form(),
+ context=self.get_context_data(),
+ )
+
+
class SalesOrderAllocationCreate(AjaxCreateView):
""" View for creating a new SalesOrderAllocation """
model = SalesOrderAllocation
- form_class = order_forms.EditSalesOrderAllocationForm
+ form_class = order_forms.CreateSalesOrderAllocationForm
ajax_form_title = _('Allocate Stock to Order')
def get_initial(self):
diff --git a/InvenTree/part/apps.py b/InvenTree/part/apps.py
index b1089cd57c..d08e7680fe 100644
--- a/InvenTree/part/apps.py
+++ b/InvenTree/part/apps.py
@@ -7,6 +7,7 @@ from django.db.utils import OperationalError, ProgrammingError
from django.apps import AppConfig
from django.conf import settings
+from PIL import UnidentifiedImageError
logger = logging.getLogger(__name__)
@@ -44,9 +45,11 @@ class PartConfig(AppConfig):
try:
part.image.render_variations(replace=False)
except FileNotFoundError:
- logger.warning("Image file missing")
+ logger.warning(f"Image file '{part.image}' missing")
part.image = None
part.save()
+ except UnidentifiedImageError:
+ logger.warning(f"Image file '{part.image}' is invalid")
except (OperationalError, ProgrammingError):
# Exception if the database has not been migrated yet
pass
diff --git a/InvenTree/part/bom.py b/InvenTree/part/bom.py
index 092b3e3183..ccde26e2f7 100644
--- a/InvenTree/part/bom.py
+++ b/InvenTree/part/bom.py
@@ -232,14 +232,18 @@ class BomUploadManager:
# Fields which are absolutely necessary for valid upload
REQUIRED_HEADERS = [
- 'Part_Name',
'Quantity'
]
+
+ # Fields which are used for part matching (only one of them is needed)
+ PART_MATCH_HEADERS = [
+ 'Part_Name',
+ 'Part_IPN',
+ 'Part_ID',
+ ]
# Fields which would be helpful but are not required
OPTIONAL_HEADERS = [
- 'Part_IPN',
- 'Part_ID',
'Reference',
'Note',
'Overage',
@@ -251,7 +255,7 @@ class BomUploadManager:
'Overage'
]
- HEADERS = REQUIRED_HEADERS + OPTIONAL_HEADERS
+ HEADERS = REQUIRED_HEADERS + PART_MATCH_HEADERS + OPTIONAL_HEADERS
def __init__(self, bom_file):
""" Initialize the BomUpload class with a user-uploaded file object """
diff --git a/InvenTree/part/forms.py b/InvenTree/part/forms.py
index 85a851e235..7962ec3252 100644
--- a/InvenTree/part/forms.py
+++ b/InvenTree/part/forms.py
@@ -37,6 +37,24 @@ class PartModelChoiceField(forms.ModelChoiceField):
return label
+class PartImageDownloadForm(HelperForm):
+ """
+ Form for downloading an image from a URL
+ """
+
+ url = forms.URLField(
+ label=_('URL'),
+ help_text=_('Image URL'),
+ required=True,
+ )
+
+ class Meta:
+ model = Part
+ fields = [
+ 'url',
+ ]
+
+
class PartImageForm(HelperForm):
""" Form for uploading a Part image """
diff --git a/InvenTree/part/models.py b/InvenTree/part/models.py
index b06469699b..2824a89e75 100644
--- a/InvenTree/part/models.py
+++ b/InvenTree/part/models.py
@@ -1372,7 +1372,7 @@ class Part(MPTTModel):
""" Check if the BOM is 'valid' - if the calculated checksum matches the stored value
"""
- return self.get_bom_hash() == self.bom_checksum
+ return self.get_bom_hash() == self.bom_checksum or not self.has_bom
@transaction.atomic
def validate_bom(self, user):
diff --git a/InvenTree/part/templates/part/notes.html b/InvenTree/part/templates/part/notes.html
index 7b3fe8ca0f..8397c32b88 100644
--- a/InvenTree/part/templates/part/notes.html
+++ b/InvenTree/part/templates/part/notes.html
@@ -10,35 +10,34 @@
{% block heading %}
{% trans "Part Notes" %}
+{% if roles.part.change and not editing %}
+
+{% endif %}
{% endblock %}
{% block details %}
-
-
{% if editing %}
{{ form.media }}
{% else %}
-{% if roles.part.change %}
-
-{% endif %}
+ {% if part.notes %}
- {% if part.notes %}
{{ part.notes | markdownify }}
- {% endif %}
+ {% endif %}
{% endif %}
diff --git a/InvenTree/part/templates/part/part_base.html b/InvenTree/part/templates/part/part_base.html
index 1072d7652b..96c9636c88 100644
--- a/InvenTree/part/templates/part/part_base.html
+++ b/InvenTree/part/templates/part/part_base.html
@@ -206,6 +206,12 @@
toggleId: '#part-menu-toggle',
});
+ {% if part.image %}
+ $('#part-thumb').click(function() {
+ showModalImage('{{ part.image.url }}');
+ });
+ {% endif %}
+
enableDragAndDrop(
'#part-thumb',
"{% url 'part-image-upload' part.id %}",
@@ -241,6 +247,7 @@
"{% url 'part-pricing' part.id %}",
{
submit_text: 'Calculate',
+ hideErrorMessage: true,
}
);
});
@@ -293,6 +300,20 @@
}
});
}
+
+ {% if roles.part.change %}
+
+ {% settings_value "INVENTREE_DOWNLOAD_FROM_URL" as allow_download %}
+ {% if allow_download %}
+ $("#part-image-url").click(function() {
+ launchModalForm(
+ '{% url "part-image-download" part.id %}',
+ {
+ reload: true,
+ }
+ );
+ });
+ {% endif %}
$("#part-image-select").click(function() {
launchModalForm("{% url 'part-image-select' part.id %}",
@@ -302,7 +323,6 @@
});
});
- {% if roles.part.change %}
$("#part-edit").click(function() {
launchModalForm(
"{% url 'part-edit' part.id %}",
diff --git a/InvenTree/part/templates/part/part_thumb.html b/InvenTree/part/templates/part/part_thumb.html
index e0314b1c7e..dd192843dc 100644
--- a/InvenTree/part/templates/part/part_thumb.html
+++ b/InvenTree/part/templates/part/part_thumb.html
@@ -1,20 +1,28 @@
{% load static %}
{% load i18n %}
+{% load inventree_extras %}
+
+{% settings_value "INVENTREE_DOWNLOAD_FROM_URL" as allow_download %}
\ No newline at end of file
diff --git a/InvenTree/part/urls.py b/InvenTree/part/urls.py
index e21c6295e3..f275edede2 100644
--- a/InvenTree/part/urls.py
+++ b/InvenTree/part/urls.py
@@ -75,6 +75,7 @@ part_detail_urls = [
# Normal thumbnail with form
url(r'^thumbnail/?', views.PartImageUpload.as_view(), name='part-image-upload'),
url(r'^thumb-select/?', views.PartImageSelect.as_view(), name='part-image-select'),
+ url(r'^thumb-download/', views.PartImageDownloadFromURL.as_view(), name='part-image-download'),
# Any other URLs go to the part detail page
url(r'^.*$', views.PartDetail.as_view(), name='part-detail'),
diff --git a/InvenTree/part/views.py b/InvenTree/part/views.py
index 65f859566b..0208636a48 100644
--- a/InvenTree/part/views.py
+++ b/InvenTree/part/views.py
@@ -5,6 +5,7 @@ Django views for interacting with Part app
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
+from django.core.files.base import ContentFile
from django.core.exceptions import ValidationError
from django.db import transaction
from django.db.utils import IntegrityError
@@ -19,7 +20,11 @@ from django.conf import settings
from moneyed import CURRENCIES
+from PIL import Image
+
+import requests
import os
+import io
from rapidfuzz import fuzz
from decimal import Decimal, InvalidOperation
@@ -831,6 +836,89 @@ class PartQRCode(QRCodeView):
return None
+class PartImageDownloadFromURL(AjaxUpdateView):
+ """
+ View for downloading an image from a provided URL
+ """
+
+ model = Part
+
+ ajax_template_name = 'image_download.html'
+ form_class = part_forms.PartImageDownloadForm
+ ajax_form_title = _('Download Image')
+
+ def validate(self, part, form):
+ """
+ Validate that the image data are correct.
+
+ - Try to download the image!
+ """
+
+ # First ensure that the normal validation routines pass
+ if not form.is_valid():
+ return
+
+ # We can now extract a valid URL from the form data
+ url = form.cleaned_data.get('url', None)
+
+ # Download the file
+ response = requests.get(url, stream=True)
+
+ # Look at response header, reject if too large
+ content_length = response.headers.get('Content-Length', '0')
+
+ try:
+ content_length = int(content_length)
+ except (ValueError):
+ # If we cannot extract meaningful length, just assume it's "small enough"
+ content_length = 0
+
+ # TODO: Factor this out into a configurable setting
+ MAX_IMG_LENGTH = 10 * 1024 * 1024
+
+ if content_length > MAX_IMG_LENGTH:
+ form.add_error('url', _('Image size exceeds maximum allowable size for download'))
+ return
+
+ self.response = response
+
+ # Check for valid response code
+ if not response.status_code == 200:
+ form.add_error('url', f"{_('Invalid response')}: {response.status_code}")
+ return
+
+ response.raw.decode_content = True
+
+ try:
+ self.image = Image.open(response.raw).convert()
+ self.image.verify()
+ except:
+ form.add_error('url', _("Supplied URL is not a valid image file"))
+ return
+
+ def save(self, part, form, **kwargs):
+ """
+ Save the downloaded image to the part
+ """
+
+ fmt = self.image.format
+
+ if not fmt:
+ fmt = 'PNG'
+
+ buffer = io.BytesIO()
+
+ self.image.save(buffer, format=fmt)
+
+ # Construct a simplified name for the image
+ filename = f"part_{part.pk}_image.{fmt.lower()}"
+
+ part.image.save(
+ filename,
+ ContentFile(buffer.getvalue()),
+ )
+
+
class PartImageUpload(AjaxUpdateView):
""" View for uploading a new Part image """
@@ -910,6 +998,12 @@ class PartEdit(AjaxUpdateView):
form.fields['default_supplier'].queryset = SupplierPart.objects.filter(part=part)
+ # Check if IPN can be edited
+ ipn_edit_enable = InvenTreeSetting.get_setting('PART_ALLOW_EDIT_IPN')
+ if not ipn_edit_enable and not self.request.user.is_superuser:
+ # Admin can still change IPN
+ form.fields['IPN'].disabled = True
+
return form
@@ -1425,10 +1519,23 @@ class BomUpload(InvenTreeRoleMixin, FormView):
# Are there any missing columns?
self.missing_columns = []
+ # Check that all required fields are present
for col in BomUploadManager.REQUIRED_HEADERS:
if col not in self.column_selections.values():
self.missing_columns.append(col)
+ # Check that at least one of the part match field is present
+ part_match_found = False
+ for col in BomUploadManager.PART_MATCH_HEADERS:
+ if col in self.column_selections.values():
+ part_match_found = True
+ break
+
+ # If not, notify user
+ if not part_match_found:
+ for col in BomUploadManager.PART_MATCH_HEADERS:
+ self.missing_columns.append(col)
+
def handleFieldSelection(self):
""" Handle the output of the field selection form.
Here the user is presented with the raw data and must select the
diff --git a/InvenTree/stock/api.py b/InvenTree/stock/api.py
index 60e511616a..a7a7955c22 100644
--- a/InvenTree/stock/api.py
+++ b/InvenTree/stock/api.py
@@ -665,6 +665,13 @@ class StockList(generics.ListCreateAPIView):
active = str2bool(active)
queryset = queryset.filter(part__active=active)
+ # Do we wish to filter by "assembly parts"
+ assembly = params.get('assembly', None)
+
+ if assembly is not None:
+ assembly = str2bool(assembly)
+ queryset = queryset.filter(part__assembly=assembly)
+
# Filter by 'depleted' status
depleted = params.get('depleted', None)
diff --git a/InvenTree/stock/templates/stock/item_base.html b/InvenTree/stock/templates/stock/item_base.html
index 5a09480c40..f5459dac27 100644
--- a/InvenTree/stock/templates/stock/item_base.html
+++ b/InvenTree/stock/templates/stock/item_base.html
@@ -155,18 +155,24 @@ InvenTree | {% trans "Stock Item" %} - {{ item }}