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 }}
- + {{ 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 }}
- + @@ -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 }}
- + {{ 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 }}
- + {{ 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 %}
{% csrf_token %} {{ form }}
- + +
{{ 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 %}
-
+ {% if roles.part.change %}
- + + {% if allow_download %} + + {% endif %}
+ {% endif %}
\ 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 }}