diff --git a/.devcontainer/docker-compose.yml b/.devcontainer/docker-compose.yml
index c7ea36b147..9288d99117 100644
--- a/.devcontainer/docker-compose.yml
+++ b/.devcontainer/docker-compose.yml
@@ -7,7 +7,7 @@ services:
expose:
- 5432/tcp
volumes:
- - ../dev:/var/lib/postgresql/data:z
+ - inventreedatabase:/var/lib/postgresql/data:z
environment:
POSTGRES_DB: inventree
POSTGRES_USER: inventree_user
@@ -19,7 +19,6 @@ services:
target: dev
args:
base_image: "mcr.microsoft.com/vscode/devcontainers/base:alpine-3.18"
- workspace: "${containerWorkspaceFolder}"
data_dir: "dev"
volumes:
- ../:/home/inventree:z
@@ -36,3 +35,6 @@ services:
depends_on:
- db
+
+volumes:
+ inventreedatabase:
diff --git a/.devcontainer/postCreateCommand.sh b/.devcontainer/postCreateCommand.sh
index 04be371ef1..9cf0b9c3a0 100755
--- a/.devcontainer/postCreateCommand.sh
+++ b/.devcontainer/postCreateCommand.sh
@@ -7,9 +7,13 @@ git config --global --add safe.directory /home/inventree
python3 -m venv /home/inventree/dev/venv --system-site-packages --upgrade-deps
. /home/inventree/dev/venv/bin/activate
-# setup InvenTree server
+# Run initial InvenTree server setup
invoke update -s
+
+# Configure dev environment
invoke setup-dev
+
+# Install required frontend packages
invoke frontend-install
# remove existing gitconfig created by "Avoiding Dubious Ownership" step
diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml
index ff3198174d..10a5e7a1c2 100644
--- a/.github/FUNDING.yml
+++ b/.github/FUNDING.yml
@@ -1,4 +1,5 @@
github: inventree
ko_fi: inventree
patreon: inventree
+polar: inventree
custom: [paypal.me/inventree]
diff --git a/.github/workflows/docker.yaml b/.github/workflows/docker.yaml
index 318d72285c..259a9f18c8 100644
--- a/.github/workflows/docker.yaml
+++ b/.github/workflows/docker.yaml
@@ -58,15 +58,7 @@ jobs:
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
python_version: "3.11"
- strategy:
- matrix:
- platform: ["linux/amd64", "linux/arm64"]
- include:
- - platform: linux/amd64
- os: ubuntu-latest
- - platform: linux/arm64
- os: ubuntu-latest # in the future we can try to use alternative runners here
- runs-on: ${{ matrix.os }}
+ runs-on: ubuntu-latest # in the future we can try to use alternative runners here
steps:
- name: Check out repo
@@ -82,6 +74,14 @@ jobs:
python3 ci/version_check.py
echo "git_commit_hash=$(git rev-parse --short HEAD)" >> $GITHUB_ENV
echo "git_commit_date=$(git show -s --format=%ci)" >> $GITHUB_ENV
+ - name: Test Docker Image
+ id: test-docker
+ run: |
+ docker build . --target production --tag inventree-test
+ docker run --rm inventree-test invoke --version
+ docker run --rm inventree-test invoke --list
+ docker run --rm inventree-test gunicorn --version
+ docker run --rm inventree-test pg_dump --version
- name: Build Docker Image
# Build the development docker image (using docker-compose.yml)
run: docker-compose build --no-cache
@@ -147,24 +147,18 @@ jobs:
inventree/inventree
ghcr.io/${{ github.repository }}
- - name: Build and Push
- id: build-and-push
+ - name: Push Docker Images
+ id: push-docker
if: github.event_name != 'pull_request'
uses: docker/build-push-action@0565240e2d4ab88bba5387d719585280857ece09 # pin@v5.0.0
with:
context: .
- platforms: ${{ matrix.platform }}
+ platforms: linux/amd64,linux/arm64
push: true
sbom: true
provenance: false
target: production
- tags: ${{ steps.meta.outputs.tags }}
+ tags: ${{ env.docker_tags }}
build-args: |
commit_hash=${{ env.git_commit_hash }}
commit_date=${{ env.git_commit_date }}
-
- - name: Sign the published image
- if: ${{ false }} # github.event_name != 'pull_request'
- env:
- COSIGN_EXPERIMENTAL: "true"
- run: cosign sign ${{ steps.meta.outputs.tags }}@${{ steps.build-and-push.outputs.digest }}
diff --git a/.github/workflows/qc_checks.yaml b/.github/workflows/qc_checks.yaml
index 85073cf38f..85e8f74a0b 100644
--- a/.github/workflows/qc_checks.yaml
+++ b/.github/workflows/qc_checks.yaml
@@ -144,7 +144,7 @@ jobs:
dev-install: true
update: true
- name: Export API Documentation
- run: invoke schema --ignore-warnings
+ run: invoke schema --ignore-warnings --filename InvenTree/schema.yml
- name: Upload schema
uses: actions/upload-artifact@a8a3f3ad30e3422c9c7b888a15615d19a852ae32 # pin@v3.1.3
with:
@@ -160,7 +160,7 @@ jobs:
echo "URL: $url"
curl -s -o api.yaml $url
echo "Downloaded api.yaml"
- - name: Check for differences in schemas
+ - name: Check for differences in API Schema
if: needs.paths-filter.outputs.api == 'false'
run: |
diff --color -u InvenTree/schema.yml api.yaml
diff --git a/.gitignore b/.gitignore
index 5f2b31d170..bcc2f2ac5d 100644
--- a/.gitignore
+++ b/.gitignore
@@ -104,3 +104,7 @@ api.yaml
# web frontend (static files)
InvenTree/web/static
+
+# Generated docs files
+docs/docs/api/*.yml
+docs/docs/api/schema/*.yml
diff --git a/.pkgr.yml b/.pkgr.yml
index 2bb7ae530e..88f27034a5 100644
--- a/.pkgr.yml
+++ b/.pkgr.yml
@@ -19,9 +19,9 @@ before:
- contrib/packager.io/before.sh
dependencies:
- curl
- - python3.9
- - python3.9-venv
- - python3.9-dev
+ - "python3.9 | python3.10 | python3.11"
+ - "python3.9-venv | python3.10-venv | python3.11-venv"
+ - "python3.9-dev | python3.10-dev | python3.11-dev"
- python3-pip
- python3-cffi
- python3-brotli
@@ -36,4 +36,3 @@ dependencies:
targets:
ubuntu-20.04: true
debian-11: true
- debian-12: true
diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
index 8b340ebe93..bfc2314a9f 100644
--- a/.pre-commit-config.yaml
+++ b/.pre-commit-config.yaml
@@ -16,7 +16,7 @@ repos:
- id: check-yaml
- id: mixed-line-ending
- repo: https://github.com/astral-sh/ruff-pre-commit
- rev: v0.2.2
+ rev: v0.3.0
hooks:
- id: ruff-format
args: [--preview]
@@ -26,7 +26,7 @@ repos:
--preview
]
- repo: https://github.com/matmair/ruff-pre-commit
- rev: 830893bf46db844d9c99b6c468e285199adf2de6 # uv-018
+ rev: 8bed1087452bdf816b840ea7b6848b21d32b7419 # uv-018
hooks:
- id: pip-compile
name: pip-compile requirements-dev.in
@@ -60,7 +60,7 @@ repos:
- "prettier@^2.4.1"
- "@trivago/prettier-plugin-sort-imports"
- repo: https://github.com/pre-commit/mirrors-eslint
- rev: "v9.0.0-beta.0"
+ rev: "v9.0.0-beta.1"
hooks:
- id: eslint
additional_dependencies:
diff --git a/Dockerfile b/Dockerfile
index c87a7dea44..cca4ac6a48 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -48,8 +48,6 @@ ENV INVENTREE_BACKGROUND_WORKERS="4"
ENV INVENTREE_WEB_ADDR=0.0.0.0
ENV INVENTREE_WEB_PORT=8000
-ENV VIRTUAL_ENV=/usr/local
-
LABEL org.label-schema.schema-version="1.0" \
org.label-schema.build-date=${DATE} \
org.label-schema.vendor="inventree" \
@@ -65,8 +63,11 @@ RUN apk add --no-cache \
libjpeg libwebp zlib \
# Weasyprint requirements : https://doc.courtbouillon.org/weasyprint/stable/first_steps.html#alpine-3-12
py3-pip py3-pillow py3-cffi py3-brotli pango poppler-utils openldap \
- # Core database packages
- postgresql13-client && \
+ # Postgres client
+ postgresql13-client \
+ # MySQL / MariaDB client
+ mariadb-client mariadb-connector-c \
+ && \
# fonts
apk --update --upgrade --no-cache add fontconfig ttf-freefont font-noto terminus-font && fc-cache -f
@@ -96,7 +97,7 @@ FROM inventree_base as prebuild
ENV PATH=/root/.local/bin:$PATH
RUN ./install_build_packages.sh --no-cache --virtual .build-deps && \
- pip install --user uv --no-cache-dir && pip install -r base_requirements.txt -r requirements.txt --no-cache && \
+ pip install --user -r base_requirements.txt -r requirements.txt --no-cache && \
apk --purge del .build-deps
# Frontend builder image:
diff --git a/InvenTree/InvenTree/api_version.py b/InvenTree/InvenTree/api_version.py
index 692ec09480..1f12b4d7bc 100644
--- a/InvenTree/InvenTree/api_version.py
+++ b/InvenTree/InvenTree/api_version.py
@@ -1,11 +1,40 @@
"""InvenTree API version information."""
# InvenTree API version
-INVENTREE_API_VERSION = 177
+INVENTREE_API_VERSION = 183
"""Increment this API version number whenever there is a significant change to the API that any clients need to know about."""
INVENTREE_API_TEXT = """
+v183 - 2024-03-14 : https://github.com/inventree/InvenTree/pull/5972
+ - Adds "category_default_location" annotated field to part serializer
+ - Adds "part_detail.category_default_location" annotated field to stock item serializer
+ - Adds "part_detail.category_default_location" annotated field to purchase order line serializer
+ - Adds "parent_default_location" annotated field to category serializer
+
+v182 - 2024-03-13 : https://github.com/inventree/InvenTree/pull/6714
+ - Expose ReportSnippet model to the /report/snippet/ API endpoint
+ - Expose ReportAsset model to the /report/asset/ API endpoint
+
+v181 - 2024-02-21 : https://github.com/inventree/InvenTree/pull/6541
+ - Adds "width" and "height" fields to the LabelTemplate API endpoint
+ - Adds "page_size" and "landscape" fields to the ReportTemplate API endpoint
+
+v180 - 2024-3-02 : https://github.com/inventree/InvenTree/pull/6463
+ - Tweaks to API documentation to allow automatic documentation generation
+
+v179 - 2024-03-01 : https://github.com/inventree/InvenTree/pull/6605
+ - Adds "subcategories" count to PartCategory serializer
+ - Adds "sublocations" count to StockLocation serializer
+ - Adds "image" field to PartBrief serializer
+ - Adds "image" field to CompanyBrief serializer
+
+v178 - 2024-02-29 : https://github.com/inventree/InvenTree/pull/6604
+ - Adds "external_stock" field to the Part API endpoint
+ - Adds "external_stock" field to the BomItem API endpoint
+ - Adds "external_stock" field to the BuildLine API endpoint
+ - Stock quantites represented in the BuildLine API endpoint are now filtered by Build.source_location
+
v177 - 2024-02-27 : https://github.com/inventree/InvenTree/pull/6581
- Adds "subcategoies" count to PartCategoryTree serializer
- Adds "sublocations" count to StockLocationTree serializer
diff --git a/InvenTree/InvenTree/conversion.py b/InvenTree/InvenTree/conversion.py
index e154dc76f8..c02fd7a561 100644
--- a/InvenTree/InvenTree/conversion.py
+++ b/InvenTree/InvenTree/conversion.py
@@ -39,9 +39,9 @@ def reload_unit_registry():
reg = pint.UnitRegistry(autoconvert_offset_to_baseunit=True)
# Aliases for temperature units
- reg.define('@alias degC = celsius = Celsius')
- reg.define('@alias degF = fahrenheit = Fahrenheit')
- reg.define('@alias degK = kelvin = Kelvin')
+ reg.define('@alias degC = Celsius')
+ reg.define('@alias degF = Fahrenheit')
+ reg.define('@alias degK = Kelvin')
# Define some "standard" additional units
reg.define('piece = 1')
@@ -165,6 +165,13 @@ def convert_physical_value(value: str, unit: str = None, strip_units=True):
value = str(value).strip() if value else ''
unit = str(unit).strip() if unit else ''
+ # Handle imperial length measurements
+ if value.count("'") == 1 and value.endswith("'"):
+ value = value.replace("'", ' feet')
+
+ if value.count('"') == 1 and value.endswith('"'):
+ value = value.replace('"', ' inches')
+
# Error on blank values
if not value:
raise ValidationError(_('No value provided'))
diff --git a/InvenTree/InvenTree/helpers.py b/InvenTree/InvenTree/helpers.py
index d43a462f92..1e30999cec 100644
--- a/InvenTree/InvenTree/helpers.py
+++ b/InvenTree/InvenTree/helpers.py
@@ -1,5 +1,6 @@
"""Provides helper functions used throughout the InvenTree project."""
+import datetime
import hashlib
import io
import json
@@ -11,6 +12,7 @@ from decimal import Decimal, InvalidOperation
from typing import TypeVar
from wsgiref.util import FileWrapper
+import django.utils.timezone as timezone
from django.conf import settings
from django.contrib.staticfiles.storage import StaticFilesStorage
from django.core.exceptions import FieldError, ValidationError
@@ -18,6 +20,7 @@ from django.core.files.storage import default_storage
from django.http import StreamingHttpResponse
from django.utils.translation import gettext_lazy as _
+import pytz
import regex
from bleach import clean
from djmoney.money import Money
@@ -87,11 +90,24 @@ def generateTestKey(test_name: str) -> str:
key = test_name.strip().lower()
key = key.replace(' ', '')
- # Remove any characters that cannot be used to represent a variable
- key = re.sub(r'[^a-zA-Z0-9_]', '', key)
+ def valid_char(char: str):
+ """Determine if a particular character is valid for use in a test key."""
+ if not char.isprintable():
+ return False
- # If the key starts with a digit, prefix with an underscore
- if key[0].isdigit():
+ if char.isidentifier():
+ return True
+
+ if char.isalnum():
+ return True
+
+ return False
+
+ # Remove any characters that cannot be used to represent a variable
+ key = ''.join([c for c in key if valid_char(c)])
+
+ # If the key starts with a non-identifier character, prefix with an underscore
+ if len(key) > 0 and not key[0].isidentifier():
key = '_' + key
return key
@@ -850,6 +866,56 @@ def hash_file(filename: str):
return hashlib.md5(open(filename, 'rb').read()).hexdigest()
+def server_timezone() -> str:
+ """Return the timezone of the server as a string.
+
+ e.g. "UTC" / "Australia/Sydney" etc
+ """
+ return settings.TIME_ZONE
+
+
+def to_local_time(time, target_tz: str = None):
+ """Convert the provided time object to the local timezone.
+
+ Arguments:
+ time: The time / date to convert
+ target_tz: The desired timezone (string) - defaults to server time
+
+ Returns:
+ A timezone aware datetime object, with the desired timezone
+
+ Raises:
+ TypeError: If the provided time object is not a datetime or date object
+ """
+ if isinstance(time, datetime.datetime):
+ pass
+ elif isinstance(time, datetime.date):
+ time = timezone.datetime(year=time.year, month=time.month, day=time.day)
+ else:
+ raise TypeError(
+ f'Argument must be a datetime or date object (found {type(time)}'
+ )
+
+ # Extract timezone information from the provided time
+ source_tz = getattr(time, 'tzinfo', None)
+
+ if not source_tz:
+ # Default to UTC if not provided
+ source_tz = pytz.utc
+
+ if not target_tz:
+ target_tz = server_timezone()
+
+ try:
+ target_tz = pytz.timezone(str(target_tz))
+ except pytz.UnknownTimeZoneError:
+ target_tz = pytz.utc
+
+ target_time = time.replace(tzinfo=source_tz).astimezone(target_tz)
+
+ return target_time
+
+
def get_objectreference(
obj, type_ref: str = 'content_type', object_ref: str = 'object_id'
):
diff --git a/InvenTree/InvenTree/middleware.py b/InvenTree/InvenTree/middleware.py
index e9a272e13b..1eda1df57a 100644
--- a/InvenTree/InvenTree/middleware.py
+++ b/InvenTree/InvenTree/middleware.py
@@ -74,6 +74,7 @@ class AuthRequiredMiddleware(object):
# Is the function exempt from auth requirements?
path_func = resolve(request.path).func
+
if getattr(path_func, 'auth_exempt', False) is True:
return self.get_response(request)
@@ -119,7 +120,13 @@ class AuthRequiredMiddleware(object):
]
# Do not redirect requests to any of these paths
- paths_ignore = ['/api/', '/js/', '/media/', '/static/']
+ paths_ignore = [
+ '/api/',
+ '/auth/',
+ '/js/',
+ settings.MEDIA_URL,
+ settings.STATIC_URL,
+ ]
if path not in urls and not any(
path.startswith(p) for p in paths_ignore
diff --git a/InvenTree/InvenTree/settings.py b/InvenTree/InvenTree/settings.py
index f08b85e2e7..071b01be7c 100644
--- a/InvenTree/InvenTree/settings.py
+++ b/InvenTree/InvenTree/settings.py
@@ -22,6 +22,7 @@ from django.http import Http404
from django.utils.translation import gettext_lazy as _
import moneyed
+import pytz
from dotenv import load_dotenv
from InvenTree.config import get_boolean_setting, get_custom_file, get_setting
@@ -130,6 +131,9 @@ DATA_UPLOAD_MAX_NUMBER_FIELDS = 10000
# Web URL endpoint for served static files
STATIC_URL = '/static/'
+# Web URL endpoint for served media files
+MEDIA_URL = '/media/'
+
STATICFILES_DIRS = []
# Translated Template settings
@@ -155,9 +159,6 @@ STATFILES_I18_PROCESSORS = ['InvenTree.context.status_codes']
# Color Themes Directory
STATIC_COLOR_THEMES_DIR = STATIC_ROOT.joinpath('css', 'color-themes').resolve()
-# Web URL endpoint for served media files
-MEDIA_URL = '/media/'
-
# Database backup options
# Ref: https://django-dbbackup.readthedocs.io/en/master/configuration.html
DBBACKUP_SEND_EMAIL = False
@@ -205,6 +206,7 @@ INSTALLED_APPS = [
'django.contrib.auth',
'django.contrib.contenttypes',
'user_sessions', # db user sessions
+ 'whitenoise.runserver_nostatic',
'django.contrib.messages',
'django.contrib.staticfiles',
'django.contrib.sites',
@@ -249,6 +251,7 @@ MIDDLEWARE = CONFIG.get(
'django.middleware.locale.LocaleMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'corsheaders.middleware.CorsMiddleware',
+ 'whitenoise.middleware.WhiteNoiseMiddleware',
'django.middleware.common.CommonMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'InvenTree.middleware.InvenTreeRemoteUserMiddleware', # Remote / proxy auth
@@ -294,7 +297,10 @@ if LDAP_AUTH:
# get global options from dict and use ldap.OPT_* as keys and values
global_options_dict = get_setting(
- 'INVENTREE_LDAP_GLOBAL_OPTIONS', 'ldap.global_options', {}, dict
+ 'INVENTREE_LDAP_GLOBAL_OPTIONS',
+ 'ldap.global_options',
+ default_value=None,
+ typecast=dict,
)
global_options = {}
for k, v in global_options_dict.items():
@@ -364,24 +370,16 @@ if LDAP_AUTH:
)
AUTH_LDAP_DENY_GROUP = get_setting('INVENTREE_LDAP_DENY_GROUP', 'ldap.deny_group')
AUTH_LDAP_USER_FLAGS_BY_GROUP = get_setting(
- 'INVENTREE_LDAP_USER_FLAGS_BY_GROUP', 'ldap.user_flags_by_group', {}, dict
+ 'INVENTREE_LDAP_USER_FLAGS_BY_GROUP',
+ 'ldap.user_flags_by_group',
+ default_value=None,
+ typecast=dict,
)
AUTH_LDAP_FIND_GROUP_PERMS = True
-# Internal IP addresses allowed to see the debug toolbar
-INTERNAL_IPS = ['127.0.0.1']
-
# Internal flag to determine if we are running in docker mode
DOCKER = get_boolean_setting('INVENTREE_DOCKER', default_value=False)
-if DOCKER: # pragma: no cover
- # Internal IP addresses are different when running under docker
- hostname, ___, ips = socket.gethostbyname_ex(socket.gethostname())
- INTERNAL_IPS = [ip[: ip.rfind('.')] + '.1' for ip in ips] + [
- '127.0.0.1',
- '10.0.2.2',
- ]
-
# Allow secure http developer server in debug mode
if DEBUG:
INSTALLED_APPS.append('sslserver')
@@ -469,21 +467,6 @@ if USE_JWT:
INSTALLED_APPS.append('rest_framework_simplejwt')
# WSGI default setting
-SPECTACULAR_SETTINGS = {
- 'TITLE': 'InvenTree API',
- 'DESCRIPTION': 'API for InvenTree - the intuitive open source inventory management system',
- 'LICENSE': {
- 'name': 'MIT',
- 'url': 'https://github.com/inventree/InvenTree/blob/master/LICENSE',
- },
- 'EXTERNAL_DOCS': {
- 'description': 'More information about InvenTree in the official docs',
- 'url': 'https://docs.inventree.org',
- },
- 'VERSION': str(inventreeApiVersion()),
- 'SERVE_INCLUDE_SCHEMA': False,
-}
-
WSGI_APPLICATION = 'InvenTree.wsgi.application'
"""
@@ -497,7 +480,7 @@ Configure the database backend based on the user-specified values.
logger.debug('Configuring database backend:')
# Extract database configuration from the config.yaml file
-db_config = CONFIG.get('database', {})
+db_config = CONFIG.get('database', None)
if not db_config:
db_config = {}
@@ -573,7 +556,10 @@ Ref: https://docs.djangoproject.com/en/3.2/ref/settings/#std:setting-OPTIONS
# connecting to the database server (such as a replica failover) don't sit and
# wait for possibly an hour or more, just tell the client something went wrong
# and let the client retry when they want to.
-db_options = db_config.get('OPTIONS', db_config.get('options', {}))
+db_options = db_config.get('OPTIONS', db_config.get('options', None))
+
+if db_options is None:
+ db_options = {}
# Specific options for postgres backend
if 'postgres' in db_engine: # pragma: no cover
@@ -736,7 +722,10 @@ if TRACING_ENABLED: # pragma: no cover
logger.info('OpenTelemetry tracing enabled')
_t_resources = get_setting(
- 'INVENTREE_TRACING_RESOURCES', 'tracing.resources', {}, dict
+ 'INVENTREE_TRACING_RESOURCES',
+ 'tracing.resources',
+ default_value=None,
+ typecast=dict,
)
cstm_tags = {'inventree.env.' + k: v for k, v in inventree_tags.items()}
tracing_resources = {**cstm_tags, **_t_resources}
@@ -748,7 +737,12 @@ if TRACING_ENABLED: # pragma: no cover
console=get_boolean_setting(
'INVENTREE_TRACING_CONSOLE', 'tracing.console', False
),
- auth=get_setting('INVENTREE_TRACING_AUTH', 'tracing.auth', {}),
+ auth=get_setting(
+ 'INVENTREE_TRACING_AUTH',
+ 'tracing.auth',
+ default_value=None,
+ typecast=dict,
+ ),
is_http=get_setting('INVENTREE_TRACING_IS_HTTP', 'tracing.is_http', True),
append_http=get_boolean_setting(
'INVENTREE_TRACING_APPEND_HTTP', 'tracing.append_http', True
@@ -945,8 +939,13 @@ LOCALE_PATHS = (BASE_DIR.joinpath('locale/'),)
TIME_ZONE = get_setting('INVENTREE_TIMEZONE', 'timezone', 'UTC')
-USE_I18N = True
+# Check that the timezone is valid
+try:
+ pytz.timezone(TIME_ZONE)
+except pytz.exceptions.UnknownTimeZoneError: # pragma: no cover
+ raise ValueError(f"Specified timezone '{TIME_ZONE}' is not valid")
+USE_I18N = True
# Do not use native timezone support in "test" mode
# It generates a *lot* of cruft in the logs
@@ -990,13 +989,29 @@ if not SITE_MULTI:
ALLOWED_HOSTS = get_setting(
'INVENTREE_ALLOWED_HOSTS',
config_key='allowed_hosts',
- default_value=['*'],
+ default_value=[],
typecast=list,
)
if SITE_URL and SITE_URL not in ALLOWED_HOSTS:
ALLOWED_HOSTS.append(SITE_URL)
+if not ALLOWED_HOSTS:
+ if DEBUG:
+ logger.info(
+ 'No ALLOWED_HOSTS specified. Defaulting to ["*"] for debug mode. This is not recommended for production use'
+ )
+ ALLOWED_HOSTS = ['*']
+ else:
+ logger.error(
+ 'No ALLOWED_HOSTS specified. Please provide a list of allowed hosts, or specify INVENTREE_SITE_URL'
+ )
+
+# Ensure that the ALLOWED_HOSTS do not contain any scheme info
+for i, host in enumerate(ALLOWED_HOSTS):
+ if '://' in host:
+ ALLOWED_HOSTS[i] = host.split('://')[1]
+
# List of trusted origins for unsafe requests
# Ref: https://docs.djangoproject.com/en/4.2/ref/settings/#csrf-trusted-origins
CSRF_TRUSTED_ORIGINS = get_setting(
@@ -1037,8 +1052,8 @@ CORS_ALLOW_CREDENTIALS = get_boolean_setting(
default_value=True,
)
-# Only allow CORS access to API and media endpoints
-CORS_URLS_REGEX = r'^/(api|media|static)/.*$'
+# Only allow CORS access to the following URL endpoints
+CORS_URLS_REGEX = r'^/(api|auth|media|static)/.*$'
CORS_ALLOWED_ORIGINS = get_setting(
'INVENTREE_CORS_ORIGIN_WHITELIST',
@@ -1051,6 +1066,27 @@ CORS_ALLOWED_ORIGINS = get_setting(
if SITE_URL and SITE_URL not in CORS_ALLOWED_ORIGINS:
CORS_ALLOWED_ORIGINS.append(SITE_URL)
+CORS_ALLOWED_ORIGIN_REGEXES = get_setting(
+ 'INVENTREE_CORS_ORIGIN_REGEX',
+ config_key='cors.regex',
+ default_value=[],
+ typecast=list,
+)
+
+# In debug mode allow CORS requests from localhost
+# This allows connection from the frontend development server
+if DEBUG:
+ CORS_ALLOWED_ORIGIN_REGEXES.append(r'^http://localhost:\d+$')
+
+if CORS_ALLOW_ALL_ORIGINS:
+ logger.info('CORS: All origins allowed')
+else:
+ if CORS_ALLOWED_ORIGINS:
+ logger.info('CORS: Whitelisted origins: %s', CORS_ALLOWED_ORIGINS)
+
+ if CORS_ALLOWED_ORIGIN_REGEXES:
+ logger.info('CORS: Whitelisted origin regexes: %s', CORS_ALLOWED_ORIGIN_REGEXES)
+
for app in SOCIAL_BACKENDS:
# Ensure that the app starts with 'allauth.socialaccount.providers'
social_prefix = 'allauth.socialaccount.providers.'
@@ -1083,6 +1119,7 @@ ACCOUNT_DEFAULT_HTTP_PROTOCOL = get_setting(
)
ACCOUNT_LOGOUT_ON_PASSWORD_CHANGE = True
ACCOUNT_PREVENT_ENUMERATION = True
+ACCOUNT_EMAIL_SUBJECT_PREFIX = EMAIL_SUBJECT_PREFIX
# 2FA
REMOVE_SUCCESS_URL = 'settings'
@@ -1173,7 +1210,9 @@ CUSTOM_SPLASH = get_custom_file(
'INVENTREE_CUSTOM_SPLASH', 'customize.splash', 'custom splash'
)
-CUSTOMIZE = get_setting('INVENTREE_CUSTOMIZE', 'customize', {})
+CUSTOMIZE = get_setting(
+ 'INVENTREE_CUSTOMIZE', 'customize', default_value=None, typecast=dict
+)
# Load settings for the frontend interface
FRONTEND_SETTINGS = config.get_frontend_settings(debug=DEBUG)
@@ -1208,3 +1247,23 @@ if CUSTOM_FLAGS:
# Magic login django-sesame
SESAME_MAX_AGE = 300
LOGIN_REDIRECT_URL = '/api/auth/login-redirect/'
+
+# Configuratino for API schema generation
+SPECTACULAR_SETTINGS = {
+ 'TITLE': 'InvenTree API',
+ 'DESCRIPTION': 'API for InvenTree - the intuitive open source inventory management system',
+ 'LICENSE': {
+ 'name': 'MIT',
+ 'url': 'https://github.com/inventree/InvenTree/blob/master/LICENSE',
+ },
+ 'EXTERNAL_DOCS': {
+ 'description': 'More information about InvenTree in the official docs',
+ 'url': 'https://docs.inventree.org',
+ },
+ 'VERSION': str(inventreeApiVersion()),
+ 'SERVE_INCLUDE_SCHEMA': False,
+ 'SCHEMA_PATH_PREFIX': '/api/',
+}
+
+if SITE_URL:
+ SPECTACULAR_SETTINGS['SERVERS'] = [{'url': SITE_URL}]
diff --git a/InvenTree/InvenTree/tasks.py b/InvenTree/InvenTree/tasks.py
index 036ac98796..4356509e12 100644
--- a/InvenTree/InvenTree/tasks.py
+++ b/InvenTree/InvenTree/tasks.py
@@ -180,6 +180,8 @@ def offload_task(
Returns:
bool: True if the task was offloaded (or ran), False otherwise
"""
+ from InvenTree.exceptions import log_error
+
try:
import importlib
@@ -213,6 +215,7 @@ def offload_task(
return False
except Exception as exc:
raise_warning(f"WARNING: '{taskname}' not offloaded due to {str(exc)}")
+ log_error('InvenTree.offload_task')
return False
else:
if callable(taskname):
@@ -233,6 +236,7 @@ def offload_task(
try:
_mod = importlib.import_module(app_mod)
except ModuleNotFoundError:
+ log_error('InvenTree.offload_task')
raise_warning(
f"WARNING: '{taskname}' not started - No module named '{app_mod}'"
)
@@ -249,6 +253,7 @@ def offload_task(
if not _func:
_func = eval(func) # pragma: no cover
except NameError:
+ log_error('InvenTree.offload_task')
raise_warning(
f"WARNING: '{taskname}' not started - No function named '{func}'"
)
@@ -258,6 +263,7 @@ def offload_task(
try:
_func(*args, **kwargs)
except Exception as exc:
+ log_error('InvenTree.offload_task')
raise_warning(f"WARNING: '{taskname}' not started due to {str(exc)}")
return False
diff --git a/InvenTree/InvenTree/tests.py b/InvenTree/InvenTree/tests.py
index 8a3d41b528..45516eba2e 100644
--- a/InvenTree/InvenTree/tests.py
+++ b/InvenTree/InvenTree/tests.py
@@ -14,8 +14,10 @@ from django.core import mail
from django.core.exceptions import ValidationError
from django.test import TestCase, override_settings, tag
from django.urls import reverse
+from django.utils import timezone
import pint.errors
+import pytz
from djmoney.contrib.exchange.exceptions import MissingRate
from djmoney.contrib.exchange.models import Rate, convert_money
from djmoney.money import Money
@@ -40,6 +42,147 @@ from .tasks import offload_task
from .validators import validate_overage
+class HostTest(InvenTreeTestCase):
+ """Test for host configuration."""
+
+ @override_settings(ALLOWED_HOSTS=['testserver'])
+ def test_allowed_hosts(self):
+ """Test that the ALLOWED_HOSTS functions as expected."""
+ self.assertIn('testserver', settings.ALLOWED_HOSTS)
+
+ response = self.client.get('/api/', headers={'host': 'testserver'})
+
+ self.assertEqual(response.status_code, 200)
+
+ response = self.client.get('/api/', headers={'host': 'invalidserver'})
+
+ self.assertEqual(response.status_code, 400)
+
+ @override_settings(ALLOWED_HOSTS=['invalidserver.co.uk'])
+ def test_allowed_hosts_2(self):
+ """Another test for ALLOWED_HOSTS functionality."""
+ response = self.client.get('/api/', headers={'host': 'invalidserver.co.uk'})
+
+ self.assertEqual(response.status_code, 200)
+
+
+class CorsTest(TestCase):
+ """Unit tests for CORS functionality."""
+
+ def cors_headers(self):
+ """Return a list of CORS headers."""
+ return [
+ 'access-control-allow-origin',
+ 'access-control-allow-credentials',
+ 'access-control-allow-methods',
+ 'access-control-allow-headers',
+ ]
+
+ def preflight(self, url, origin, method='GET'):
+ """Make a CORS preflight request to the specified URL."""
+ headers = {'origin': origin, 'access-control-request-method': method}
+
+ return self.client.options(url, headers=headers)
+
+ def test_no_origin(self):
+ """Test that CORS headers are not included for regular requests.
+
+ - We use the /api/ endpoint for this test (it does not require auth)
+ - By default, in debug mode *all* CORS origins are allowed
+ """
+ # Perform an initial response without the "origin" header
+ response = self.client.get('/api/')
+ self.assertEqual(response.status_code, 200)
+
+ for header in self.cors_headers():
+ self.assertNotIn(header, response.headers)
+
+ # Now, perform a "preflight" request with the "origin" header
+ response = self.preflight('/api/', origin='http://random-external-server.com')
+ self.assertEqual(response.status_code, 200)
+
+ for header in self.cors_headers():
+ self.assertIn(header, response.headers)
+
+ self.assertEqual(response.headers['content-length'], '0')
+ self.assertEqual(
+ response.headers['access-control-allow-origin'],
+ 'http://random-external-server.com',
+ )
+
+ @override_settings(
+ CORS_ALLOW_ALL_ORIGINS=False,
+ CORS_ALLOWED_ORIGINS=['http://my-external-server.com'],
+ CORS_ALLOWED_ORIGIN_REGEXES=[],
+ )
+ def test_auth_view(self):
+ """Test that CORS requests work for the /auth/ view.
+
+ Here, we are not authorized by default,
+ but the CORS headers should still be included.
+ """
+ url = '/auth/'
+
+ # First, a preflight request with a "valid" origin
+
+ response = self.preflight(url, origin='http://my-external-server.com')
+
+ self.assertEqual(response.status_code, 200)
+
+ for header in self.cors_headers():
+ self.assertIn(header, response.headers)
+
+ # Next, a preflight request with an "invalid" origin
+ response = self.preflight(url, origin='http://random-external-server.com')
+
+ self.assertEqual(response.status_code, 200)
+
+ for header in self.cors_headers():
+ self.assertNotIn(header, response.headers)
+
+ # Next, make a GET request (without a token)
+ response = self.client.get(
+ url, headers={'origin': 'http://my-external-server.com'}
+ )
+
+ # Unauthorized
+ self.assertEqual(response.status_code, 401)
+
+ self.assertIn('access-control-allow-origin', response.headers)
+ self.assertNotIn('access-control-allow-methods', response.headers)
+
+ @override_settings(
+ CORS_ALLOW_ALL_ORIGINS=False,
+ CORS_ALLOWED_ORIGINS=[],
+ CORS_ALLOWED_ORIGIN_REGEXES=['http://.*myserver.com'],
+ )
+ def test_cors_regex(self):
+ """Test that CORS regexes work as expected."""
+ valid_urls = [
+ 'http://www.myserver.com',
+ 'http://test.myserver.com',
+ 'http://myserver.com',
+ 'http://www.myserver.com:8080',
+ ]
+
+ invalid_urls = [
+ 'http://myserver.org',
+ 'http://www.other-server.org',
+ 'http://google.com',
+ 'http://myserver.co.uk:8080',
+ ]
+
+ for url in valid_urls:
+ response = self.preflight('/api/', origin=url)
+ self.assertEqual(response.status_code, 200)
+ self.assertIn('access-control-allow-origin', response.headers)
+
+ for url in invalid_urls:
+ response = self.preflight('/api/', origin=url)
+ self.assertEqual(response.status_code, 200)
+ self.assertNotIn('access-control-allow-origin', response.headers)
+
+
class ConversionTest(TestCase):
"""Tests for conversion of physical units."""
@@ -138,6 +281,24 @@ class ConversionTest(TestCase):
q = InvenTree.conversion.convert_physical_value(val, 'W', strip_units=False)
self.assertAlmostEqual(float(q.magnitude), expected, places=2)
+ def test_imperial_lengths(self):
+ """Test support of imperial length measurements."""
+ tests = [
+ ('1 inch', 'mm', 25.4),
+ ('1 "', 'mm', 25.4),
+ ('2 "', 'inches', 2),
+ ('3 feet', 'inches', 36),
+ ("3'", 'inches', 36),
+ ("7 '", 'feet', 7),
+ ]
+
+ for val, unit, expected in tests:
+ output = InvenTree.conversion.convert_physical_value(
+ val, unit, strip_units=True
+ )
+
+ self.assertAlmostEqual(output, expected, 3)
+
def test_dimensionless_units(self):
"""Tests for 'dimensionless' unit quantities."""
# Test some dimensionless units
@@ -587,6 +748,47 @@ class TestHelpers(TestCase):
self.assertEqual(helpers.generateTestKey(name), key)
+class TestTimeFormat(TestCase):
+ """Unit test for time formatting functionality."""
+
+ @override_settings(TIME_ZONE='UTC')
+ def test_tz_utc(self):
+ """Check UTC timezone."""
+ self.assertEqual(InvenTree.helpers.server_timezone(), 'UTC')
+
+ @override_settings(TIME_ZONE='Europe/London')
+ def test_tz_london(self):
+ """Check London timezone."""
+ self.assertEqual(InvenTree.helpers.server_timezone(), 'Europe/London')
+
+ @override_settings(TIME_ZONE='Australia/Sydney')
+ def test_to_local_time(self):
+ """Test that the local time conversion works as expected."""
+ source_time = timezone.datetime(
+ year=2000,
+ month=1,
+ day=1,
+ hour=0,
+ minute=0,
+ second=0,
+ tzinfo=pytz.timezone('Europe/London'),
+ )
+
+ tests = [
+ ('UTC', '2000-01-01 00:01:00+00:00'),
+ ('Europe/London', '2000-01-01 00:00:00-00:01'),
+ ('America/New_York', '1999-12-31 19:01:00-05:00'),
+ # All following tests should result in the same value
+ ('Australia/Sydney', '2000-01-01 11:01:00+11:00'),
+ (None, '2000-01-01 11:01:00+11:00'),
+ ('', '2000-01-01 11:01:00+11:00'),
+ ]
+
+ for tz, expected in tests:
+ local_time = InvenTree.helpers.to_local_time(source_time, tz)
+ self.assertEqual(str(local_time), expected)
+
+
class TestQuoteWrap(TestCase):
"""Tests for string wrapping."""
@@ -894,6 +1096,7 @@ class TestVersionNumber(TestCase):
hash = str(
subprocess.check_output('git rev-parse --short HEAD'.split()), 'utf-8'
).strip()
+
self.assertEqual(hash, version.inventreeCommitHash())
d = (
diff --git a/InvenTree/InvenTree/version.py b/InvenTree/InvenTree/version.py
index bd84bd7d7c..ef7e6c69b7 100644
--- a/InvenTree/InvenTree/version.py
+++ b/InvenTree/InvenTree/version.py
@@ -19,7 +19,7 @@ from dulwich.repo import NotGitRepository, Repo
from .api_version import INVENTREE_API_TEXT, INVENTREE_API_VERSION
# InvenTree software version
-INVENTREE_SW_VERSION = '0.14.0 dev'
+INVENTREE_SW_VERSION = '0.15.0 dev'
# Discover git
try:
diff --git a/InvenTree/build/api.py b/InvenTree/build/api.py
index 47fd8ae0cf..291e0694ae 100644
--- a/InvenTree/build/api.py
+++ b/InvenTree/build/api.py
@@ -314,11 +314,21 @@ class BuildLineEndpoint:
queryset = BuildLine.objects.all()
serializer_class = build.serializers.BuildLineSerializer
+ def get_source_build(self) -> Build:
+ """Return the source Build object for the BuildLine queryset.
+
+ This source build is used to filter the available stock for each BuildLine.
+
+ - If this is a "detail" view, use the build associated with the line
+ - If this is a "list" view, use the build associated with the request
+ """
+ raise NotImplementedError("get_source_build must be implemented in the child class")
+
def get_queryset(self):
"""Override queryset to select-related and annotate"""
queryset = super().get_queryset()
-
- queryset = build.serializers.BuildLineSerializer.annotate_queryset(queryset)
+ source_build = self.get_source_build()
+ queryset = build.serializers.BuildLineSerializer.annotate_queryset(queryset, build=source_build)
return queryset
@@ -353,10 +363,26 @@ class BuildLineList(BuildLineEndpoint, ListCreateAPI):
'bom_item__reference',
]
+ def get_source_build(self) -> Build:
+ """Return the target build for the BuildLine queryset."""
+
+ try:
+ build_id = self.request.query_params.get('build', None)
+ if build_id:
+ build = Build.objects.get(pk=build_id)
+ return build
+ except (Build.DoesNotExist, AttributeError, ValueError):
+ pass
+
+ return None
class BuildLineDetail(BuildLineEndpoint, RetrieveUpdateDestroyAPI):
"""API endpoint for detail view of a BuildLine object."""
- pass
+
+ def get_source_build(self) -> Build:
+ """Return the target source location for the BuildLine queryset."""
+
+ return None
class BuildOrderContextMixin:
diff --git a/InvenTree/build/models.py b/InvenTree/build/models.py
index ca3b202317..43308ad9ba 100644
--- a/InvenTree/build/models.py
+++ b/InvenTree/build/models.py
@@ -518,9 +518,25 @@ class Build(InvenTree.models.InvenTreeBarcodeMixin, InvenTree.models.InvenTreeNo
return True
+ @transaction.atomic
+ def complete_allocations(self, user):
+ """Complete all stock allocations for this build order.
+
+ - This function is called when a build order is completed
+ """
+ # Remove untracked allocated stock
+ self.subtract_allocated_stock(user)
+
+ # Ensure that there are no longer any BuildItem objects
+ # which point to this Build Order
+ self.allocated_stock.delete()
+
@transaction.atomic
def complete_build(self, user):
"""Mark this build as complete."""
+
+ import build.tasks
+
if self.incomplete_count > 0:
return
@@ -529,12 +545,12 @@ class Build(InvenTree.models.InvenTreeBarcodeMixin, InvenTree.models.InvenTreeNo
self.status = BuildStatus.COMPLETE.value
self.save()
- # Remove untracked allocated stock
- self.subtract_allocated_stock(user)
-
- # Ensure that there are no longer any BuildItem objects
- # which point to this Build Order
- self.allocated_stock.delete()
+ # Offload task to complete build allocations
+ InvenTree.tasks.offload_task(
+ build.tasks.complete_build_allocations,
+ self.pk,
+ user.pk if user else None
+ )
# Register an event
trigger_event('build.completed', id=self.pk)
diff --git a/InvenTree/build/serializers.py b/InvenTree/build/serializers.py
index 41299f04b1..0ae06ef18f 100644
--- a/InvenTree/build/serializers.py
+++ b/InvenTree/build/serializers.py
@@ -1083,6 +1083,7 @@ class BuildLineSerializer(InvenTreeModelSerializer):
'available_substitute_stock',
'available_variant_stock',
'total_available_stock',
+ 'external_stock',
]
read_only_fields = [
@@ -1124,15 +1125,23 @@ class BuildLineSerializer(InvenTreeModelSerializer):
available_substitute_stock = serializers.FloatField(read_only=True)
available_variant_stock = serializers.FloatField(read_only=True)
total_available_stock = serializers.FloatField(read_only=True)
+ external_stock = serializers.FloatField(read_only=True)
@staticmethod
- def annotate_queryset(queryset):
+ def annotate_queryset(queryset, build=None):
"""Add extra annotations to the queryset:
- allocated: Total stock quantity allocated against this build line
- available: Total stock available for allocation against this build line
- on_order: Total stock on order for this build line
- in_production: Total stock currently in production for this build line
+
+ Arguments:
+ queryset: The queryset to annotate
+ build: The build order to filter against (optional)
+
+ Note: If the 'build' is provided, we can use it to filter available stock, depending on the specified location for the build
+
"""
queryset = queryset.select_related(
'build', 'bom_item',
@@ -1169,6 +1178,18 @@ class BuildLineSerializer(InvenTreeModelSerializer):
ref = 'bom_item__sub_part__'
+ stock_filter = None
+
+ if build is not None and build.take_from is not None:
+ location = build.take_from
+ # Filter by locations below the specified location
+ stock_filter = Q(
+ location__tree_id=location.tree_id,
+ location__lft__gte=location.lft,
+ location__rght__lte=location.rght,
+ location__level__gte=location.level,
+ )
+
# Annotate the "in_production" quantity
queryset = queryset.annotate(
in_production=part.filters.annotate_in_production_quantity(reference=ref)
@@ -1181,10 +1202,8 @@ class BuildLineSerializer(InvenTreeModelSerializer):
)
# Annotate the "available" quantity
- # TODO: In the future, this should be refactored.
- # TODO: Note that part.serializers.BomItemSerializer also has a similar annotation
queryset = queryset.alias(
- total_stock=part.filters.annotate_total_stock(reference=ref),
+ total_stock=part.filters.annotate_total_stock(reference=ref, filter=stock_filter),
allocated_to_sales_orders=part.filters.annotate_sales_order_allocations(reference=ref),
allocated_to_build_orders=part.filters.annotate_build_order_allocations(reference=ref),
)
@@ -1197,11 +1216,21 @@ class BuildLineSerializer(InvenTreeModelSerializer):
)
)
+ external_stock_filter = Q(location__external=True)
+
+ if stock_filter:
+ external_stock_filter &= stock_filter
+
+ # Add 'external stock' annotations
+ queryset = queryset.annotate(
+ external_stock=part.filters.annotate_total_stock(reference=ref, filter=external_stock_filter)
+ )
+
ref = 'bom_item__substitutes__part__'
# Extract similar information for any 'substitute' parts
queryset = queryset.alias(
- substitute_stock=part.filters.annotate_total_stock(reference=ref),
+ substitute_stock=part.filters.annotate_total_stock(reference=ref, filter=stock_filter),
substitute_build_allocations=part.filters.annotate_build_order_allocations(reference=ref),
substitute_sales_allocations=part.filters.annotate_sales_order_allocations(reference=ref)
)
@@ -1215,7 +1244,7 @@ class BuildLineSerializer(InvenTreeModelSerializer):
)
# Annotate the queryset with 'available variant stock' information
- variant_stock_query = part.filters.variant_stock_query(reference='bom_item__sub_part__')
+ variant_stock_query = part.filters.variant_stock_query(reference='bom_item__sub_part__', filter=stock_filter)
queryset = queryset.alias(
variant_stock_total=part.filters.annotate_variant_quantity(variant_stock_query, reference='quantity'),
diff --git a/InvenTree/build/tasks.py b/InvenTree/build/tasks.py
index 46fd97cab4..472b8c5166 100644
--- a/InvenTree/build/tasks.py
+++ b/InvenTree/build/tasks.py
@@ -4,6 +4,7 @@ from datetime import datetime, timedelta
from decimal import Decimal
import logging
+from django.contrib.auth.models import User
from django.utils.translation import gettext_lazy as _
from django.template.loader import render_to_string
@@ -24,6 +25,27 @@ import part.models as part_models
logger = logging.getLogger('inventree')
+def complete_build_allocations(build_id: int, user_id: int):
+ """Complete build allocations for a specified BuildOrder."""
+
+ build_order = build.models.Build.objects.filter(pk=build_id).first()
+
+ if user_id:
+ try:
+ user = User.objects.get(pk=user_id)
+ except User.DoesNotExist:
+ logger.warning("Could not complete build allocations for BuildOrder <%s> - User does not exist", build_id)
+ return
+ else:
+ user = None
+
+ if not build_order:
+ logger.warning("Could not complete build allocations for BuildOrder <%s> - BuildOrder does not exist", build_id)
+ return
+
+ build_order.complete_allocations(user)
+
+
def update_build_order_lines(bom_item_pk: int):
"""Update all BuildOrderLineItem objects which reference a particular BomItem.
diff --git a/InvenTree/build/templates/build/detail.html b/InvenTree/build/templates/build/detail.html
index 19438e70f5..3d2e5d4e96 100644
--- a/InvenTree/build/templates/build/detail.html
+++ b/InvenTree/build/templates/build/detail.html
@@ -200,6 +200,11 @@
{% include "filter_list.html" with id='buildlines' %}
+ {% if build.take_from %}
+
+ {% trans "Available stock has been filtered based on specified source location for this build order" %}
+
+ {% endif %}
@@ -374,6 +379,9 @@ onPanelLoad('allocate', function() {
"#build-lines-table",
{{ build.pk }},
{
+ {% if build.take_from %}
+ location: {{ build.take_from.pk }},
+ {% endif %}
{% if build.project_code %}
project_code: {{ build.project_code.pk }},
{% endif %}
diff --git a/InvenTree/common/models.py b/InvenTree/common/models.py
index 9ca83c361a..b4a175a071 100644
--- a/InvenTree/common/models.py
+++ b/InvenTree/common/models.py
@@ -226,9 +226,12 @@ class BaseInvenTreeSetting(models.Model):
"""
cache_key = f'BUILD_DEFAULT_VALUES:{str(cls.__name__)}'
- if InvenTree.helpers.str2bool(cache.get(cache_key, False)):
- # Already built default values
- return
+ try:
+ if InvenTree.helpers.str2bool(cache.get(cache_key, False)):
+ # Already built default values
+ return
+ except Exception:
+ pass
try:
existing_keys = cls.objects.filter(**kwargs).values_list('key', flat=True)
@@ -251,7 +254,10 @@ class BaseInvenTreeSetting(models.Model):
)
pass
- cache.set(cache_key, True, timeout=3600)
+ try:
+ cache.set(cache_key, True, timeout=3600)
+ except Exception:
+ pass
def _call_settings_function(self, reference: str, args, kwargs):
"""Call a function associated with a particular setting.
@@ -290,8 +296,7 @@ class BaseInvenTreeSetting(models.Model):
try:
cache.set(ckey, self, timeout=3600)
- except TypeError:
- # Some characters cause issues with caching; ignore and move on
+ except Exception:
pass
@classmethod
@@ -554,16 +559,18 @@ class BaseInvenTreeSetting(models.Model):
# Unless otherwise specified, attempt to create the setting
create = kwargs.pop('create', True)
+ # Perform cache lookup by default
+ do_cache = kwargs.pop('cache', True)
+
# Prevent saving to the database during data import
if InvenTree.ready.isImportingData():
create = False
+ do_cache = False
# Prevent saving to the database during migrations
if InvenTree.ready.isRunningMigrations():
create = False
-
- # Perform cache lookup by default
- do_cache = kwargs.pop('cache', True)
+ do_cache = False
ckey = cls.create_cache_key(key, **kwargs)
@@ -575,7 +582,7 @@ class BaseInvenTreeSetting(models.Model):
if cached_setting is not None:
return cached_setting
- except AppRegistryNotReady:
+ except Exception:
# Cache is not ready yet
do_cache = False
@@ -1646,6 +1653,12 @@ class InvenTreeSetting(BaseInvenTreeSetting):
'default': False,
'validator': bool,
},
+ 'REPORT_LOG_ERRORS': {
+ 'name': _('Log Report Errors'),
+ 'description': _('Log errors which occur when generating reports'),
+ 'default': False,
+ 'validator': bool,
+ },
'REPORT_DEFAULT_PAGE_SIZE': {
'name': _('Page Size'),
'description': _('Default page size for PDF reports'),
diff --git a/InvenTree/common/settings.py b/InvenTree/common/settings.py
index 03601ad1f8..3380def996 100644
--- a/InvenTree/common/settings.py
+++ b/InvenTree/common/settings.py
@@ -14,7 +14,10 @@ def currency_code_default():
"""Returns the default currency code (or USD if not specified)."""
from common.models import InvenTreeSetting
- cached_value = cache.get('currency_code_default', '')
+ try:
+ cached_value = cache.get('currency_code_default', '')
+ except Exception:
+ cached_value = None
if cached_value:
return cached_value
@@ -31,7 +34,10 @@ def currency_code_default():
code = 'USD' # pragma: no cover
# Cache the value for a short amount of time
- cache.set('currency_code_default', code, 30)
+ try:
+ cache.set('currency_code_default', code, 30)
+ except Exception:
+ pass
return code
diff --git a/InvenTree/company/serializers.py b/InvenTree/company/serializers.py
index ad6202e83a..f94333aca8 100644
--- a/InvenTree/company/serializers.py
+++ b/InvenTree/company/serializers.py
@@ -42,11 +42,13 @@ class CompanyBriefSerializer(InvenTreeModelSerializer):
"""Metaclass options."""
model = Company
- fields = ['pk', 'url', 'name', 'description', 'image']
+ fields = ['pk', 'url', 'name', 'description', 'image', 'thumbnail']
url = serializers.CharField(source='get_absolute_url', read_only=True)
- image = serializers.CharField(source='get_thumbnail_url', read_only=True)
+ image = InvenTreeImageSerializerField(read_only=True)
+
+ thumbnail = serializers.CharField(source='get_thumbnail_url', read_only=True)
class AddressSerializer(InvenTreeModelSerializer):
diff --git a/InvenTree/config_template.yaml b/InvenTree/config_template.yaml
index 931c135d1e..e429aa2bea 100644
--- a/InvenTree/config_template.yaml
+++ b/InvenTree/config_template.yaml
@@ -168,9 +168,9 @@ allowed_hosts:
# Trusted origins (see CSRF_TRUSTED_ORIGINS in Django settings documentation)
# If you are running behind a proxy, you may need to add the proxy address here
-trusted_origins:
- - 'http://localhost:8000'
-
+# trusted_origins:
+# - 'http://localhost'
+# - 'http://*.localhost'
# Proxy forwarding settings
# If InvenTree is running behind a proxy, you may need to configure these settings
@@ -183,24 +183,23 @@ use_x_forwarded_port: false
# Cross Origin Resource Sharing (CORS) settings (see https://github.com/adamchainz/django-cors-headers)
cors:
- allow_all: True
- allow_credentials: True,
+ allow_all: true
+ allow_credentials: true
# whitelist:
# - https://example.com
# - https://sub.example.com
+ # regex:
+
# MEDIA_ROOT is the local filesystem location for storing uploaded files
#media_root: '/home/inventree/data/media'
# STATIC_ROOT is the local filesystem location for storing static files
#static_root: '/home/inventree/data/static'
-### Backup configuration options ###
# INVENTREE_BACKUP_DIR is the local filesystem location for storing backups
-backup_storage: django.core.files.storage.FileSystemStorage
#backup_dir: '/home/inventree/data/backup'
-#backup_options:
# Background worker options
background:
diff --git a/InvenTree/label/serializers.py b/InvenTree/label/serializers.py
index a38f4bb3ac..ef1f467937 100644
--- a/InvenTree/label/serializers.py
+++ b/InvenTree/label/serializers.py
@@ -15,7 +15,16 @@ class LabelSerializerBase(InvenTreeModelSerializer):
@staticmethod
def label_fields():
"""Generic serializer fields for a label template."""
- return ['pk', 'name', 'description', 'label', 'filters', 'enabled']
+ return [
+ 'pk',
+ 'name',
+ 'description',
+ 'label',
+ 'filters',
+ 'width',
+ 'height',
+ 'enabled',
+ ]
class StockItemLabelSerializer(LabelSerializerBase):
diff --git a/InvenTree/locale/bg/LC_MESSAGES/django.po b/InvenTree/locale/bg/LC_MESSAGES/django.po
index ef16d558bb..80cb1b1f7f 100644
--- a/InvenTree/locale/bg/LC_MESSAGES/django.po
+++ b/InvenTree/locale/bg/LC_MESSAGES/django.po
@@ -2,7 +2,7 @@ msgid ""
msgstr ""
"Project-Id-Version: inventree\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2024-02-28 04:05+0000\n"
+"POT-Creation-Date: 2024-03-05 00:41+0000\n"
"PO-Revision-Date: 2024-02-28 07:23\n"
"Last-Translator: \n"
"Language-Team: Bulgarian\n"
@@ -66,9 +66,9 @@ msgstr "Въведи дата"
#: report/templates/report/inventree_build_order_base.html:172
#: stock/admin.py:226 stock/models.py:2335 stock/models.py:2451
#: stock/serializers.py:479 stock/serializers.py:632 stock/serializers.py:728
-#: stock/serializers.py:778 stock/serializers.py:1081 stock/serializers.py:1170
-#: stock/serializers.py:1335 stock/templates/stock/stock_sidebar.html:25
-#: templates/js/translated/barcode.js:143 templates/js/translated/bom.js:1259
+#: stock/serializers.py:778 stock/serializers.py:1087 stock/serializers.py:1176
+#: stock/serializers.py:1341 stock/templates/stock/stock_sidebar.html:25
+#: templates/js/translated/barcode.js:143 templates/js/translated/bom.js:1265
#: templates/js/translated/company.js:1674 templates/js/translated/order.js:347
#: templates/js/translated/part.js:1080
#: templates/js/translated/purchase_order.js:2201
@@ -523,7 +523,7 @@ msgstr ""
#: templates/js/translated/order.js:298 templates/js/translated/part.js:1238
#: templates/js/translated/part.js:1483 templates/js/translated/part.js:1621
#: templates/js/translated/part.js:1958 templates/js/translated/part.js:2355
-#: templates/js/translated/part.js:2785 templates/js/translated/part.js:2887
+#: templates/js/translated/part.js:2785 templates/js/translated/part.js:2896
#: templates/js/translated/plugin.js:80
#: templates/js/translated/purchase_order.js:1707
#: templates/js/translated/purchase_order.js:1850
@@ -678,7 +678,7 @@ msgstr ""
msgid "Downloading images from remote URL is not enabled"
msgstr ""
-#: InvenTree/status.py:66 part/serializers.py:1120
+#: InvenTree/status.py:66 part/serializers.py:1138
msgid "Background worker check failed"
msgstr ""
@@ -960,7 +960,7 @@ msgid "Tracked"
msgstr ""
#: build/api.py:285 part/admin.py:144 templates/js/translated/build.js:1741
-#: templates/js/translated/build.js:2626
+#: templates/js/translated/build.js:2630
#: templates/js/translated/sales_order.js:1929
#: templates/js/translated/table_filters.js:571
msgid "Allocated"
@@ -1044,11 +1044,11 @@ msgstr ""
#: build/models.py:199 build/templates/build/build_base.html:97
#: build/templates/build/detail.html:29 company/models.py:1044
#: order/models.py:1389 order/models.py:1532 order/models.py:1533
-#: part/api.py:1528 part/models.py:389 part/models.py:3003 part/models.py:3147
-#: part/models.py:3291 part/models.py:3314 part/models.py:3335
-#: part/models.py:3357 part/models.py:3458 part/models.py:3754
-#: part/models.py:3885 part/models.py:3978 part/models.py:4339
-#: part/serializers.py:1066 part/serializers.py:1631
+#: part/api.py:1528 part/api.py:1820 part/models.py:389 part/models.py:3003
+#: part/models.py:3147 part/models.py:3291 part/models.py:3314
+#: part/models.py:3335 part/models.py:3357 part/models.py:3458
+#: part/models.py:3754 part/models.py:3885 part/models.py:3978
+#: part/models.py:4339 part/serializers.py:1084 part/serializers.py:1659
#: part/templates/part/part_app_base.html:8
#: part/templates/part/part_pricing.html:12
#: part/templates/part/upload_bom.html:52
@@ -1147,7 +1147,7 @@ msgid "Build status code"
msgstr ""
#: build/models.py:264 build/serializers.py:280 order/serializers.py:549
-#: stock/models.py:826 stock/serializers.py:1300
+#: stock/models.py:826 stock/serializers.py:1306
#: templates/js/translated/purchase_order.js:1129
msgid "Batch Code"
msgstr ""
@@ -1242,48 +1242,48 @@ msgstr ""
msgid "Project code for this build order"
msgstr ""
-#: build/models.py:559
+#: build/models.py:575
#, python-brace-format
msgid "Build order {build} has been completed"
msgstr ""
-#: build/models.py:565
+#: build/models.py:581
msgid "A build order has been completed"
msgstr ""
-#: build/models.py:783 build/models.py:858
+#: build/models.py:799 build/models.py:874
msgid "No build output specified"
msgstr ""
-#: build/models.py:786
+#: build/models.py:802
msgid "Build output is already completed"
msgstr ""
-#: build/models.py:789
+#: build/models.py:805
msgid "Build output does not match Build Order"
msgstr ""
-#: build/models.py:862 build/serializers.py:223 build/serializers.py:262
+#: build/models.py:878 build/serializers.py:223 build/serializers.py:262
#: build/serializers.py:831 order/models.py:526 order/serializers.py:401
-#: order/serializers.py:544 part/serializers.py:1423 part/serializers.py:1789
+#: order/serializers.py:544 part/serializers.py:1442 part/serializers.py:1817
#: stock/models.py:665 stock/models.py:1477 stock/serializers.py:450
msgid "Quantity must be greater than zero"
msgstr ""
-#: build/models.py:867 build/serializers.py:228
+#: build/models.py:883 build/serializers.py:228
msgid "Quantity cannot be greater than the output quantity"
msgstr ""
-#: build/models.py:924 build/serializers.py:533
+#: build/models.py:940 build/serializers.py:533
#, python-brace-format
msgid "Build output {serial} has not passed all required tests"
msgstr ""
-#: build/models.py:1286
+#: build/models.py:1302
msgid "Build object"
msgstr ""
-#: build/models.py:1300 build/models.py:1558 build/serializers.py:210
+#: build/models.py:1316 build/models.py:1574 build/serializers.py:210
#: build/serializers.py:247 build/templates/build/build_base.html:102
#: build/templates/build/detail.html:34 common/models.py:2432
#: order/models.py:1247 order/models.py:1902 order/serializers.py:1306
@@ -1310,7 +1310,7 @@ msgstr ""
#: templates/js/translated/company.js:1808
#: templates/js/translated/model_renderers.js:230
#: templates/js/translated/order.js:304 templates/js/translated/part.js:961
-#: templates/js/translated/part.js:1811 templates/js/translated/part.js:3332
+#: templates/js/translated/part.js:1811 templates/js/translated/part.js:3341
#: templates/js/translated/pricing.js:381
#: templates/js/translated/pricing.js:474
#: templates/js/translated/pricing.js:522
@@ -1330,38 +1330,38 @@ msgstr ""
msgid "Quantity"
msgstr ""
-#: build/models.py:1301
+#: build/models.py:1317
msgid "Required quantity for build order"
msgstr ""
-#: build/models.py:1381
+#: build/models.py:1397
msgid "Build item must specify a build output, as master part is marked as trackable"
msgstr ""
-#: build/models.py:1390
+#: build/models.py:1406
#, python-brace-format
msgid "Allocated quantity ({q}) must not exceed available stock quantity ({a})"
msgstr ""
-#: build/models.py:1400 order/models.py:1853
+#: build/models.py:1416 order/models.py:1853
msgid "Stock item is over-allocated"
msgstr ""
-#: build/models.py:1406 order/models.py:1856
+#: build/models.py:1422 order/models.py:1856
msgid "Allocation quantity must be greater than zero"
msgstr ""
-#: build/models.py:1412
+#: build/models.py:1428
msgid "Quantity must be 1 for serialized stock"
msgstr ""
-#: build/models.py:1473
+#: build/models.py:1489
msgid "Selected stock item does not match BOM line"
msgstr ""
-#: build/models.py:1545 build/serializers.py:811 order/serializers.py:1150
-#: order/serializers.py:1171 stock/serializers.py:544 stock/serializers.py:1019
-#: stock/serializers.py:1131 stock/templates/stock/item_base.html:10
+#: build/models.py:1561 build/serializers.py:811 order/serializers.py:1150
+#: order/serializers.py:1171 stock/serializers.py:544 stock/serializers.py:1025
+#: stock/serializers.py:1137 stock/templates/stock/item_base.html:10
#: stock/templates/stock/item_base.html:23
#: stock/templates/stock/item_base.html:194
#: templates/js/translated/build.js:1742
@@ -1376,19 +1376,19 @@ msgstr ""
msgid "Stock Item"
msgstr ""
-#: build/models.py:1546
+#: build/models.py:1562
msgid "Source stock item"
msgstr ""
-#: build/models.py:1559
+#: build/models.py:1575
msgid "Stock quantity to allocate to build"
msgstr ""
-#: build/models.py:1567
+#: build/models.py:1583
msgid "Install into"
msgstr ""
-#: build/models.py:1568
+#: build/models.py:1584
msgid "Destination stock item"
msgstr ""
@@ -1452,9 +1452,9 @@ msgid "A list of build outputs must be provided"
msgstr ""
#: build/serializers.py:426 build/serializers.py:498 order/serializers.py:533
-#: order/serializers.py:641 order/serializers.py:1646 part/serializers.py:1086
+#: order/serializers.py:641 order/serializers.py:1646 part/serializers.py:1104
#: stock/serializers.py:472 stock/serializers.py:627 stock/serializers.py:723
-#: stock/serializers.py:1163 stock/serializers.py:1419
+#: stock/serializers.py:1169 stock/serializers.py:1425
#: stock/templates/stock/item_base.html:394
#: templates/js/translated/barcode.js:547
#: templates/js/translated/barcode.js:795 templates/js/translated/build.js:999
@@ -1494,7 +1494,7 @@ msgstr ""
#: build/serializers.py:505 build/templates/build/build_base.html:151
#: build/templates/build/detail.html:62 order/models.py:910
#: order/models.py:2005 order/serializers.py:565 stock/admin.py:165
-#: stock/serializers.py:774 stock/serializers.py:1307
+#: stock/serializers.py:774 stock/serializers.py:1313
#: stock/templates/stock/item_base.html:427
#: templates/js/translated/barcode.js:252 templates/js/translated/build.js:2189
#: templates/js/translated/purchase_order.js:1308
@@ -1602,7 +1602,7 @@ msgstr ""
msgid "bom_item.part must point to the same part as the build order"
msgstr ""
-#: build/serializers.py:817 stock/serializers.py:1032
+#: build/serializers.py:817 stock/serializers.py:1038
msgid "Item must be in stock"
msgstr ""
@@ -1659,44 +1659,45 @@ msgstr ""
msgid "Allocate optional BOM items to build order"
msgstr ""
-#: build/serializers.py:1096 part/models.py:3895 part/models.py:4331
+#: build/serializers.py:1097 part/models.py:3895 part/models.py:4331
#: stock/api.py:745
msgid "BOM Item"
msgstr ""
-#: build/serializers.py:1105 templates/js/translated/index.js:130
+#: build/serializers.py:1106 templates/js/translated/index.js:130
msgid "Allocated Stock"
msgstr ""
-#: build/serializers.py:1110 part/admin.py:132 part/bom.py:173
-#: part/serializers.py:1441 part/templates/part/part_base.html:210
-#: templates/js/translated/bom.js:1202 templates/js/translated/build.js:2614
-#: templates/js/translated/part.js:709 templates/js/translated/part.js:2148
+#: build/serializers.py:1111 part/admin.py:132 part/bom.py:173
+#: part/serializers.py:798 part/serializers.py:1460
+#: part/templates/part/part_base.html:210 templates/js/translated/bom.js:1208
+#: templates/js/translated/build.js:2614 templates/js/translated/part.js:709
+#: templates/js/translated/part.js:2148
#: templates/js/translated/table_filters.js:170
msgid "On Order"
msgstr ""
-#: build/serializers.py:1115 part/serializers.py:1443
+#: build/serializers.py:1116 part/serializers.py:1462
#: templates/js/translated/build.js:2618
#: templates/js/translated/table_filters.js:360
msgid "In Production"
msgstr ""
-#: build/serializers.py:1120 part/bom.py:172 part/serializers.py:1454
+#: build/serializers.py:1121 part/bom.py:172 part/serializers.py:1473
#: part/templates/part/part_base.html:192
#: templates/js/translated/sales_order.js:1893
msgid "Available Stock"
msgstr ""
-#: build/tasks.py:149
+#: build/tasks.py:171
msgid "Stock required for build order"
msgstr ""
-#: build/tasks.py:166
+#: build/tasks.py:188
msgid "Overdue Build Order"
msgstr ""
-#: build/tasks.py:171
+#: build/tasks.py:193
#, python-brace-format
msgid "Build order {bo} is now overdue"
msgstr ""
@@ -1990,27 +1991,31 @@ msgstr ""
msgid "Order Parts"
msgstr ""
-#: build/templates/build/detail.html:210
-msgid "Incomplete Build Outputs"
-msgstr ""
-
-#: build/templates/build/detail.html:214
-msgid "Create new build output"
+#: build/templates/build/detail.html:205
+msgid "Available stock has been filtered based on specified source location for this build order"
msgstr ""
#: build/templates/build/detail.html:215
+msgid "Incomplete Build Outputs"
+msgstr ""
+
+#: build/templates/build/detail.html:219
+msgid "Create new build output"
+msgstr ""
+
+#: build/templates/build/detail.html:220
msgid "New Build Output"
msgstr ""
-#: build/templates/build/detail.html:232 build/templates/build/sidebar.html:15
+#: build/templates/build/detail.html:237 build/templates/build/sidebar.html:15
msgid "Consumed Stock"
msgstr ""
-#: build/templates/build/detail.html:244
+#: build/templates/build/detail.html:249
msgid "Completed Build Outputs"
msgstr ""
-#: build/templates/build/detail.html:256 build/templates/build/sidebar.html:19
+#: build/templates/build/detail.html:261 build/templates/build/sidebar.html:19
#: company/templates/company/detail.html:229
#: company/templates/company/manufacturer_part.html:141
#: company/templates/company/manufacturer_part_sidebar.html:9
@@ -2026,15 +2031,15 @@ msgstr ""
msgid "Attachments"
msgstr ""
-#: build/templates/build/detail.html:271
+#: build/templates/build/detail.html:276
msgid "Build Notes"
msgstr ""
-#: build/templates/build/detail.html:426
+#: build/templates/build/detail.html:434
msgid "Allocation Complete"
msgstr ""
-#: build/templates/build/detail.html:427
+#: build/templates/build/detail.html:435
msgid "All lines have been fully allocated"
msgstr ""
@@ -2436,7 +2441,7 @@ msgid "Parts are templates by default"
msgstr ""
#: common/models.py:1456 part/admin.py:91 part/admin.py:431 part/models.py:1015
-#: templates/js/translated/bom.js:1633
+#: templates/js/translated/bom.js:1639
#: templates/js/translated/table_filters.js:330
#: templates/js/translated/table_filters.js:721
msgid "Assembly"
@@ -3495,7 +3500,7 @@ msgstr ""
msgid "Price break quantity"
msgstr ""
-#: common/models.py:2440 company/serializers.py:484 order/admin.py:42
+#: common/models.py:2440 company/serializers.py:486 order/admin.py:42
#: order/models.py:1321 order/models.py:2226
#: templates/js/translated/company.js:1813 templates/js/translated/part.js:1885
#: templates/js/translated/pricing.js:621
@@ -3972,7 +3977,7 @@ msgstr ""
#: company/models.py:495 company/templates/company/company_base.html:76
#: company/templates/company/manufacturer_part.html:90
-#: company/templates/company/supplier_part.html:145 part/serializers.py:497
+#: company/templates/company/supplier_part.html:145 part/serializers.py:505
#: stock/templates/stock/item_base.html:207
#: templates/js/translated/company.js:506
#: templates/js/translated/company.js:1108
@@ -3987,7 +3992,7 @@ msgid "Select manufacturer"
msgstr ""
#: company/models.py:502 company/templates/company/manufacturer_part.html:101
-#: company/templates/company/supplier_part.html:153 part/serializers.py:507
+#: company/templates/company/supplier_part.html:153 part/serializers.py:515
#: templates/js/translated/company.js:351
#: templates/js/translated/company.js:1107
#: templates/js/translated/company.js:1302
@@ -4059,7 +4064,7 @@ msgstr ""
#: company/models.py:795 company/templates/company/company_base.html:81
#: company/templates/company/supplier_part.html:129 order/models.py:453
#: order/templates/order/order_base.html:136 part/bom.py:272 part/bom.py:310
-#: part/serializers.py:481 plugin/builtin/suppliers/digikey.py:25
+#: part/serializers.py:489 plugin/builtin/suppliers/digikey.py:25
#: plugin/builtin/suppliers/lcsc.py:26 plugin/builtin/suppliers/mouser.py:24
#: plugin/builtin/suppliers/tme.py:26 stock/templates/stock/item_base.html:224
#: templates/email/overdue_purchase_order.html:16
@@ -4076,7 +4081,7 @@ msgstr ""
msgid "Select supplier"
msgstr ""
-#: company/models.py:802 part/serializers.py:492
+#: company/models.py:802 part/serializers.py:500
msgid "Supplier stock keeping unit"
msgstr ""
@@ -4112,7 +4117,7 @@ msgid "Minimum charge (e.g. stocking fee)"
msgstr ""
#: company/models.py:851 company/templates/company/supplier_part.html:160
-#: stock/admin.py:224 stock/models.py:785 stock/serializers.py:1317
+#: stock/admin.py:224 stock/models.py:785 stock/serializers.py:1323
#: stock/templates/stock/item_base.html:240
#: templates/js/translated/company.js:1636
#: templates/js/translated/stock.js:2387
@@ -4157,7 +4162,7 @@ msgstr ""
msgid "Date of last update of availability data"
msgstr ""
-#: company/serializers.py:153
+#: company/serializers.py:155
msgid "Default currency used for this supplier"
msgstr ""
@@ -4218,7 +4223,7 @@ msgstr ""
#: company/templates/company/company_base.html:86 order/models.py:898
#: order/models.py:1993 order/templates/order/return_order_base.html:131
#: order/templates/order/sales_order_base.html:144 stock/models.py:807
-#: stock/models.py:808 stock/serializers.py:1067
+#: stock/models.py:808 stock/serializers.py:1073
#: stock/templates/stock/item_base.html:405
#: templates/email/overdue_sales_order.html:16
#: templates/js/translated/company.js:502
@@ -4429,8 +4434,9 @@ msgstr ""
#: company/templates/company/manufacturer_part.html:119
#: company/templates/company/supplier_part.html:15 company/views.py:31
-#: part/admin.py:122 part/templates/part/part_sidebar.html:33
-#: templates/InvenTree/search.html:190 templates/navbar.html:48
+#: part/admin.py:122 part/serializers.py:802
+#: part/templates/part/part_sidebar.html:33 templates/InvenTree/search.html:190
+#: templates/navbar.html:48
msgid "Suppliers"
msgstr ""
@@ -4528,7 +4534,7 @@ msgid "No supplier information available"
msgstr ""
#: company/templates/company/supplier_part.html:139 part/bom.py:279
-#: part/bom.py:311 part/serializers.py:491
+#: part/bom.py:311 part/serializers.py:499
#: templates/js/translated/company.js:349 templates/js/translated/part.js:1786
#: templates/js/translated/pricing.js:510
#: templates/js/translated/purchase_order.js:1851
@@ -4577,10 +4583,12 @@ msgstr ""
msgid "Update Part Availability"
msgstr ""
-#: company/templates/company/supplier_part_sidebar.html:5 part/stocktake.py:223
+#: company/templates/company/supplier_part_sidebar.html:5
+#: part/serializers.py:801 part/stocktake.py:223
#: part/templates/part/category.html:183
#: part/templates/part/category_sidebar.html:17 stock/admin.py:69
-#: stock/serializers.py:760 stock/templates/stock/location.html:170
+#: stock/serializers.py:760 stock/serializers.py:924
+#: stock/templates/stock/location.html:170
#: stock/templates/stock/location.html:184
#: stock/templates/stock/location.html:196
#: stock/templates/stock/location_sidebar.html:7
@@ -4640,7 +4648,7 @@ msgid "Label template file"
msgstr ""
#: label/models.py:143 part/models.py:3484 report/models.py:322
-#: templates/js/translated/part.js:2891
+#: templates/js/translated/part.js:2900
#: templates/js/translated/table_filters.js:481
msgid "Enabled"
msgstr ""
@@ -5733,7 +5741,7 @@ msgid "Pending Shipments"
msgstr ""
#: order/templates/order/sales_order_detail.html:71
-#: templates/js/translated/bom.js:1271 templates/js/translated/filters.js:296
+#: templates/js/translated/bom.js:1277 templates/js/translated/filters.js:296
msgid "Actions"
msgstr ""
@@ -5861,10 +5869,10 @@ msgstr ""
msgid "Category Path"
msgstr ""
-#: part/admin.py:323 part/models.py:390 part/serializers.py:259
-#: part/serializers.py:373 part/templates/part/cat_link.html:3
-#: part/templates/part/category.html:23 part/templates/part/category.html:141
-#: part/templates/part/category.html:161
+#: part/admin.py:323 part/models.py:390 part/serializers.py:112
+#: part/serializers.py:265 part/serializers.py:381
+#: part/templates/part/cat_link.html:3 part/templates/part/category.html:23
+#: part/templates/part/category.html:141 part/templates/part/category.html:161
#: part/templates/part/category_sidebar.html:9
#: templates/InvenTree/index.html:36 templates/InvenTree/search.html:84
#: templates/InvenTree/settings/sidebar.html:47
@@ -5889,13 +5897,13 @@ msgstr ""
msgid "Part IPN"
msgstr ""
-#: part/admin.py:421 part/serializers.py:1220
+#: part/admin.py:421 part/serializers.py:1238
#: templates/js/translated/pricing.js:358
#: templates/js/translated/pricing.js:1024
msgid "Minimum Price"
msgstr ""
-#: part/admin.py:426 part/serializers.py:1235
+#: part/admin.py:426 part/serializers.py:1253
#: templates/js/translated/pricing.js:353
#: templates/js/translated/pricing.js:1032
msgid "Maximum Price"
@@ -5974,7 +5982,7 @@ msgid "This option must be selected"
msgstr ""
#: part/api.py:1541 part/models.py:895 part/models.py:3385 part/models.py:3831
-#: part/serializers.py:388 part/serializers.py:1076
+#: part/serializers.py:396 part/serializers.py:1094
#: part/templates/part/part_base.html:260 stock/api.py:733
#: templates/InvenTree/settings/settings_staff_js.html:300
#: templates/js/translated/notification.js:60
@@ -5982,12 +5990,17 @@ msgstr ""
msgid "Category"
msgstr ""
+#: part/api.py:1828
+msgid "Uses"
+msgstr ""
+
#: part/bom.py:170 part/models.py:100 part/models.py:938
#: part/templates/part/category.html:116 part/templates/part/part_base.html:367
msgid "Default Location"
msgstr ""
-#: part/bom.py:171 templates/email/low_stock_notification.html:16
+#: part/bom.py:171 part/serializers.py:803
+#: templates/email/low_stock_notification.html:16
msgid "Total Stock"
msgstr "Цялостна наличност"
@@ -6010,7 +6023,8 @@ msgstr ""
msgid "Default location for parts in this category"
msgstr ""
-#: part/models.py:106 stock/models.py:165 templates/js/translated/stock.js:2736
+#: part/models.py:106 stock/models.py:165 templates/js/translated/part.js:2810
+#: templates/js/translated/stock.js:2736
#: templates/js/translated/table_filters.js:239
#: templates/js/translated/table_filters.js:283
msgid "Structural"
@@ -6418,7 +6432,7 @@ msgstr ""
msgid "Test with this name already exists for this part"
msgstr ""
-#: part/models.py:3464 templates/js/translated/part.js:2870
+#: part/models.py:3464 templates/js/translated/part.js:2879
msgid "Test Name"
msgstr ""
@@ -6446,7 +6460,7 @@ msgstr ""
msgid "Is this test enabled?"
msgstr ""
-#: part/models.py:3489 templates/js/translated/part.js:2899
+#: part/models.py:3489 templates/js/translated/part.js:2908
#: templates/js/translated/table_filters.js:477
msgid "Required"
msgstr ""
@@ -6455,7 +6469,7 @@ msgstr ""
msgid "Is this test required to pass?"
msgstr ""
-#: part/models.py:3495 templates/js/translated/part.js:2907
+#: part/models.py:3495 templates/js/translated/part.js:2916
msgid "Requires Value"
msgstr ""
@@ -6463,7 +6477,7 @@ msgstr ""
msgid "Does this test require a value when adding a test result?"
msgstr ""
-#: part/models.py:3501 templates/js/translated/part.js:2914
+#: part/models.py:3501 templates/js/translated/part.js:2923
msgid "Requires Attachment"
msgstr ""
@@ -6685,311 +6699,325 @@ msgstr ""
msgid "Duplicate relationship already exists"
msgstr ""
-#: part/serializers.py:128 part/templates/part/category.html:122
-#: part/templates/part/category.html:207
+#: part/serializers.py:114 part/serializers.py:134
+#: part/templates/part/category.html:122 part/templates/part/category.html:207
#: part/templates/part/category_sidebar.html:7
msgid "Subcategories"
msgstr ""
-#: part/serializers.py:172
+#: part/serializers.py:178
msgid "Results"
msgstr ""
-#: part/serializers.py:173
+#: part/serializers.py:179
msgid "Number of results recorded against this template"
msgstr ""
-#: part/serializers.py:197 part/serializers.py:215 stock/serializers.py:384
+#: part/serializers.py:203 part/serializers.py:221 stock/serializers.py:384
msgid "Purchase currency of this stock item"
msgstr ""
-#: part/serializers.py:260
+#: part/serializers.py:266
msgid "Number of parts using this template"
msgstr ""
-#: part/serializers.py:379
+#: part/serializers.py:387
msgid "No parts selected"
msgstr ""
-#: part/serializers.py:389
+#: part/serializers.py:397
msgid "Select category"
msgstr ""
-#: part/serializers.py:419
+#: part/serializers.py:427
msgid "Original Part"
msgstr ""
-#: part/serializers.py:420
+#: part/serializers.py:428
msgid "Select original part to duplicate"
msgstr ""
-#: part/serializers.py:425
+#: part/serializers.py:433
msgid "Copy Image"
msgstr ""
-#: part/serializers.py:426
+#: part/serializers.py:434
msgid "Copy image from original part"
msgstr ""
-#: part/serializers.py:432 part/templates/part/detail.html:277
+#: part/serializers.py:440 part/templates/part/detail.html:277
msgid "Copy BOM"
msgstr ""
-#: part/serializers.py:433
+#: part/serializers.py:441
msgid "Copy bill of materials from original part"
msgstr ""
-#: part/serializers.py:439
+#: part/serializers.py:447
msgid "Copy Parameters"
msgstr ""
-#: part/serializers.py:440
+#: part/serializers.py:448
msgid "Copy parameter data from original part"
msgstr ""
-#: part/serializers.py:446
+#: part/serializers.py:454
msgid "Copy Notes"
msgstr ""
-#: part/serializers.py:447
+#: part/serializers.py:455
msgid "Copy notes from original part"
msgstr ""
-#: part/serializers.py:460
+#: part/serializers.py:468
msgid "Initial Stock Quantity"
msgstr ""
-#: part/serializers.py:462
+#: part/serializers.py:470
msgid "Specify initial stock quantity for this Part. If quantity is zero, no stock is added."
msgstr ""
-#: part/serializers.py:469
+#: part/serializers.py:477
msgid "Initial Stock Location"
msgstr ""
-#: part/serializers.py:470
+#: part/serializers.py:478
msgid "Specify initial stock location for this Part"
msgstr ""
-#: part/serializers.py:482
+#: part/serializers.py:490
msgid "Select supplier (or leave blank to skip)"
msgstr ""
-#: part/serializers.py:498
+#: part/serializers.py:506
msgid "Select manufacturer (or leave blank to skip)"
msgstr ""
-#: part/serializers.py:508
+#: part/serializers.py:516
msgid "Manufacturer part number"
msgstr ""
-#: part/serializers.py:515
+#: part/serializers.py:523
msgid "Selected company is not a valid supplier"
msgstr ""
-#: part/serializers.py:524
+#: part/serializers.py:532
msgid "Selected company is not a valid manufacturer"
msgstr ""
-#: part/serializers.py:535
+#: part/serializers.py:543
msgid "Manufacturer part matching this MPN already exists"
msgstr ""
-#: part/serializers.py:542
+#: part/serializers.py:550
msgid "Supplier part matching this SKU already exists"
msgstr ""
-#: part/serializers.py:815 part/templates/part/copy_part.html:9
+#: part/serializers.py:804
+#, fuzzy
+#| msgid "Total Stock"
+msgid "External Stock"
+msgstr "Цялостна наличност"
+
+#: part/serializers.py:806
+msgid "Unallocated Stock"
+msgstr ""
+
+#: part/serializers.py:808
+msgid "Variant Stock"
+msgstr ""
+
+#: part/serializers.py:833 part/templates/part/copy_part.html:9
#: templates/js/translated/part.js:471
msgid "Duplicate Part"
msgstr ""
-#: part/serializers.py:816
+#: part/serializers.py:834
msgid "Copy initial data from another Part"
msgstr ""
-#: part/serializers.py:822 templates/js/translated/part.js:102
+#: part/serializers.py:840 templates/js/translated/part.js:102
msgid "Initial Stock"
msgstr ""
-#: part/serializers.py:823
+#: part/serializers.py:841
msgid "Create Part with initial stock quantity"
msgstr ""
-#: part/serializers.py:829
+#: part/serializers.py:847
msgid "Supplier Information"
msgstr ""
-#: part/serializers.py:830
+#: part/serializers.py:848
msgid "Add initial supplier information for this part"
msgstr ""
-#: part/serializers.py:838
+#: part/serializers.py:856
msgid "Copy Category Parameters"
msgstr ""
-#: part/serializers.py:839
+#: part/serializers.py:857
msgid "Copy parameter templates from selected part category"
msgstr ""
-#: part/serializers.py:844
+#: part/serializers.py:862
msgid "Existing Image"
msgstr ""
-#: part/serializers.py:845
+#: part/serializers.py:863
msgid "Filename of an existing part image"
msgstr ""
-#: part/serializers.py:862
+#: part/serializers.py:880
msgid "Image file does not exist"
msgstr ""
-#: part/serializers.py:1068
+#: part/serializers.py:1086
msgid "Limit stocktake report to a particular part, and any variant parts"
msgstr ""
-#: part/serializers.py:1078
+#: part/serializers.py:1096
msgid "Limit stocktake report to a particular part category, and any child categories"
msgstr ""
-#: part/serializers.py:1088
+#: part/serializers.py:1106
msgid "Limit stocktake report to a particular stock location, and any child locations"
msgstr ""
-#: part/serializers.py:1094
+#: part/serializers.py:1112
msgid "Exclude External Stock"
msgstr ""
-#: part/serializers.py:1095
+#: part/serializers.py:1113
msgid "Exclude stock items in external locations"
msgstr ""
-#: part/serializers.py:1100
+#: part/serializers.py:1118
msgid "Generate Report"
msgstr ""
-#: part/serializers.py:1101
+#: part/serializers.py:1119
msgid "Generate report file containing calculated stocktake data"
msgstr ""
-#: part/serializers.py:1106
+#: part/serializers.py:1124
msgid "Update Parts"
msgstr ""
-#: part/serializers.py:1107
+#: part/serializers.py:1125
msgid "Update specified parts with calculated stocktake data"
msgstr ""
-#: part/serializers.py:1115
+#: part/serializers.py:1133
msgid "Stocktake functionality is not enabled"
msgstr ""
-#: part/serializers.py:1221
+#: part/serializers.py:1239
msgid "Override calculated value for minimum price"
msgstr ""
-#: part/serializers.py:1228
+#: part/serializers.py:1246
msgid "Minimum price currency"
msgstr ""
-#: part/serializers.py:1236
+#: part/serializers.py:1254
msgid "Override calculated value for maximum price"
msgstr ""
-#: part/serializers.py:1243
+#: part/serializers.py:1261
msgid "Maximum price currency"
msgstr ""
-#: part/serializers.py:1272
+#: part/serializers.py:1290
msgid "Update"
msgstr ""
-#: part/serializers.py:1273
+#: part/serializers.py:1291
msgid "Update pricing for this part"
msgstr ""
-#: part/serializers.py:1296
+#: part/serializers.py:1314
#, python-brace-format
msgid "Could not convert from provided currencies to {default_currency}"
msgstr ""
-#: part/serializers.py:1303
+#: part/serializers.py:1321
msgid "Minimum price must not be greater than maximum price"
msgstr ""
-#: part/serializers.py:1306
+#: part/serializers.py:1324
msgid "Maximum price must not be less than minimum price"
msgstr ""
-#: part/serializers.py:1632
+#: part/serializers.py:1660
msgid "Select part to copy BOM from"
msgstr ""
-#: part/serializers.py:1640
+#: part/serializers.py:1668
msgid "Remove Existing Data"
msgstr ""
-#: part/serializers.py:1641
+#: part/serializers.py:1669
msgid "Remove existing BOM items before copying"
msgstr ""
-#: part/serializers.py:1646
+#: part/serializers.py:1674
msgid "Include Inherited"
msgstr ""
-#: part/serializers.py:1647
+#: part/serializers.py:1675
msgid "Include BOM items which are inherited from templated parts"
msgstr ""
-#: part/serializers.py:1652
+#: part/serializers.py:1680
msgid "Skip Invalid Rows"
msgstr ""
-#: part/serializers.py:1653
+#: part/serializers.py:1681
msgid "Enable this option to skip invalid rows"
msgstr ""
-#: part/serializers.py:1658
+#: part/serializers.py:1686
msgid "Copy Substitute Parts"
msgstr ""
-#: part/serializers.py:1659
+#: part/serializers.py:1687
msgid "Copy substitute parts when duplicate BOM items"
msgstr ""
-#: part/serializers.py:1693
+#: part/serializers.py:1721
msgid "Clear Existing BOM"
msgstr ""
-#: part/serializers.py:1694
+#: part/serializers.py:1722
msgid "Delete existing BOM items before uploading"
msgstr ""
-#: part/serializers.py:1724
+#: part/serializers.py:1752
msgid "No part column specified"
msgstr ""
-#: part/serializers.py:1768
+#: part/serializers.py:1796
msgid "Multiple matching parts found"
msgstr ""
-#: part/serializers.py:1771
+#: part/serializers.py:1799
msgid "No matching part found"
msgstr ""
-#: part/serializers.py:1774
+#: part/serializers.py:1802
msgid "Part is not designated as a component"
msgstr ""
-#: part/serializers.py:1783
+#: part/serializers.py:1811
msgid "Quantity not provided"
msgstr ""
-#: part/serializers.py:1791
+#: part/serializers.py:1819
msgid "Invalid quantity"
msgstr ""
-#: part/serializers.py:1812
+#: part/serializers.py:1840
msgid "At least one BOM item is required"
msgstr ""
@@ -7221,7 +7249,7 @@ msgid "Validate BOM"
msgstr ""
#: part/templates/part/detail.html:283 part/templates/part/detail.html:284
-#: templates/js/translated/bom.js:1314 templates/js/translated/bom.js:1315
+#: templates/js/translated/bom.js:1320 templates/js/translated/bom.js:1321
msgid "Add BOM Item"
msgstr ""
@@ -7405,7 +7433,7 @@ msgstr ""
msgid "Allocated to Sales Orders"
msgstr ""
-#: part/templates/part/part_base.html:235 templates/js/translated/bom.js:1213
+#: part/templates/part/part_base.html:235 templates/js/translated/bom.js:1219
msgid "Can Build"
msgstr ""
@@ -8784,7 +8812,7 @@ msgstr ""
msgid "Where is this stock item located?"
msgstr ""
-#: stock/models.py:786 stock/serializers.py:1318
+#: stock/models.py:786 stock/serializers.py:1324
msgid "Packaging this stock item is stored in"
msgstr ""
@@ -8796,7 +8824,7 @@ msgstr ""
msgid "Serial number for this item"
msgstr ""
-#: stock/models.py:830 stock/serializers.py:1301
+#: stock/models.py:830 stock/serializers.py:1307
msgid "Batch code for this stock item"
msgstr ""
@@ -8905,7 +8933,7 @@ msgstr ""
msgid "Serialized stock cannot be merged"
msgstr ""
-#: stock/models.py:1639 stock/serializers.py:1207
+#: stock/models.py:1639 stock/serializers.py:1213
msgid "Duplicate stock items"
msgstr ""
@@ -8986,7 +9014,7 @@ msgstr ""
msgid "Enter serial numbers for new items"
msgstr ""
-#: stock/serializers.py:473 stock/serializers.py:1164 stock/serializers.py:1420
+#: stock/serializers.py:473 stock/serializers.py:1170 stock/serializers.py:1426
msgid "Destination stock location"
msgstr ""
@@ -9059,77 +9087,78 @@ msgstr ""
msgid "No stock items selected"
msgstr ""
-#: stock/serializers.py:863 stock/templates/stock/location.html:165
+#: stock/serializers.py:863 stock/serializers.py:926
+#: stock/templates/stock/location.html:165
#: stock/templates/stock/location.html:213
#: stock/templates/stock/location_sidebar.html:5
msgid "Sublocations"
msgstr ""
-#: stock/serializers.py:1036
+#: stock/serializers.py:1042
msgid "Part must be salable"
msgstr ""
-#: stock/serializers.py:1040
+#: stock/serializers.py:1046
msgid "Item is allocated to a sales order"
msgstr ""
-#: stock/serializers.py:1044
+#: stock/serializers.py:1050
msgid "Item is allocated to a build order"
msgstr ""
-#: stock/serializers.py:1068
+#: stock/serializers.py:1074
msgid "Customer to assign stock items"
msgstr ""
-#: stock/serializers.py:1074
+#: stock/serializers.py:1080
msgid "Selected company is not a customer"
msgstr ""
-#: stock/serializers.py:1082
+#: stock/serializers.py:1088
msgid "Stock assignment notes"
msgstr ""
-#: stock/serializers.py:1092 stock/serializers.py:1346
+#: stock/serializers.py:1098 stock/serializers.py:1352
msgid "A list of stock items must be provided"
msgstr ""
-#: stock/serializers.py:1171
+#: stock/serializers.py:1177
msgid "Stock merging notes"
msgstr ""
-#: stock/serializers.py:1176
+#: stock/serializers.py:1182
msgid "Allow mismatched suppliers"
msgstr ""
-#: stock/serializers.py:1177
+#: stock/serializers.py:1183
msgid "Allow stock items with different supplier parts to be merged"
msgstr ""
-#: stock/serializers.py:1182
+#: stock/serializers.py:1188
msgid "Allow mismatched status"
msgstr ""
-#: stock/serializers.py:1183
+#: stock/serializers.py:1189
msgid "Allow stock items with different status codes to be merged"
msgstr ""
-#: stock/serializers.py:1193
+#: stock/serializers.py:1199
msgid "At least two stock items must be provided"
msgstr ""
-#: stock/serializers.py:1260
+#: stock/serializers.py:1266
msgid "No Change"
msgstr ""
-#: stock/serializers.py:1289
+#: stock/serializers.py:1295
msgid "StockItem primary key value"
msgstr ""
-#: stock/serializers.py:1308
+#: stock/serializers.py:1314
msgid "Stock item status code"
msgstr ""
-#: stock/serializers.py:1336
+#: stock/serializers.py:1342
msgid "Stock transaction notes"
msgstr ""
@@ -10662,7 +10691,7 @@ msgid "The following parts are low on required stock"
msgstr ""
#: templates/email/build_order_required_stock.html:18
-#: templates/js/translated/bom.js:1668 templates/js/translated/build.js:2557
+#: templates/js/translated/bom.js:1674 templates/js/translated/build.js:2557
msgid "Required Quantity"
msgstr ""
@@ -10676,7 +10705,7 @@ msgid "Click on the following link to view this part"
msgstr ""
#: templates/email/low_stock_notification.html:18
-#: templates/js/translated/part.js:3209
+#: templates/js/translated/part.js:3218
msgid "Minimum Quantity"
msgstr ""
@@ -11051,62 +11080,68 @@ msgstr ""
msgid "No pricing available"
msgstr ""
-#: templates/js/translated/bom.js:1182 templates/js/translated/build.js:2596
+#: templates/js/translated/bom.js:1184 templates/js/translated/build.js:2622
+#, fuzzy
+#| msgid "Total Stock"
+msgid "External stock"
+msgstr "Цялостна наличност"
+
+#: templates/js/translated/bom.js:1188 templates/js/translated/build.js:2596
#: templates/js/translated/sales_order.js:1910
msgid "No Stock Available"
msgstr ""
-#: templates/js/translated/bom.js:1187 templates/js/translated/build.js:2600
+#: templates/js/translated/bom.js:1193 templates/js/translated/build.js:2600
msgid "Includes variant and substitute stock"
msgstr ""
-#: templates/js/translated/bom.js:1189 templates/js/translated/build.js:2602
+#: templates/js/translated/bom.js:1195 templates/js/translated/build.js:2602
#: templates/js/translated/part.js:1256
#: templates/js/translated/sales_order.js:1907
msgid "Includes variant stock"
msgstr ""
-#: templates/js/translated/bom.js:1191 templates/js/translated/build.js:2604
+#: templates/js/translated/bom.js:1197 templates/js/translated/build.js:2604
msgid "Includes substitute stock"
msgstr ""
-#: templates/js/translated/bom.js:1219 templates/js/translated/build.js:2587
+#: templates/js/translated/bom.js:1225 templates/js/translated/build.js:2587
msgid "Consumable item"
msgstr ""
-#: templates/js/translated/bom.js:1279
+#: templates/js/translated/bom.js:1285
msgid "Validate BOM Item"
msgstr ""
-#: templates/js/translated/bom.js:1281
+#: templates/js/translated/bom.js:1287
msgid "This line has been validated"
msgstr ""
-#: templates/js/translated/bom.js:1283
+#: templates/js/translated/bom.js:1289
msgid "Edit substitute parts"
msgstr ""
-#: templates/js/translated/bom.js:1285 templates/js/translated/bom.js:1480
+#: templates/js/translated/bom.js:1291 templates/js/translated/bom.js:1486
msgid "Edit BOM Item"
msgstr ""
-#: templates/js/translated/bom.js:1287
+#: templates/js/translated/bom.js:1293
msgid "Delete BOM Item"
msgstr ""
-#: templates/js/translated/bom.js:1307
+#: templates/js/translated/bom.js:1313
msgid "View BOM"
msgstr ""
-#: templates/js/translated/bom.js:1391
+#: templates/js/translated/bom.js:1397
msgid "No BOM items found"
msgstr ""
-#: templates/js/translated/bom.js:1651 templates/js/translated/build.js:2486
+#: templates/js/translated/bom.js:1657 templates/js/translated/build.js:2486
msgid "Required Part"
msgstr ""
-#: templates/js/translated/bom.js:1677
+#: templates/js/translated/bom.js:1683
msgid "Inherited from parent BOM"
msgstr ""
@@ -11449,29 +11484,29 @@ msgstr ""
msgid "Sufficient stock available"
msgstr ""
-#: templates/js/translated/build.js:2643
+#: templates/js/translated/build.js:2647
msgid "Consumable Item"
msgstr ""
-#: templates/js/translated/build.js:2648
+#: templates/js/translated/build.js:2652
msgid "Tracked item"
msgstr ""
-#: templates/js/translated/build.js:2655
+#: templates/js/translated/build.js:2659
#: templates/js/translated/sales_order.js:2016
msgid "Build stock"
msgstr ""
-#: templates/js/translated/build.js:2660 templates/js/translated/stock.js:1829
+#: templates/js/translated/build.js:2664 templates/js/translated/stock.js:1829
msgid "Order stock"
msgstr ""
-#: templates/js/translated/build.js:2664
+#: templates/js/translated/build.js:2668
#: templates/js/translated/sales_order.js:2010
msgid "Allocate stock"
msgstr ""
-#: templates/js/translated/build.js:2668
+#: templates/js/translated/build.js:2672
msgid "Remove stock allocation"
msgstr ""
@@ -12313,64 +12348,64 @@ msgstr ""
msgid "Subscribed category"
msgstr ""
-#: templates/js/translated/part.js:2855
+#: templates/js/translated/part.js:2864
msgid "No test templates matching query"
msgstr ""
-#: templates/js/translated/part.js:2877 templates/js/translated/search.js:342
+#: templates/js/translated/part.js:2886 templates/js/translated/search.js:342
msgid "results"
msgstr ""
-#: templates/js/translated/part.js:2927 templates/js/translated/stock.js:1446
+#: templates/js/translated/part.js:2936 templates/js/translated/stock.js:1446
msgid "Edit test result"
msgstr ""
-#: templates/js/translated/part.js:2928 templates/js/translated/stock.js:1447
+#: templates/js/translated/part.js:2937 templates/js/translated/stock.js:1447
#: templates/js/translated/stock.js:1692
msgid "Delete test result"
msgstr ""
-#: templates/js/translated/part.js:2932
+#: templates/js/translated/part.js:2941
msgid "This test is defined for a parent part"
msgstr ""
-#: templates/js/translated/part.js:2948
+#: templates/js/translated/part.js:2957
msgid "Edit Test Result Template"
msgstr ""
-#: templates/js/translated/part.js:2962
+#: templates/js/translated/part.js:2971
msgid "Delete Test Result Template"
msgstr ""
-#: templates/js/translated/part.js:3041 templates/js/translated/part.js:3042
+#: templates/js/translated/part.js:3050 templates/js/translated/part.js:3051
msgid "No date specified"
msgstr ""
-#: templates/js/translated/part.js:3044
+#: templates/js/translated/part.js:3053
msgid "Specified date is in the past"
msgstr ""
-#: templates/js/translated/part.js:3050
+#: templates/js/translated/part.js:3059
msgid "Speculative"
msgstr ""
-#: templates/js/translated/part.js:3100
+#: templates/js/translated/part.js:3109
msgid "No scheduling information available for this part"
msgstr ""
-#: templates/js/translated/part.js:3106
+#: templates/js/translated/part.js:3115
msgid "Error fetching scheduling information for this part"
msgstr ""
-#: templates/js/translated/part.js:3202
+#: templates/js/translated/part.js:3211
msgid "Scheduled Stock Quantities"
msgstr ""
-#: templates/js/translated/part.js:3218
+#: templates/js/translated/part.js:3227
msgid "Maximum Quantity"
msgstr ""
-#: templates/js/translated/part.js:3263
+#: templates/js/translated/part.js:3272
msgid "Minimum Stock Level"
msgstr ""
@@ -14052,4 +14087,3 @@ msgstr ""
#: users/models.py:413
msgid "Permission to delete items"
msgstr ""
-
diff --git a/InvenTree/locale/cs/LC_MESSAGES/django.po b/InvenTree/locale/cs/LC_MESSAGES/django.po
index bcd0c21ed8..391b076154 100644
--- a/InvenTree/locale/cs/LC_MESSAGES/django.po
+++ b/InvenTree/locale/cs/LC_MESSAGES/django.po
@@ -2,7 +2,7 @@ msgid ""
msgstr ""
"Project-Id-Version: inventree\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2024-02-28 04:05+0000\n"
+"POT-Creation-Date: 2024-03-05 00:41+0000\n"
"PO-Revision-Date: 2024-02-28 07:23\n"
"Last-Translator: \n"
"Language-Team: Czech\n"
@@ -66,9 +66,9 @@ msgstr "Zadejte datum"
#: report/templates/report/inventree_build_order_base.html:172
#: stock/admin.py:226 stock/models.py:2335 stock/models.py:2451
#: stock/serializers.py:479 stock/serializers.py:632 stock/serializers.py:728
-#: stock/serializers.py:778 stock/serializers.py:1081 stock/serializers.py:1170
-#: stock/serializers.py:1335 stock/templates/stock/stock_sidebar.html:25
-#: templates/js/translated/barcode.js:143 templates/js/translated/bom.js:1259
+#: stock/serializers.py:778 stock/serializers.py:1087 stock/serializers.py:1176
+#: stock/serializers.py:1341 stock/templates/stock/stock_sidebar.html:25
+#: templates/js/translated/barcode.js:143 templates/js/translated/bom.js:1265
#: templates/js/translated/company.js:1674 templates/js/translated/order.js:347
#: templates/js/translated/part.js:1080
#: templates/js/translated/purchase_order.js:2201
@@ -523,7 +523,7 @@ msgstr "Název"
#: templates/js/translated/order.js:298 templates/js/translated/part.js:1238
#: templates/js/translated/part.js:1483 templates/js/translated/part.js:1621
#: templates/js/translated/part.js:1958 templates/js/translated/part.js:2355
-#: templates/js/translated/part.js:2785 templates/js/translated/part.js:2887
+#: templates/js/translated/part.js:2785 templates/js/translated/part.js:2896
#: templates/js/translated/plugin.js:80
#: templates/js/translated/purchase_order.js:1707
#: templates/js/translated/purchase_order.js:1850
@@ -678,7 +678,7 @@ msgstr "URL souboru vzdáleného obrázku"
msgid "Downloading images from remote URL is not enabled"
msgstr "Stahování obrázků ze vzdálené URL není povoleno"
-#: InvenTree/status.py:66 part/serializers.py:1120
+#: InvenTree/status.py:66 part/serializers.py:1138
msgid "Background worker check failed"
msgstr "Kontrola procesů na pozadí se nezdařila"
@@ -960,7 +960,7 @@ msgid "Tracked"
msgstr "Sledováno"
#: build/api.py:285 part/admin.py:144 templates/js/translated/build.js:1741
-#: templates/js/translated/build.js:2626
+#: templates/js/translated/build.js:2630
#: templates/js/translated/sales_order.js:1929
#: templates/js/translated/table_filters.js:571
msgid "Allocated"
@@ -1044,11 +1044,11 @@ msgstr "Příkaz sestavení pro který je toto sestavení přiděleno"
#: build/models.py:199 build/templates/build/build_base.html:97
#: build/templates/build/detail.html:29 company/models.py:1044
#: order/models.py:1389 order/models.py:1532 order/models.py:1533
-#: part/api.py:1528 part/models.py:389 part/models.py:3003 part/models.py:3147
-#: part/models.py:3291 part/models.py:3314 part/models.py:3335
-#: part/models.py:3357 part/models.py:3458 part/models.py:3754
-#: part/models.py:3885 part/models.py:3978 part/models.py:4339
-#: part/serializers.py:1066 part/serializers.py:1631
+#: part/api.py:1528 part/api.py:1820 part/models.py:389 part/models.py:3003
+#: part/models.py:3147 part/models.py:3291 part/models.py:3314
+#: part/models.py:3335 part/models.py:3357 part/models.py:3458
+#: part/models.py:3754 part/models.py:3885 part/models.py:3978
+#: part/models.py:4339 part/serializers.py:1084 part/serializers.py:1659
#: part/templates/part/part_app_base.html:8
#: part/templates/part/part_pricing.html:12
#: part/templates/part/upload_bom.html:52
@@ -1147,7 +1147,7 @@ msgid "Build status code"
msgstr "Stavový kód sestavení"
#: build/models.py:264 build/serializers.py:280 order/serializers.py:549
-#: stock/models.py:826 stock/serializers.py:1300
+#: stock/models.py:826 stock/serializers.py:1306
#: templates/js/translated/purchase_order.js:1129
msgid "Batch Code"
msgstr "Kód dávky"
@@ -1242,48 +1242,48 @@ msgstr "Kód projektu"
msgid "Project code for this build order"
msgstr "Kód projektu pro objednávku sestavení"
-#: build/models.py:559
+#: build/models.py:575
#, python-brace-format
msgid "Build order {build} has been completed"
msgstr "Příkaz k sestavení {build} byl dokončen"
-#: build/models.py:565
+#: build/models.py:581
msgid "A build order has been completed"
msgstr "Příkaz k sestavení byl dokončen"
-#: build/models.py:783 build/models.py:858
+#: build/models.py:799 build/models.py:874
msgid "No build output specified"
msgstr "Nebyl specifikováno žádný výstup sestavení"
-#: build/models.py:786
+#: build/models.py:802
msgid "Build output is already completed"
msgstr "Výstup sestavení je již dokončen"
-#: build/models.py:789
+#: build/models.py:805
msgid "Build output does not match Build Order"
msgstr "Výstup sestavení neodpovídá příkazu sestavení"
-#: build/models.py:862 build/serializers.py:223 build/serializers.py:262
+#: build/models.py:878 build/serializers.py:223 build/serializers.py:262
#: build/serializers.py:831 order/models.py:526 order/serializers.py:401
-#: order/serializers.py:544 part/serializers.py:1423 part/serializers.py:1789
+#: order/serializers.py:544 part/serializers.py:1442 part/serializers.py:1817
#: stock/models.py:665 stock/models.py:1477 stock/serializers.py:450
msgid "Quantity must be greater than zero"
msgstr "Množství musí být vyšší než nula"
-#: build/models.py:867 build/serializers.py:228
+#: build/models.py:883 build/serializers.py:228
msgid "Quantity cannot be greater than the output quantity"
msgstr "Množství nemůže být větší než výstupní množství"
-#: build/models.py:924 build/serializers.py:533
+#: build/models.py:940 build/serializers.py:533
#, python-brace-format
msgid "Build output {serial} has not passed all required tests"
msgstr ""
-#: build/models.py:1286
+#: build/models.py:1302
msgid "Build object"
msgstr "Vytvořit objekt"
-#: build/models.py:1300 build/models.py:1558 build/serializers.py:210
+#: build/models.py:1316 build/models.py:1574 build/serializers.py:210
#: build/serializers.py:247 build/templates/build/build_base.html:102
#: build/templates/build/detail.html:34 common/models.py:2432
#: order/models.py:1247 order/models.py:1902 order/serializers.py:1306
@@ -1310,7 +1310,7 @@ msgstr "Vytvořit objekt"
#: templates/js/translated/company.js:1808
#: templates/js/translated/model_renderers.js:230
#: templates/js/translated/order.js:304 templates/js/translated/part.js:961
-#: templates/js/translated/part.js:1811 templates/js/translated/part.js:3332
+#: templates/js/translated/part.js:1811 templates/js/translated/part.js:3341
#: templates/js/translated/pricing.js:381
#: templates/js/translated/pricing.js:474
#: templates/js/translated/pricing.js:522
@@ -1330,38 +1330,38 @@ msgstr "Vytvořit objekt"
msgid "Quantity"
msgstr "Množství"
-#: build/models.py:1301
+#: build/models.py:1317
msgid "Required quantity for build order"
msgstr "Vyžadované množství pro objednávku"
-#: build/models.py:1381
+#: build/models.py:1397
msgid "Build item must specify a build output, as master part is marked as trackable"
msgstr "Položka sestavení musí specifikovat výstup sestavení, protože hlavní díl je označen jako sledovatelný"
-#: build/models.py:1390
+#: build/models.py:1406
#, python-brace-format
msgid "Allocated quantity ({q}) must not exceed available stock quantity ({a})"
msgstr "Zabrané množství ({q}) nesmí překročit dostupné skladové množství ({a})"
-#: build/models.py:1400 order/models.py:1853
+#: build/models.py:1416 order/models.py:1853
msgid "Stock item is over-allocated"
msgstr "Skladová položka je nadměrně zabrána"
-#: build/models.py:1406 order/models.py:1856
+#: build/models.py:1422 order/models.py:1856
msgid "Allocation quantity must be greater than zero"
msgstr "Zabrané množství musí být větší než nula"
-#: build/models.py:1412
+#: build/models.py:1428
msgid "Quantity must be 1 for serialized stock"
msgstr "Množství musí být 1 pro zřetězený sklad"
-#: build/models.py:1473
+#: build/models.py:1489
msgid "Selected stock item does not match BOM line"
msgstr "Vybraná položka zásob neodpovídá řádku BOM"
-#: build/models.py:1545 build/serializers.py:811 order/serializers.py:1150
-#: order/serializers.py:1171 stock/serializers.py:544 stock/serializers.py:1019
-#: stock/serializers.py:1131 stock/templates/stock/item_base.html:10
+#: build/models.py:1561 build/serializers.py:811 order/serializers.py:1150
+#: order/serializers.py:1171 stock/serializers.py:544 stock/serializers.py:1025
+#: stock/serializers.py:1137 stock/templates/stock/item_base.html:10
#: stock/templates/stock/item_base.html:23
#: stock/templates/stock/item_base.html:194
#: templates/js/translated/build.js:1742
@@ -1376,19 +1376,19 @@ msgstr "Vybraná položka zásob neodpovídá řádku BOM"
msgid "Stock Item"
msgstr "Skladové položky"
-#: build/models.py:1546
+#: build/models.py:1562
msgid "Source stock item"
msgstr "Zdrojová skladová položka"
-#: build/models.py:1559
+#: build/models.py:1575
msgid "Stock quantity to allocate to build"
msgstr "Skladové množství pro sestavení"
-#: build/models.py:1567
+#: build/models.py:1583
msgid "Install into"
msgstr "Instalovat do"
-#: build/models.py:1568
+#: build/models.py:1584
msgid "Destination stock item"
msgstr ""
@@ -1452,9 +1452,9 @@ msgid "A list of build outputs must be provided"
msgstr ""
#: build/serializers.py:426 build/serializers.py:498 order/serializers.py:533
-#: order/serializers.py:641 order/serializers.py:1646 part/serializers.py:1086
+#: order/serializers.py:641 order/serializers.py:1646 part/serializers.py:1104
#: stock/serializers.py:472 stock/serializers.py:627 stock/serializers.py:723
-#: stock/serializers.py:1163 stock/serializers.py:1419
+#: stock/serializers.py:1169 stock/serializers.py:1425
#: stock/templates/stock/item_base.html:394
#: templates/js/translated/barcode.js:547
#: templates/js/translated/barcode.js:795 templates/js/translated/build.js:999
@@ -1494,7 +1494,7 @@ msgstr ""
#: build/serializers.py:505 build/templates/build/build_base.html:151
#: build/templates/build/detail.html:62 order/models.py:910
#: order/models.py:2005 order/serializers.py:565 stock/admin.py:165
-#: stock/serializers.py:774 stock/serializers.py:1307
+#: stock/serializers.py:774 stock/serializers.py:1313
#: stock/templates/stock/item_base.html:427
#: templates/js/translated/barcode.js:252 templates/js/translated/build.js:2189
#: templates/js/translated/purchase_order.js:1308
@@ -1602,7 +1602,7 @@ msgstr ""
msgid "bom_item.part must point to the same part as the build order"
msgstr ""
-#: build/serializers.py:817 stock/serializers.py:1032
+#: build/serializers.py:817 stock/serializers.py:1038
msgid "Item must be in stock"
msgstr ""
@@ -1659,44 +1659,45 @@ msgstr "Volitelné položky"
msgid "Allocate optional BOM items to build order"
msgstr ""
-#: build/serializers.py:1096 part/models.py:3895 part/models.py:4331
+#: build/serializers.py:1097 part/models.py:3895 part/models.py:4331
#: stock/api.py:745
msgid "BOM Item"
msgstr ""
-#: build/serializers.py:1105 templates/js/translated/index.js:130
+#: build/serializers.py:1106 templates/js/translated/index.js:130
msgid "Allocated Stock"
msgstr ""
-#: build/serializers.py:1110 part/admin.py:132 part/bom.py:173
-#: part/serializers.py:1441 part/templates/part/part_base.html:210
-#: templates/js/translated/bom.js:1202 templates/js/translated/build.js:2614
-#: templates/js/translated/part.js:709 templates/js/translated/part.js:2148
+#: build/serializers.py:1111 part/admin.py:132 part/bom.py:173
+#: part/serializers.py:798 part/serializers.py:1460
+#: part/templates/part/part_base.html:210 templates/js/translated/bom.js:1208
+#: templates/js/translated/build.js:2614 templates/js/translated/part.js:709
+#: templates/js/translated/part.js:2148
#: templates/js/translated/table_filters.js:170
msgid "On Order"
msgstr ""
-#: build/serializers.py:1115 part/serializers.py:1443
+#: build/serializers.py:1116 part/serializers.py:1462
#: templates/js/translated/build.js:2618
#: templates/js/translated/table_filters.js:360
msgid "In Production"
msgstr ""
-#: build/serializers.py:1120 part/bom.py:172 part/serializers.py:1454
+#: build/serializers.py:1121 part/bom.py:172 part/serializers.py:1473
#: part/templates/part/part_base.html:192
#: templates/js/translated/sales_order.js:1893
msgid "Available Stock"
msgstr ""
-#: build/tasks.py:149
+#: build/tasks.py:171
msgid "Stock required for build order"
msgstr ""
-#: build/tasks.py:166
+#: build/tasks.py:188
msgid "Overdue Build Order"
msgstr ""
-#: build/tasks.py:171
+#: build/tasks.py:193
#, python-brace-format
msgid "Build order {bo} is now overdue"
msgstr ""
@@ -1990,27 +1991,31 @@ msgstr ""
msgid "Order Parts"
msgstr ""
-#: build/templates/build/detail.html:210
-msgid "Incomplete Build Outputs"
-msgstr ""
-
-#: build/templates/build/detail.html:214
-msgid "Create new build output"
+#: build/templates/build/detail.html:205
+msgid "Available stock has been filtered based on specified source location for this build order"
msgstr ""
#: build/templates/build/detail.html:215
+msgid "Incomplete Build Outputs"
+msgstr ""
+
+#: build/templates/build/detail.html:219
+msgid "Create new build output"
+msgstr ""
+
+#: build/templates/build/detail.html:220
msgid "New Build Output"
msgstr ""
-#: build/templates/build/detail.html:232 build/templates/build/sidebar.html:15
+#: build/templates/build/detail.html:237 build/templates/build/sidebar.html:15
msgid "Consumed Stock"
msgstr ""
-#: build/templates/build/detail.html:244
+#: build/templates/build/detail.html:249
msgid "Completed Build Outputs"
msgstr ""
-#: build/templates/build/detail.html:256 build/templates/build/sidebar.html:19
+#: build/templates/build/detail.html:261 build/templates/build/sidebar.html:19
#: company/templates/company/detail.html:229
#: company/templates/company/manufacturer_part.html:141
#: company/templates/company/manufacturer_part_sidebar.html:9
@@ -2026,15 +2031,15 @@ msgstr ""
msgid "Attachments"
msgstr ""
-#: build/templates/build/detail.html:271
+#: build/templates/build/detail.html:276
msgid "Build Notes"
msgstr ""
-#: build/templates/build/detail.html:426
+#: build/templates/build/detail.html:434
msgid "Allocation Complete"
msgstr ""
-#: build/templates/build/detail.html:427
+#: build/templates/build/detail.html:435
msgid "All lines have been fully allocated"
msgstr ""
@@ -2436,7 +2441,7 @@ msgid "Parts are templates by default"
msgstr ""
#: common/models.py:1456 part/admin.py:91 part/admin.py:431 part/models.py:1015
-#: templates/js/translated/bom.js:1633
+#: templates/js/translated/bom.js:1639
#: templates/js/translated/table_filters.js:330
#: templates/js/translated/table_filters.js:721
msgid "Assembly"
@@ -3495,7 +3500,7 @@ msgstr ""
msgid "Price break quantity"
msgstr ""
-#: common/models.py:2440 company/serializers.py:484 order/admin.py:42
+#: common/models.py:2440 company/serializers.py:486 order/admin.py:42
#: order/models.py:1321 order/models.py:2226
#: templates/js/translated/company.js:1813 templates/js/translated/part.js:1885
#: templates/js/translated/pricing.js:621
@@ -3972,7 +3977,7 @@ msgstr "Zvolte díl"
#: company/models.py:495 company/templates/company/company_base.html:76
#: company/templates/company/manufacturer_part.html:90
-#: company/templates/company/supplier_part.html:145 part/serializers.py:497
+#: company/templates/company/supplier_part.html:145 part/serializers.py:505
#: stock/templates/stock/item_base.html:207
#: templates/js/translated/company.js:506
#: templates/js/translated/company.js:1108
@@ -3987,7 +3992,7 @@ msgid "Select manufacturer"
msgstr "Vyberte výrobce"
#: company/models.py:502 company/templates/company/manufacturer_part.html:101
-#: company/templates/company/supplier_part.html:153 part/serializers.py:507
+#: company/templates/company/supplier_part.html:153 part/serializers.py:515
#: templates/js/translated/company.js:351
#: templates/js/translated/company.js:1107
#: templates/js/translated/company.js:1302
@@ -4059,7 +4064,7 @@ msgstr ""
#: company/models.py:795 company/templates/company/company_base.html:81
#: company/templates/company/supplier_part.html:129 order/models.py:453
#: order/templates/order/order_base.html:136 part/bom.py:272 part/bom.py:310
-#: part/serializers.py:481 plugin/builtin/suppliers/digikey.py:25
+#: part/serializers.py:489 plugin/builtin/suppliers/digikey.py:25
#: plugin/builtin/suppliers/lcsc.py:26 plugin/builtin/suppliers/mouser.py:24
#: plugin/builtin/suppliers/tme.py:26 stock/templates/stock/item_base.html:224
#: templates/email/overdue_purchase_order.html:16
@@ -4076,7 +4081,7 @@ msgstr ""
msgid "Select supplier"
msgstr ""
-#: company/models.py:802 part/serializers.py:492
+#: company/models.py:802 part/serializers.py:500
msgid "Supplier stock keeping unit"
msgstr ""
@@ -4112,7 +4117,7 @@ msgid "Minimum charge (e.g. stocking fee)"
msgstr ""
#: company/models.py:851 company/templates/company/supplier_part.html:160
-#: stock/admin.py:224 stock/models.py:785 stock/serializers.py:1317
+#: stock/admin.py:224 stock/models.py:785 stock/serializers.py:1323
#: stock/templates/stock/item_base.html:240
#: templates/js/translated/company.js:1636
#: templates/js/translated/stock.js:2387
@@ -4157,7 +4162,7 @@ msgstr ""
msgid "Date of last update of availability data"
msgstr ""
-#: company/serializers.py:153
+#: company/serializers.py:155
msgid "Default currency used for this supplier"
msgstr ""
@@ -4218,7 +4223,7 @@ msgstr "Smazat obrázek"
#: company/templates/company/company_base.html:86 order/models.py:898
#: order/models.py:1993 order/templates/order/return_order_base.html:131
#: order/templates/order/sales_order_base.html:144 stock/models.py:807
-#: stock/models.py:808 stock/serializers.py:1067
+#: stock/models.py:808 stock/serializers.py:1073
#: stock/templates/stock/item_base.html:405
#: templates/email/overdue_sales_order.html:16
#: templates/js/translated/company.js:502
@@ -4429,8 +4434,9 @@ msgstr ""
#: company/templates/company/manufacturer_part.html:119
#: company/templates/company/supplier_part.html:15 company/views.py:31
-#: part/admin.py:122 part/templates/part/part_sidebar.html:33
-#: templates/InvenTree/search.html:190 templates/navbar.html:48
+#: part/admin.py:122 part/serializers.py:802
+#: part/templates/part/part_sidebar.html:33 templates/InvenTree/search.html:190
+#: templates/navbar.html:48
msgid "Suppliers"
msgstr ""
@@ -4528,7 +4534,7 @@ msgid "No supplier information available"
msgstr ""
#: company/templates/company/supplier_part.html:139 part/bom.py:279
-#: part/bom.py:311 part/serializers.py:491
+#: part/bom.py:311 part/serializers.py:499
#: templates/js/translated/company.js:349 templates/js/translated/part.js:1786
#: templates/js/translated/pricing.js:510
#: templates/js/translated/purchase_order.js:1851
@@ -4577,10 +4583,12 @@ msgstr ""
msgid "Update Part Availability"
msgstr ""
-#: company/templates/company/supplier_part_sidebar.html:5 part/stocktake.py:223
+#: company/templates/company/supplier_part_sidebar.html:5
+#: part/serializers.py:801 part/stocktake.py:223
#: part/templates/part/category.html:183
#: part/templates/part/category_sidebar.html:17 stock/admin.py:69
-#: stock/serializers.py:760 stock/templates/stock/location.html:170
+#: stock/serializers.py:760 stock/serializers.py:924
+#: stock/templates/stock/location.html:170
#: stock/templates/stock/location.html:184
#: stock/templates/stock/location.html:196
#: stock/templates/stock/location_sidebar.html:7
@@ -4640,7 +4648,7 @@ msgid "Label template file"
msgstr ""
#: label/models.py:143 part/models.py:3484 report/models.py:322
-#: templates/js/translated/part.js:2891
+#: templates/js/translated/part.js:2900
#: templates/js/translated/table_filters.js:481
msgid "Enabled"
msgstr ""
@@ -5733,7 +5741,7 @@ msgid "Pending Shipments"
msgstr ""
#: order/templates/order/sales_order_detail.html:71
-#: templates/js/translated/bom.js:1271 templates/js/translated/filters.js:296
+#: templates/js/translated/bom.js:1277 templates/js/translated/filters.js:296
msgid "Actions"
msgstr ""
@@ -5861,10 +5869,10 @@ msgstr ""
msgid "Category Path"
msgstr ""
-#: part/admin.py:323 part/models.py:390 part/serializers.py:259
-#: part/serializers.py:373 part/templates/part/cat_link.html:3
-#: part/templates/part/category.html:23 part/templates/part/category.html:141
-#: part/templates/part/category.html:161
+#: part/admin.py:323 part/models.py:390 part/serializers.py:112
+#: part/serializers.py:265 part/serializers.py:381
+#: part/templates/part/cat_link.html:3 part/templates/part/category.html:23
+#: part/templates/part/category.html:141 part/templates/part/category.html:161
#: part/templates/part/category_sidebar.html:9
#: templates/InvenTree/index.html:36 templates/InvenTree/search.html:84
#: templates/InvenTree/settings/sidebar.html:47
@@ -5889,13 +5897,13 @@ msgstr ""
msgid "Part IPN"
msgstr ""
-#: part/admin.py:421 part/serializers.py:1220
+#: part/admin.py:421 part/serializers.py:1238
#: templates/js/translated/pricing.js:358
#: templates/js/translated/pricing.js:1024
msgid "Minimum Price"
msgstr ""
-#: part/admin.py:426 part/serializers.py:1235
+#: part/admin.py:426 part/serializers.py:1253
#: templates/js/translated/pricing.js:353
#: templates/js/translated/pricing.js:1032
msgid "Maximum Price"
@@ -5974,7 +5982,7 @@ msgid "This option must be selected"
msgstr ""
#: part/api.py:1541 part/models.py:895 part/models.py:3385 part/models.py:3831
-#: part/serializers.py:388 part/serializers.py:1076
+#: part/serializers.py:396 part/serializers.py:1094
#: part/templates/part/part_base.html:260 stock/api.py:733
#: templates/InvenTree/settings/settings_staff_js.html:300
#: templates/js/translated/notification.js:60
@@ -5982,12 +5990,17 @@ msgstr ""
msgid "Category"
msgstr ""
+#: part/api.py:1828
+msgid "Uses"
+msgstr ""
+
#: part/bom.py:170 part/models.py:100 part/models.py:938
#: part/templates/part/category.html:116 part/templates/part/part_base.html:367
msgid "Default Location"
msgstr ""
-#: part/bom.py:171 templates/email/low_stock_notification.html:16
+#: part/bom.py:171 part/serializers.py:803
+#: templates/email/low_stock_notification.html:16
msgid "Total Stock"
msgstr ""
@@ -6010,7 +6023,8 @@ msgstr ""
msgid "Default location for parts in this category"
msgstr ""
-#: part/models.py:106 stock/models.py:165 templates/js/translated/stock.js:2736
+#: part/models.py:106 stock/models.py:165 templates/js/translated/part.js:2810
+#: templates/js/translated/stock.js:2736
#: templates/js/translated/table_filters.js:239
#: templates/js/translated/table_filters.js:283
msgid "Structural"
@@ -6418,7 +6432,7 @@ msgstr ""
msgid "Test with this name already exists for this part"
msgstr ""
-#: part/models.py:3464 templates/js/translated/part.js:2870
+#: part/models.py:3464 templates/js/translated/part.js:2879
msgid "Test Name"
msgstr ""
@@ -6446,7 +6460,7 @@ msgstr ""
msgid "Is this test enabled?"
msgstr ""
-#: part/models.py:3489 templates/js/translated/part.js:2899
+#: part/models.py:3489 templates/js/translated/part.js:2908
#: templates/js/translated/table_filters.js:477
msgid "Required"
msgstr ""
@@ -6455,7 +6469,7 @@ msgstr ""
msgid "Is this test required to pass?"
msgstr ""
-#: part/models.py:3495 templates/js/translated/part.js:2907
+#: part/models.py:3495 templates/js/translated/part.js:2916
msgid "Requires Value"
msgstr ""
@@ -6463,7 +6477,7 @@ msgstr ""
msgid "Does this test require a value when adding a test result?"
msgstr ""
-#: part/models.py:3501 templates/js/translated/part.js:2914
+#: part/models.py:3501 templates/js/translated/part.js:2923
msgid "Requires Attachment"
msgstr ""
@@ -6685,311 +6699,327 @@ msgstr ""
msgid "Duplicate relationship already exists"
msgstr ""
-#: part/serializers.py:128 part/templates/part/category.html:122
-#: part/templates/part/category.html:207
+#: part/serializers.py:114 part/serializers.py:134
+#: part/templates/part/category.html:122 part/templates/part/category.html:207
#: part/templates/part/category_sidebar.html:7
msgid "Subcategories"
msgstr ""
-#: part/serializers.py:172
+#: part/serializers.py:178
msgid "Results"
msgstr ""
-#: part/serializers.py:173
+#: part/serializers.py:179
msgid "Number of results recorded against this template"
msgstr ""
-#: part/serializers.py:197 part/serializers.py:215 stock/serializers.py:384
+#: part/serializers.py:203 part/serializers.py:221 stock/serializers.py:384
msgid "Purchase currency of this stock item"
msgstr ""
-#: part/serializers.py:260
+#: part/serializers.py:266
msgid "Number of parts using this template"
msgstr ""
-#: part/serializers.py:379
+#: part/serializers.py:387
msgid "No parts selected"
msgstr ""
-#: part/serializers.py:389
+#: part/serializers.py:397
msgid "Select category"
msgstr ""
-#: part/serializers.py:419
+#: part/serializers.py:427
msgid "Original Part"
msgstr ""
-#: part/serializers.py:420
+#: part/serializers.py:428
msgid "Select original part to duplicate"
msgstr ""
-#: part/serializers.py:425
+#: part/serializers.py:433
msgid "Copy Image"
msgstr ""
-#: part/serializers.py:426
+#: part/serializers.py:434
msgid "Copy image from original part"
msgstr ""
-#: part/serializers.py:432 part/templates/part/detail.html:277
+#: part/serializers.py:440 part/templates/part/detail.html:277
msgid "Copy BOM"
msgstr ""
-#: part/serializers.py:433
+#: part/serializers.py:441
msgid "Copy bill of materials from original part"
msgstr ""
-#: part/serializers.py:439
+#: part/serializers.py:447
msgid "Copy Parameters"
msgstr ""
-#: part/serializers.py:440
+#: part/serializers.py:448
msgid "Copy parameter data from original part"
msgstr ""
-#: part/serializers.py:446
+#: part/serializers.py:454
msgid "Copy Notes"
msgstr ""
-#: part/serializers.py:447
+#: part/serializers.py:455
msgid "Copy notes from original part"
msgstr ""
-#: part/serializers.py:460
+#: part/serializers.py:468
msgid "Initial Stock Quantity"
msgstr ""
-#: part/serializers.py:462
+#: part/serializers.py:470
msgid "Specify initial stock quantity for this Part. If quantity is zero, no stock is added."
msgstr ""
-#: part/serializers.py:469
+#: part/serializers.py:477
msgid "Initial Stock Location"
msgstr ""
-#: part/serializers.py:470
+#: part/serializers.py:478
msgid "Specify initial stock location for this Part"
msgstr ""
-#: part/serializers.py:482
+#: part/serializers.py:490
msgid "Select supplier (or leave blank to skip)"
msgstr ""
-#: part/serializers.py:498
+#: part/serializers.py:506
msgid "Select manufacturer (or leave blank to skip)"
msgstr ""
-#: part/serializers.py:508
+#: part/serializers.py:516
msgid "Manufacturer part number"
msgstr ""
-#: part/serializers.py:515
+#: part/serializers.py:523
msgid "Selected company is not a valid supplier"
msgstr ""
-#: part/serializers.py:524
+#: part/serializers.py:532
msgid "Selected company is not a valid manufacturer"
msgstr ""
-#: part/serializers.py:535
+#: part/serializers.py:543
msgid "Manufacturer part matching this MPN already exists"
msgstr ""
-#: part/serializers.py:542
+#: part/serializers.py:550
msgid "Supplier part matching this SKU already exists"
msgstr ""
-#: part/serializers.py:815 part/templates/part/copy_part.html:9
+#: part/serializers.py:804
+#, fuzzy
+#| msgid "External Link"
+msgid "External Stock"
+msgstr "Externí odkaz"
+
+#: part/serializers.py:806
+#, fuzzy
+#| msgid "Allocated"
+msgid "Unallocated Stock"
+msgstr "Přiděleno"
+
+#: part/serializers.py:808
+msgid "Variant Stock"
+msgstr ""
+
+#: part/serializers.py:833 part/templates/part/copy_part.html:9
#: templates/js/translated/part.js:471
msgid "Duplicate Part"
msgstr ""
-#: part/serializers.py:816
+#: part/serializers.py:834
msgid "Copy initial data from another Part"
msgstr ""
-#: part/serializers.py:822 templates/js/translated/part.js:102
+#: part/serializers.py:840 templates/js/translated/part.js:102
msgid "Initial Stock"
msgstr ""
-#: part/serializers.py:823
+#: part/serializers.py:841
msgid "Create Part with initial stock quantity"
msgstr ""
-#: part/serializers.py:829
+#: part/serializers.py:847
msgid "Supplier Information"
msgstr ""
-#: part/serializers.py:830
+#: part/serializers.py:848
msgid "Add initial supplier information for this part"
msgstr ""
-#: part/serializers.py:838
+#: part/serializers.py:856
msgid "Copy Category Parameters"
msgstr ""
-#: part/serializers.py:839
+#: part/serializers.py:857
msgid "Copy parameter templates from selected part category"
msgstr ""
-#: part/serializers.py:844
+#: part/serializers.py:862
msgid "Existing Image"
msgstr ""
-#: part/serializers.py:845
+#: part/serializers.py:863
msgid "Filename of an existing part image"
msgstr ""
-#: part/serializers.py:862
+#: part/serializers.py:880
msgid "Image file does not exist"
msgstr ""
-#: part/serializers.py:1068
+#: part/serializers.py:1086
msgid "Limit stocktake report to a particular part, and any variant parts"
msgstr ""
-#: part/serializers.py:1078
+#: part/serializers.py:1096
msgid "Limit stocktake report to a particular part category, and any child categories"
msgstr ""
-#: part/serializers.py:1088
+#: part/serializers.py:1106
msgid "Limit stocktake report to a particular stock location, and any child locations"
msgstr ""
-#: part/serializers.py:1094
+#: part/serializers.py:1112
msgid "Exclude External Stock"
msgstr ""
-#: part/serializers.py:1095
+#: part/serializers.py:1113
msgid "Exclude stock items in external locations"
msgstr ""
-#: part/serializers.py:1100
+#: part/serializers.py:1118
msgid "Generate Report"
msgstr ""
-#: part/serializers.py:1101
+#: part/serializers.py:1119
msgid "Generate report file containing calculated stocktake data"
msgstr ""
-#: part/serializers.py:1106
+#: part/serializers.py:1124
msgid "Update Parts"
msgstr ""
-#: part/serializers.py:1107
+#: part/serializers.py:1125
msgid "Update specified parts with calculated stocktake data"
msgstr ""
-#: part/serializers.py:1115
+#: part/serializers.py:1133
msgid "Stocktake functionality is not enabled"
msgstr ""
-#: part/serializers.py:1221
+#: part/serializers.py:1239
msgid "Override calculated value for minimum price"
msgstr ""
-#: part/serializers.py:1228
+#: part/serializers.py:1246
msgid "Minimum price currency"
msgstr ""
-#: part/serializers.py:1236
+#: part/serializers.py:1254
msgid "Override calculated value for maximum price"
msgstr ""
-#: part/serializers.py:1243
+#: part/serializers.py:1261
msgid "Maximum price currency"
msgstr ""
-#: part/serializers.py:1272
+#: part/serializers.py:1290
msgid "Update"
msgstr ""
-#: part/serializers.py:1273
+#: part/serializers.py:1291
msgid "Update pricing for this part"
msgstr ""
-#: part/serializers.py:1296
+#: part/serializers.py:1314
#, python-brace-format
msgid "Could not convert from provided currencies to {default_currency}"
msgstr ""
-#: part/serializers.py:1303
+#: part/serializers.py:1321
msgid "Minimum price must not be greater than maximum price"
msgstr ""
-#: part/serializers.py:1306
+#: part/serializers.py:1324
msgid "Maximum price must not be less than minimum price"
msgstr ""
-#: part/serializers.py:1632
+#: part/serializers.py:1660
msgid "Select part to copy BOM from"
msgstr ""
-#: part/serializers.py:1640
+#: part/serializers.py:1668
msgid "Remove Existing Data"
msgstr ""
-#: part/serializers.py:1641
+#: part/serializers.py:1669
msgid "Remove existing BOM items before copying"
msgstr ""
-#: part/serializers.py:1646
+#: part/serializers.py:1674
msgid "Include Inherited"
msgstr ""
-#: part/serializers.py:1647
+#: part/serializers.py:1675
msgid "Include BOM items which are inherited from templated parts"
msgstr ""
-#: part/serializers.py:1652
+#: part/serializers.py:1680
msgid "Skip Invalid Rows"
msgstr ""
-#: part/serializers.py:1653
+#: part/serializers.py:1681
msgid "Enable this option to skip invalid rows"
msgstr ""
-#: part/serializers.py:1658
+#: part/serializers.py:1686
msgid "Copy Substitute Parts"
msgstr ""
-#: part/serializers.py:1659
+#: part/serializers.py:1687
msgid "Copy substitute parts when duplicate BOM items"
msgstr ""
-#: part/serializers.py:1693
+#: part/serializers.py:1721
msgid "Clear Existing BOM"
msgstr ""
-#: part/serializers.py:1694
+#: part/serializers.py:1722
msgid "Delete existing BOM items before uploading"
msgstr ""
-#: part/serializers.py:1724
+#: part/serializers.py:1752
msgid "No part column specified"
msgstr ""
-#: part/serializers.py:1768
+#: part/serializers.py:1796
msgid "Multiple matching parts found"
msgstr ""
-#: part/serializers.py:1771
+#: part/serializers.py:1799
msgid "No matching part found"
msgstr ""
-#: part/serializers.py:1774
+#: part/serializers.py:1802
msgid "Part is not designated as a component"
msgstr ""
-#: part/serializers.py:1783
+#: part/serializers.py:1811
msgid "Quantity not provided"
msgstr ""
-#: part/serializers.py:1791
+#: part/serializers.py:1819
msgid "Invalid quantity"
msgstr ""
-#: part/serializers.py:1812
+#: part/serializers.py:1840
msgid "At least one BOM item is required"
msgstr ""
@@ -7221,7 +7251,7 @@ msgid "Validate BOM"
msgstr ""
#: part/templates/part/detail.html:283 part/templates/part/detail.html:284
-#: templates/js/translated/bom.js:1314 templates/js/translated/bom.js:1315
+#: templates/js/translated/bom.js:1320 templates/js/translated/bom.js:1321
msgid "Add BOM Item"
msgstr ""
@@ -7405,7 +7435,7 @@ msgstr ""
msgid "Allocated to Sales Orders"
msgstr ""
-#: part/templates/part/part_base.html:235 templates/js/translated/bom.js:1213
+#: part/templates/part/part_base.html:235 templates/js/translated/bom.js:1219
msgid "Can Build"
msgstr ""
@@ -8784,7 +8814,7 @@ msgstr ""
msgid "Where is this stock item located?"
msgstr ""
-#: stock/models.py:786 stock/serializers.py:1318
+#: stock/models.py:786 stock/serializers.py:1324
msgid "Packaging this stock item is stored in"
msgstr ""
@@ -8796,7 +8826,7 @@ msgstr ""
msgid "Serial number for this item"
msgstr ""
-#: stock/models.py:830 stock/serializers.py:1301
+#: stock/models.py:830 stock/serializers.py:1307
msgid "Batch code for this stock item"
msgstr ""
@@ -8905,7 +8935,7 @@ msgstr ""
msgid "Serialized stock cannot be merged"
msgstr ""
-#: stock/models.py:1639 stock/serializers.py:1207
+#: stock/models.py:1639 stock/serializers.py:1213
msgid "Duplicate stock items"
msgstr ""
@@ -8986,7 +9016,7 @@ msgstr ""
msgid "Enter serial numbers for new items"
msgstr ""
-#: stock/serializers.py:473 stock/serializers.py:1164 stock/serializers.py:1420
+#: stock/serializers.py:473 stock/serializers.py:1170 stock/serializers.py:1426
msgid "Destination stock location"
msgstr ""
@@ -9059,77 +9089,78 @@ msgstr ""
msgid "No stock items selected"
msgstr ""
-#: stock/serializers.py:863 stock/templates/stock/location.html:165
+#: stock/serializers.py:863 stock/serializers.py:926
+#: stock/templates/stock/location.html:165
#: stock/templates/stock/location.html:213
#: stock/templates/stock/location_sidebar.html:5
msgid "Sublocations"
msgstr ""
-#: stock/serializers.py:1036
+#: stock/serializers.py:1042
msgid "Part must be salable"
msgstr ""
-#: stock/serializers.py:1040
+#: stock/serializers.py:1046
msgid "Item is allocated to a sales order"
msgstr ""
-#: stock/serializers.py:1044
+#: stock/serializers.py:1050
msgid "Item is allocated to a build order"
msgstr ""
-#: stock/serializers.py:1068
+#: stock/serializers.py:1074
msgid "Customer to assign stock items"
msgstr ""
-#: stock/serializers.py:1074
+#: stock/serializers.py:1080
msgid "Selected company is not a customer"
msgstr ""
-#: stock/serializers.py:1082
+#: stock/serializers.py:1088
msgid "Stock assignment notes"
msgstr ""
-#: stock/serializers.py:1092 stock/serializers.py:1346
+#: stock/serializers.py:1098 stock/serializers.py:1352
msgid "A list of stock items must be provided"
msgstr ""
-#: stock/serializers.py:1171
+#: stock/serializers.py:1177
msgid "Stock merging notes"
msgstr ""
-#: stock/serializers.py:1176
+#: stock/serializers.py:1182
msgid "Allow mismatched suppliers"
msgstr ""
-#: stock/serializers.py:1177
+#: stock/serializers.py:1183
msgid "Allow stock items with different supplier parts to be merged"
msgstr ""
-#: stock/serializers.py:1182
+#: stock/serializers.py:1188
msgid "Allow mismatched status"
msgstr ""
-#: stock/serializers.py:1183
+#: stock/serializers.py:1189
msgid "Allow stock items with different status codes to be merged"
msgstr ""
-#: stock/serializers.py:1193
+#: stock/serializers.py:1199
msgid "At least two stock items must be provided"
msgstr ""
-#: stock/serializers.py:1260
+#: stock/serializers.py:1266
msgid "No Change"
msgstr ""
-#: stock/serializers.py:1289
+#: stock/serializers.py:1295
msgid "StockItem primary key value"
msgstr ""
-#: stock/serializers.py:1308
+#: stock/serializers.py:1314
msgid "Stock item status code"
msgstr ""
-#: stock/serializers.py:1336
+#: stock/serializers.py:1342
msgid "Stock transaction notes"
msgstr ""
@@ -10662,7 +10693,7 @@ msgid "The following parts are low on required stock"
msgstr ""
#: templates/email/build_order_required_stock.html:18
-#: templates/js/translated/bom.js:1668 templates/js/translated/build.js:2557
+#: templates/js/translated/bom.js:1674 templates/js/translated/build.js:2557
msgid "Required Quantity"
msgstr ""
@@ -10676,7 +10707,7 @@ msgid "Click on the following link to view this part"
msgstr ""
#: templates/email/low_stock_notification.html:18
-#: templates/js/translated/part.js:3209
+#: templates/js/translated/part.js:3218
msgid "Minimum Quantity"
msgstr ""
@@ -11051,62 +11082,68 @@ msgstr ""
msgid "No pricing available"
msgstr ""
-#: templates/js/translated/bom.js:1182 templates/js/translated/build.js:2596
+#: templates/js/translated/bom.js:1184 templates/js/translated/build.js:2622
+#, fuzzy
+#| msgid "External Link"
+msgid "External stock"
+msgstr "Externí odkaz"
+
+#: templates/js/translated/bom.js:1188 templates/js/translated/build.js:2596
#: templates/js/translated/sales_order.js:1910
msgid "No Stock Available"
msgstr ""
-#: templates/js/translated/bom.js:1187 templates/js/translated/build.js:2600
+#: templates/js/translated/bom.js:1193 templates/js/translated/build.js:2600
msgid "Includes variant and substitute stock"
msgstr ""
-#: templates/js/translated/bom.js:1189 templates/js/translated/build.js:2602
+#: templates/js/translated/bom.js:1195 templates/js/translated/build.js:2602
#: templates/js/translated/part.js:1256
#: templates/js/translated/sales_order.js:1907
msgid "Includes variant stock"
msgstr ""
-#: templates/js/translated/bom.js:1191 templates/js/translated/build.js:2604
+#: templates/js/translated/bom.js:1197 templates/js/translated/build.js:2604
msgid "Includes substitute stock"
msgstr ""
-#: templates/js/translated/bom.js:1219 templates/js/translated/build.js:2587
+#: templates/js/translated/bom.js:1225 templates/js/translated/build.js:2587
msgid "Consumable item"
msgstr ""
-#: templates/js/translated/bom.js:1279
+#: templates/js/translated/bom.js:1285
msgid "Validate BOM Item"
msgstr ""
-#: templates/js/translated/bom.js:1281
+#: templates/js/translated/bom.js:1287
msgid "This line has been validated"
msgstr ""
-#: templates/js/translated/bom.js:1283
+#: templates/js/translated/bom.js:1289
msgid "Edit substitute parts"
msgstr ""
-#: templates/js/translated/bom.js:1285 templates/js/translated/bom.js:1480
+#: templates/js/translated/bom.js:1291 templates/js/translated/bom.js:1486
msgid "Edit BOM Item"
msgstr ""
-#: templates/js/translated/bom.js:1287
+#: templates/js/translated/bom.js:1293
msgid "Delete BOM Item"
msgstr ""
-#: templates/js/translated/bom.js:1307
+#: templates/js/translated/bom.js:1313
msgid "View BOM"
msgstr ""
-#: templates/js/translated/bom.js:1391
+#: templates/js/translated/bom.js:1397
msgid "No BOM items found"
msgstr ""
-#: templates/js/translated/bom.js:1651 templates/js/translated/build.js:2486
+#: templates/js/translated/bom.js:1657 templates/js/translated/build.js:2486
msgid "Required Part"
msgstr ""
-#: templates/js/translated/bom.js:1677
+#: templates/js/translated/bom.js:1683
msgid "Inherited from parent BOM"
msgstr ""
@@ -11449,29 +11486,29 @@ msgstr ""
msgid "Sufficient stock available"
msgstr ""
-#: templates/js/translated/build.js:2643
+#: templates/js/translated/build.js:2647
msgid "Consumable Item"
msgstr ""
-#: templates/js/translated/build.js:2648
+#: templates/js/translated/build.js:2652
msgid "Tracked item"
msgstr ""
-#: templates/js/translated/build.js:2655
+#: templates/js/translated/build.js:2659
#: templates/js/translated/sales_order.js:2016
msgid "Build stock"
msgstr ""
-#: templates/js/translated/build.js:2660 templates/js/translated/stock.js:1829
+#: templates/js/translated/build.js:2664 templates/js/translated/stock.js:1829
msgid "Order stock"
msgstr ""
-#: templates/js/translated/build.js:2664
+#: templates/js/translated/build.js:2668
#: templates/js/translated/sales_order.js:2010
msgid "Allocate stock"
msgstr ""
-#: templates/js/translated/build.js:2668
+#: templates/js/translated/build.js:2672
msgid "Remove stock allocation"
msgstr ""
@@ -12313,64 +12350,64 @@ msgstr ""
msgid "Subscribed category"
msgstr ""
-#: templates/js/translated/part.js:2855
+#: templates/js/translated/part.js:2864
msgid "No test templates matching query"
msgstr ""
-#: templates/js/translated/part.js:2877 templates/js/translated/search.js:342
+#: templates/js/translated/part.js:2886 templates/js/translated/search.js:342
msgid "results"
msgstr ""
-#: templates/js/translated/part.js:2927 templates/js/translated/stock.js:1446
+#: templates/js/translated/part.js:2936 templates/js/translated/stock.js:1446
msgid "Edit test result"
msgstr ""
-#: templates/js/translated/part.js:2928 templates/js/translated/stock.js:1447
+#: templates/js/translated/part.js:2937 templates/js/translated/stock.js:1447
#: templates/js/translated/stock.js:1692
msgid "Delete test result"
msgstr ""
-#: templates/js/translated/part.js:2932
+#: templates/js/translated/part.js:2941
msgid "This test is defined for a parent part"
msgstr ""
-#: templates/js/translated/part.js:2948
+#: templates/js/translated/part.js:2957
msgid "Edit Test Result Template"
msgstr ""
-#: templates/js/translated/part.js:2962
+#: templates/js/translated/part.js:2971
msgid "Delete Test Result Template"
msgstr ""
-#: templates/js/translated/part.js:3041 templates/js/translated/part.js:3042
+#: templates/js/translated/part.js:3050 templates/js/translated/part.js:3051
msgid "No date specified"
msgstr ""
-#: templates/js/translated/part.js:3044
+#: templates/js/translated/part.js:3053
msgid "Specified date is in the past"
msgstr ""
-#: templates/js/translated/part.js:3050
+#: templates/js/translated/part.js:3059
msgid "Speculative"
msgstr ""
-#: templates/js/translated/part.js:3100
+#: templates/js/translated/part.js:3109
msgid "No scheduling information available for this part"
msgstr ""
-#: templates/js/translated/part.js:3106
+#: templates/js/translated/part.js:3115
msgid "Error fetching scheduling information for this part"
msgstr ""
-#: templates/js/translated/part.js:3202
+#: templates/js/translated/part.js:3211
msgid "Scheduled Stock Quantities"
msgstr ""
-#: templates/js/translated/part.js:3218
+#: templates/js/translated/part.js:3227
msgid "Maximum Quantity"
msgstr ""
-#: templates/js/translated/part.js:3263
+#: templates/js/translated/part.js:3272
msgid "Minimum Stock Level"
msgstr ""
@@ -14052,4 +14089,3 @@ msgstr "Oprávnění k úpravě položek"
#: users/models.py:413
msgid "Permission to delete items"
msgstr "Oprávnění k odstranění položek"
-
diff --git a/InvenTree/locale/da/LC_MESSAGES/django.po b/InvenTree/locale/da/LC_MESSAGES/django.po
index fdce570ffb..86b13dc4a1 100644
--- a/InvenTree/locale/da/LC_MESSAGES/django.po
+++ b/InvenTree/locale/da/LC_MESSAGES/django.po
@@ -2,7 +2,7 @@ msgid ""
msgstr ""
"Project-Id-Version: inventree\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2024-02-28 04:05+0000\n"
+"POT-Creation-Date: 2024-03-05 00:41+0000\n"
"PO-Revision-Date: 2024-02-28 07:23\n"
"Last-Translator: \n"
"Language-Team: Danish\n"
@@ -66,9 +66,9 @@ msgstr "Angiv dato"
#: report/templates/report/inventree_build_order_base.html:172
#: stock/admin.py:226 stock/models.py:2335 stock/models.py:2451
#: stock/serializers.py:479 stock/serializers.py:632 stock/serializers.py:728
-#: stock/serializers.py:778 stock/serializers.py:1081 stock/serializers.py:1170
-#: stock/serializers.py:1335 stock/templates/stock/stock_sidebar.html:25
-#: templates/js/translated/barcode.js:143 templates/js/translated/bom.js:1259
+#: stock/serializers.py:778 stock/serializers.py:1087 stock/serializers.py:1176
+#: stock/serializers.py:1341 stock/templates/stock/stock_sidebar.html:25
+#: templates/js/translated/barcode.js:143 templates/js/translated/bom.js:1265
#: templates/js/translated/company.js:1674 templates/js/translated/order.js:347
#: templates/js/translated/part.js:1080
#: templates/js/translated/purchase_order.js:2201
@@ -523,7 +523,7 @@ msgstr "Navn"
#: templates/js/translated/order.js:298 templates/js/translated/part.js:1238
#: templates/js/translated/part.js:1483 templates/js/translated/part.js:1621
#: templates/js/translated/part.js:1958 templates/js/translated/part.js:2355
-#: templates/js/translated/part.js:2785 templates/js/translated/part.js:2887
+#: templates/js/translated/part.js:2785 templates/js/translated/part.js:2896
#: templates/js/translated/plugin.js:80
#: templates/js/translated/purchase_order.js:1707
#: templates/js/translated/purchase_order.js:1850
@@ -678,7 +678,7 @@ msgstr "URL til ekstern billedfil"
msgid "Downloading images from remote URL is not enabled"
msgstr "Download af billeder fra ekstern URL er ikke aktiveret"
-#: InvenTree/status.py:66 part/serializers.py:1120
+#: InvenTree/status.py:66 part/serializers.py:1138
msgid "Background worker check failed"
msgstr "Kontrol af baggrundstjeneste mislykkedes"
@@ -960,7 +960,7 @@ msgid "Tracked"
msgstr "Sporet"
#: build/api.py:285 part/admin.py:144 templates/js/translated/build.js:1741
-#: templates/js/translated/build.js:2626
+#: templates/js/translated/build.js:2630
#: templates/js/translated/sales_order.js:1929
#: templates/js/translated/table_filters.js:571
msgid "Allocated"
@@ -1044,11 +1044,11 @@ msgstr "Produktionsordre som er tildelt denne produktion"
#: build/models.py:199 build/templates/build/build_base.html:97
#: build/templates/build/detail.html:29 company/models.py:1044
#: order/models.py:1389 order/models.py:1532 order/models.py:1533
-#: part/api.py:1528 part/models.py:389 part/models.py:3003 part/models.py:3147
-#: part/models.py:3291 part/models.py:3314 part/models.py:3335
-#: part/models.py:3357 part/models.py:3458 part/models.py:3754
-#: part/models.py:3885 part/models.py:3978 part/models.py:4339
-#: part/serializers.py:1066 part/serializers.py:1631
+#: part/api.py:1528 part/api.py:1820 part/models.py:389 part/models.py:3003
+#: part/models.py:3147 part/models.py:3291 part/models.py:3314
+#: part/models.py:3335 part/models.py:3357 part/models.py:3458
+#: part/models.py:3754 part/models.py:3885 part/models.py:3978
+#: part/models.py:4339 part/serializers.py:1084 part/serializers.py:1659
#: part/templates/part/part_app_base.html:8
#: part/templates/part/part_pricing.html:12
#: part/templates/part/upload_bom.html:52
@@ -1147,7 +1147,7 @@ msgid "Build status code"
msgstr "Produktions statuskode"
#: build/models.py:264 build/serializers.py:280 order/serializers.py:549
-#: stock/models.py:826 stock/serializers.py:1300
+#: stock/models.py:826 stock/serializers.py:1306
#: templates/js/translated/purchase_order.js:1129
msgid "Batch Code"
msgstr "Batch Kode"
@@ -1242,48 +1242,48 @@ msgstr ""
msgid "Project code for this build order"
msgstr ""
-#: build/models.py:559
+#: build/models.py:575
#, python-brace-format
msgid "Build order {build} has been completed"
msgstr "Bygningsordre {build} er fuldført"
-#: build/models.py:565
+#: build/models.py:581
msgid "A build order has been completed"
msgstr "En byggeordre er fuldført"
-#: build/models.py:783 build/models.py:858
+#: build/models.py:799 build/models.py:874
msgid "No build output specified"
msgstr ""
-#: build/models.py:786
+#: build/models.py:802
msgid "Build output is already completed"
msgstr ""
-#: build/models.py:789
+#: build/models.py:805
msgid "Build output does not match Build Order"
msgstr ""
-#: build/models.py:862 build/serializers.py:223 build/serializers.py:262
+#: build/models.py:878 build/serializers.py:223 build/serializers.py:262
#: build/serializers.py:831 order/models.py:526 order/serializers.py:401
-#: order/serializers.py:544 part/serializers.py:1423 part/serializers.py:1789
+#: order/serializers.py:544 part/serializers.py:1442 part/serializers.py:1817
#: stock/models.py:665 stock/models.py:1477 stock/serializers.py:450
msgid "Quantity must be greater than zero"
msgstr ""
-#: build/models.py:867 build/serializers.py:228
+#: build/models.py:883 build/serializers.py:228
msgid "Quantity cannot be greater than the output quantity"
msgstr ""
-#: build/models.py:924 build/serializers.py:533
+#: build/models.py:940 build/serializers.py:533
#, python-brace-format
msgid "Build output {serial} has not passed all required tests"
msgstr ""
-#: build/models.py:1286
+#: build/models.py:1302
msgid "Build object"
msgstr ""
-#: build/models.py:1300 build/models.py:1558 build/serializers.py:210
+#: build/models.py:1316 build/models.py:1574 build/serializers.py:210
#: build/serializers.py:247 build/templates/build/build_base.html:102
#: build/templates/build/detail.html:34 common/models.py:2432
#: order/models.py:1247 order/models.py:1902 order/serializers.py:1306
@@ -1310,7 +1310,7 @@ msgstr ""
#: templates/js/translated/company.js:1808
#: templates/js/translated/model_renderers.js:230
#: templates/js/translated/order.js:304 templates/js/translated/part.js:961
-#: templates/js/translated/part.js:1811 templates/js/translated/part.js:3332
+#: templates/js/translated/part.js:1811 templates/js/translated/part.js:3341
#: templates/js/translated/pricing.js:381
#: templates/js/translated/pricing.js:474
#: templates/js/translated/pricing.js:522
@@ -1330,38 +1330,38 @@ msgstr ""
msgid "Quantity"
msgstr ""
-#: build/models.py:1301
+#: build/models.py:1317
msgid "Required quantity for build order"
msgstr ""
-#: build/models.py:1381
+#: build/models.py:1397
msgid "Build item must specify a build output, as master part is marked as trackable"
msgstr ""
-#: build/models.py:1390
+#: build/models.py:1406
#, python-brace-format
msgid "Allocated quantity ({q}) must not exceed available stock quantity ({a})"
msgstr ""
-#: build/models.py:1400 order/models.py:1853
+#: build/models.py:1416 order/models.py:1853
msgid "Stock item is over-allocated"
msgstr ""
-#: build/models.py:1406 order/models.py:1856
+#: build/models.py:1422 order/models.py:1856
msgid "Allocation quantity must be greater than zero"
msgstr ""
-#: build/models.py:1412
+#: build/models.py:1428
msgid "Quantity must be 1 for serialized stock"
msgstr ""
-#: build/models.py:1473
+#: build/models.py:1489
msgid "Selected stock item does not match BOM line"
msgstr ""
-#: build/models.py:1545 build/serializers.py:811 order/serializers.py:1150
-#: order/serializers.py:1171 stock/serializers.py:544 stock/serializers.py:1019
-#: stock/serializers.py:1131 stock/templates/stock/item_base.html:10
+#: build/models.py:1561 build/serializers.py:811 order/serializers.py:1150
+#: order/serializers.py:1171 stock/serializers.py:544 stock/serializers.py:1025
+#: stock/serializers.py:1137 stock/templates/stock/item_base.html:10
#: stock/templates/stock/item_base.html:23
#: stock/templates/stock/item_base.html:194
#: templates/js/translated/build.js:1742
@@ -1376,19 +1376,19 @@ msgstr ""
msgid "Stock Item"
msgstr ""
-#: build/models.py:1546
+#: build/models.py:1562
msgid "Source stock item"
msgstr ""
-#: build/models.py:1559
+#: build/models.py:1575
msgid "Stock quantity to allocate to build"
msgstr ""
-#: build/models.py:1567
+#: build/models.py:1583
msgid "Install into"
msgstr ""
-#: build/models.py:1568
+#: build/models.py:1584
msgid "Destination stock item"
msgstr ""
@@ -1452,9 +1452,9 @@ msgid "A list of build outputs must be provided"
msgstr ""
#: build/serializers.py:426 build/serializers.py:498 order/serializers.py:533
-#: order/serializers.py:641 order/serializers.py:1646 part/serializers.py:1086
+#: order/serializers.py:641 order/serializers.py:1646 part/serializers.py:1104
#: stock/serializers.py:472 stock/serializers.py:627 stock/serializers.py:723
-#: stock/serializers.py:1163 stock/serializers.py:1419
+#: stock/serializers.py:1169 stock/serializers.py:1425
#: stock/templates/stock/item_base.html:394
#: templates/js/translated/barcode.js:547
#: templates/js/translated/barcode.js:795 templates/js/translated/build.js:999
@@ -1494,7 +1494,7 @@ msgstr ""
#: build/serializers.py:505 build/templates/build/build_base.html:151
#: build/templates/build/detail.html:62 order/models.py:910
#: order/models.py:2005 order/serializers.py:565 stock/admin.py:165
-#: stock/serializers.py:774 stock/serializers.py:1307
+#: stock/serializers.py:774 stock/serializers.py:1313
#: stock/templates/stock/item_base.html:427
#: templates/js/translated/barcode.js:252 templates/js/translated/build.js:2189
#: templates/js/translated/purchase_order.js:1308
@@ -1602,7 +1602,7 @@ msgstr ""
msgid "bom_item.part must point to the same part as the build order"
msgstr ""
-#: build/serializers.py:817 stock/serializers.py:1032
+#: build/serializers.py:817 stock/serializers.py:1038
msgid "Item must be in stock"
msgstr ""
@@ -1659,44 +1659,45 @@ msgstr ""
msgid "Allocate optional BOM items to build order"
msgstr ""
-#: build/serializers.py:1096 part/models.py:3895 part/models.py:4331
+#: build/serializers.py:1097 part/models.py:3895 part/models.py:4331
#: stock/api.py:745
msgid "BOM Item"
msgstr ""
-#: build/serializers.py:1105 templates/js/translated/index.js:130
+#: build/serializers.py:1106 templates/js/translated/index.js:130
msgid "Allocated Stock"
msgstr ""
-#: build/serializers.py:1110 part/admin.py:132 part/bom.py:173
-#: part/serializers.py:1441 part/templates/part/part_base.html:210
-#: templates/js/translated/bom.js:1202 templates/js/translated/build.js:2614
-#: templates/js/translated/part.js:709 templates/js/translated/part.js:2148
+#: build/serializers.py:1111 part/admin.py:132 part/bom.py:173
+#: part/serializers.py:798 part/serializers.py:1460
+#: part/templates/part/part_base.html:210 templates/js/translated/bom.js:1208
+#: templates/js/translated/build.js:2614 templates/js/translated/part.js:709
+#: templates/js/translated/part.js:2148
#: templates/js/translated/table_filters.js:170
msgid "On Order"
msgstr ""
-#: build/serializers.py:1115 part/serializers.py:1443
+#: build/serializers.py:1116 part/serializers.py:1462
#: templates/js/translated/build.js:2618
#: templates/js/translated/table_filters.js:360
msgid "In Production"
msgstr ""
-#: build/serializers.py:1120 part/bom.py:172 part/serializers.py:1454
+#: build/serializers.py:1121 part/bom.py:172 part/serializers.py:1473
#: part/templates/part/part_base.html:192
#: templates/js/translated/sales_order.js:1893
msgid "Available Stock"
msgstr ""
-#: build/tasks.py:149
+#: build/tasks.py:171
msgid "Stock required for build order"
msgstr ""
-#: build/tasks.py:166
+#: build/tasks.py:188
msgid "Overdue Build Order"
msgstr ""
-#: build/tasks.py:171
+#: build/tasks.py:193
#, python-brace-format
msgid "Build order {bo} is now overdue"
msgstr ""
@@ -1990,27 +1991,31 @@ msgstr ""
msgid "Order Parts"
msgstr ""
-#: build/templates/build/detail.html:210
-msgid "Incomplete Build Outputs"
-msgstr ""
-
-#: build/templates/build/detail.html:214
-msgid "Create new build output"
+#: build/templates/build/detail.html:205
+msgid "Available stock has been filtered based on specified source location for this build order"
msgstr ""
#: build/templates/build/detail.html:215
+msgid "Incomplete Build Outputs"
+msgstr ""
+
+#: build/templates/build/detail.html:219
+msgid "Create new build output"
+msgstr ""
+
+#: build/templates/build/detail.html:220
msgid "New Build Output"
msgstr ""
-#: build/templates/build/detail.html:232 build/templates/build/sidebar.html:15
+#: build/templates/build/detail.html:237 build/templates/build/sidebar.html:15
msgid "Consumed Stock"
msgstr ""
-#: build/templates/build/detail.html:244
+#: build/templates/build/detail.html:249
msgid "Completed Build Outputs"
msgstr ""
-#: build/templates/build/detail.html:256 build/templates/build/sidebar.html:19
+#: build/templates/build/detail.html:261 build/templates/build/sidebar.html:19
#: company/templates/company/detail.html:229
#: company/templates/company/manufacturer_part.html:141
#: company/templates/company/manufacturer_part_sidebar.html:9
@@ -2026,15 +2031,15 @@ msgstr ""
msgid "Attachments"
msgstr ""
-#: build/templates/build/detail.html:271
+#: build/templates/build/detail.html:276
msgid "Build Notes"
msgstr ""
-#: build/templates/build/detail.html:426
+#: build/templates/build/detail.html:434
msgid "Allocation Complete"
msgstr ""
-#: build/templates/build/detail.html:427
+#: build/templates/build/detail.html:435
msgid "All lines have been fully allocated"
msgstr ""
@@ -2436,7 +2441,7 @@ msgid "Parts are templates by default"
msgstr ""
#: common/models.py:1456 part/admin.py:91 part/admin.py:431 part/models.py:1015
-#: templates/js/translated/bom.js:1633
+#: templates/js/translated/bom.js:1639
#: templates/js/translated/table_filters.js:330
#: templates/js/translated/table_filters.js:721
msgid "Assembly"
@@ -3495,7 +3500,7 @@ msgstr ""
msgid "Price break quantity"
msgstr ""
-#: common/models.py:2440 company/serializers.py:484 order/admin.py:42
+#: common/models.py:2440 company/serializers.py:486 order/admin.py:42
#: order/models.py:1321 order/models.py:2226
#: templates/js/translated/company.js:1813 templates/js/translated/part.js:1885
#: templates/js/translated/pricing.js:621
@@ -3972,7 +3977,7 @@ msgstr ""
#: company/models.py:495 company/templates/company/company_base.html:76
#: company/templates/company/manufacturer_part.html:90
-#: company/templates/company/supplier_part.html:145 part/serializers.py:497
+#: company/templates/company/supplier_part.html:145 part/serializers.py:505
#: stock/templates/stock/item_base.html:207
#: templates/js/translated/company.js:506
#: templates/js/translated/company.js:1108
@@ -3987,7 +3992,7 @@ msgid "Select manufacturer"
msgstr ""
#: company/models.py:502 company/templates/company/manufacturer_part.html:101
-#: company/templates/company/supplier_part.html:153 part/serializers.py:507
+#: company/templates/company/supplier_part.html:153 part/serializers.py:515
#: templates/js/translated/company.js:351
#: templates/js/translated/company.js:1107
#: templates/js/translated/company.js:1302
@@ -4059,7 +4064,7 @@ msgstr ""
#: company/models.py:795 company/templates/company/company_base.html:81
#: company/templates/company/supplier_part.html:129 order/models.py:453
#: order/templates/order/order_base.html:136 part/bom.py:272 part/bom.py:310
-#: part/serializers.py:481 plugin/builtin/suppliers/digikey.py:25
+#: part/serializers.py:489 plugin/builtin/suppliers/digikey.py:25
#: plugin/builtin/suppliers/lcsc.py:26 plugin/builtin/suppliers/mouser.py:24
#: plugin/builtin/suppliers/tme.py:26 stock/templates/stock/item_base.html:224
#: templates/email/overdue_purchase_order.html:16
@@ -4076,7 +4081,7 @@ msgstr ""
msgid "Select supplier"
msgstr ""
-#: company/models.py:802 part/serializers.py:492
+#: company/models.py:802 part/serializers.py:500
msgid "Supplier stock keeping unit"
msgstr ""
@@ -4112,7 +4117,7 @@ msgid "Minimum charge (e.g. stocking fee)"
msgstr ""
#: company/models.py:851 company/templates/company/supplier_part.html:160
-#: stock/admin.py:224 stock/models.py:785 stock/serializers.py:1317
+#: stock/admin.py:224 stock/models.py:785 stock/serializers.py:1323
#: stock/templates/stock/item_base.html:240
#: templates/js/translated/company.js:1636
#: templates/js/translated/stock.js:2387
@@ -4157,7 +4162,7 @@ msgstr ""
msgid "Date of last update of availability data"
msgstr ""
-#: company/serializers.py:153
+#: company/serializers.py:155
msgid "Default currency used for this supplier"
msgstr ""
@@ -4218,7 +4223,7 @@ msgstr ""
#: company/templates/company/company_base.html:86 order/models.py:898
#: order/models.py:1993 order/templates/order/return_order_base.html:131
#: order/templates/order/sales_order_base.html:144 stock/models.py:807
-#: stock/models.py:808 stock/serializers.py:1067
+#: stock/models.py:808 stock/serializers.py:1073
#: stock/templates/stock/item_base.html:405
#: templates/email/overdue_sales_order.html:16
#: templates/js/translated/company.js:502
@@ -4429,8 +4434,9 @@ msgstr ""
#: company/templates/company/manufacturer_part.html:119
#: company/templates/company/supplier_part.html:15 company/views.py:31
-#: part/admin.py:122 part/templates/part/part_sidebar.html:33
-#: templates/InvenTree/search.html:190 templates/navbar.html:48
+#: part/admin.py:122 part/serializers.py:802
+#: part/templates/part/part_sidebar.html:33 templates/InvenTree/search.html:190
+#: templates/navbar.html:48
msgid "Suppliers"
msgstr ""
@@ -4528,7 +4534,7 @@ msgid "No supplier information available"
msgstr ""
#: company/templates/company/supplier_part.html:139 part/bom.py:279
-#: part/bom.py:311 part/serializers.py:491
+#: part/bom.py:311 part/serializers.py:499
#: templates/js/translated/company.js:349 templates/js/translated/part.js:1786
#: templates/js/translated/pricing.js:510
#: templates/js/translated/purchase_order.js:1851
@@ -4577,10 +4583,12 @@ msgstr ""
msgid "Update Part Availability"
msgstr ""
-#: company/templates/company/supplier_part_sidebar.html:5 part/stocktake.py:223
+#: company/templates/company/supplier_part_sidebar.html:5
+#: part/serializers.py:801 part/stocktake.py:223
#: part/templates/part/category.html:183
#: part/templates/part/category_sidebar.html:17 stock/admin.py:69
-#: stock/serializers.py:760 stock/templates/stock/location.html:170
+#: stock/serializers.py:760 stock/serializers.py:924
+#: stock/templates/stock/location.html:170
#: stock/templates/stock/location.html:184
#: stock/templates/stock/location.html:196
#: stock/templates/stock/location_sidebar.html:7
@@ -4640,7 +4648,7 @@ msgid "Label template file"
msgstr ""
#: label/models.py:143 part/models.py:3484 report/models.py:322
-#: templates/js/translated/part.js:2891
+#: templates/js/translated/part.js:2900
#: templates/js/translated/table_filters.js:481
msgid "Enabled"
msgstr ""
@@ -5733,7 +5741,7 @@ msgid "Pending Shipments"
msgstr ""
#: order/templates/order/sales_order_detail.html:71
-#: templates/js/translated/bom.js:1271 templates/js/translated/filters.js:296
+#: templates/js/translated/bom.js:1277 templates/js/translated/filters.js:296
msgid "Actions"
msgstr ""
@@ -5861,10 +5869,10 @@ msgstr ""
msgid "Category Path"
msgstr ""
-#: part/admin.py:323 part/models.py:390 part/serializers.py:259
-#: part/serializers.py:373 part/templates/part/cat_link.html:3
-#: part/templates/part/category.html:23 part/templates/part/category.html:141
-#: part/templates/part/category.html:161
+#: part/admin.py:323 part/models.py:390 part/serializers.py:112
+#: part/serializers.py:265 part/serializers.py:381
+#: part/templates/part/cat_link.html:3 part/templates/part/category.html:23
+#: part/templates/part/category.html:141 part/templates/part/category.html:161
#: part/templates/part/category_sidebar.html:9
#: templates/InvenTree/index.html:36 templates/InvenTree/search.html:84
#: templates/InvenTree/settings/sidebar.html:47
@@ -5889,13 +5897,13 @@ msgstr ""
msgid "Part IPN"
msgstr ""
-#: part/admin.py:421 part/serializers.py:1220
+#: part/admin.py:421 part/serializers.py:1238
#: templates/js/translated/pricing.js:358
#: templates/js/translated/pricing.js:1024
msgid "Minimum Price"
msgstr ""
-#: part/admin.py:426 part/serializers.py:1235
+#: part/admin.py:426 part/serializers.py:1253
#: templates/js/translated/pricing.js:353
#: templates/js/translated/pricing.js:1032
msgid "Maximum Price"
@@ -5974,7 +5982,7 @@ msgid "This option must be selected"
msgstr ""
#: part/api.py:1541 part/models.py:895 part/models.py:3385 part/models.py:3831
-#: part/serializers.py:388 part/serializers.py:1076
+#: part/serializers.py:396 part/serializers.py:1094
#: part/templates/part/part_base.html:260 stock/api.py:733
#: templates/InvenTree/settings/settings_staff_js.html:300
#: templates/js/translated/notification.js:60
@@ -5982,12 +5990,17 @@ msgstr ""
msgid "Category"
msgstr ""
+#: part/api.py:1828
+msgid "Uses"
+msgstr ""
+
#: part/bom.py:170 part/models.py:100 part/models.py:938
#: part/templates/part/category.html:116 part/templates/part/part_base.html:367
msgid "Default Location"
msgstr ""
-#: part/bom.py:171 templates/email/low_stock_notification.html:16
+#: part/bom.py:171 part/serializers.py:803
+#: templates/email/low_stock_notification.html:16
msgid "Total Stock"
msgstr ""
@@ -6010,7 +6023,8 @@ msgstr ""
msgid "Default location for parts in this category"
msgstr ""
-#: part/models.py:106 stock/models.py:165 templates/js/translated/stock.js:2736
+#: part/models.py:106 stock/models.py:165 templates/js/translated/part.js:2810
+#: templates/js/translated/stock.js:2736
#: templates/js/translated/table_filters.js:239
#: templates/js/translated/table_filters.js:283
msgid "Structural"
@@ -6418,7 +6432,7 @@ msgstr ""
msgid "Test with this name already exists for this part"
msgstr ""
-#: part/models.py:3464 templates/js/translated/part.js:2870
+#: part/models.py:3464 templates/js/translated/part.js:2879
msgid "Test Name"
msgstr ""
@@ -6446,7 +6460,7 @@ msgstr ""
msgid "Is this test enabled?"
msgstr ""
-#: part/models.py:3489 templates/js/translated/part.js:2899
+#: part/models.py:3489 templates/js/translated/part.js:2908
#: templates/js/translated/table_filters.js:477
msgid "Required"
msgstr ""
@@ -6455,7 +6469,7 @@ msgstr ""
msgid "Is this test required to pass?"
msgstr ""
-#: part/models.py:3495 templates/js/translated/part.js:2907
+#: part/models.py:3495 templates/js/translated/part.js:2916
msgid "Requires Value"
msgstr ""
@@ -6463,7 +6477,7 @@ msgstr ""
msgid "Does this test require a value when adding a test result?"
msgstr ""
-#: part/models.py:3501 templates/js/translated/part.js:2914
+#: part/models.py:3501 templates/js/translated/part.js:2923
msgid "Requires Attachment"
msgstr ""
@@ -6685,311 +6699,327 @@ msgstr ""
msgid "Duplicate relationship already exists"
msgstr ""
-#: part/serializers.py:128 part/templates/part/category.html:122
-#: part/templates/part/category.html:207
+#: part/serializers.py:114 part/serializers.py:134
+#: part/templates/part/category.html:122 part/templates/part/category.html:207
#: part/templates/part/category_sidebar.html:7
msgid "Subcategories"
msgstr ""
-#: part/serializers.py:172
+#: part/serializers.py:178
msgid "Results"
msgstr ""
-#: part/serializers.py:173
+#: part/serializers.py:179
msgid "Number of results recorded against this template"
msgstr ""
-#: part/serializers.py:197 part/serializers.py:215 stock/serializers.py:384
+#: part/serializers.py:203 part/serializers.py:221 stock/serializers.py:384
msgid "Purchase currency of this stock item"
msgstr ""
-#: part/serializers.py:260
+#: part/serializers.py:266
msgid "Number of parts using this template"
msgstr ""
-#: part/serializers.py:379
+#: part/serializers.py:387
msgid "No parts selected"
msgstr ""
-#: part/serializers.py:389
+#: part/serializers.py:397
msgid "Select category"
msgstr ""
-#: part/serializers.py:419
+#: part/serializers.py:427
msgid "Original Part"
msgstr ""
-#: part/serializers.py:420
+#: part/serializers.py:428
msgid "Select original part to duplicate"
msgstr ""
-#: part/serializers.py:425
+#: part/serializers.py:433
msgid "Copy Image"
msgstr ""
-#: part/serializers.py:426
+#: part/serializers.py:434
msgid "Copy image from original part"
msgstr ""
-#: part/serializers.py:432 part/templates/part/detail.html:277
+#: part/serializers.py:440 part/templates/part/detail.html:277
msgid "Copy BOM"
msgstr ""
-#: part/serializers.py:433
+#: part/serializers.py:441
msgid "Copy bill of materials from original part"
msgstr ""
-#: part/serializers.py:439
+#: part/serializers.py:447
msgid "Copy Parameters"
msgstr ""
-#: part/serializers.py:440
+#: part/serializers.py:448
msgid "Copy parameter data from original part"
msgstr ""
-#: part/serializers.py:446
+#: part/serializers.py:454
msgid "Copy Notes"
msgstr ""
-#: part/serializers.py:447
+#: part/serializers.py:455
msgid "Copy notes from original part"
msgstr ""
-#: part/serializers.py:460
+#: part/serializers.py:468
msgid "Initial Stock Quantity"
msgstr ""
-#: part/serializers.py:462
+#: part/serializers.py:470
msgid "Specify initial stock quantity for this Part. If quantity is zero, no stock is added."
msgstr ""
-#: part/serializers.py:469
+#: part/serializers.py:477
msgid "Initial Stock Location"
msgstr ""
-#: part/serializers.py:470
+#: part/serializers.py:478
msgid "Specify initial stock location for this Part"
msgstr ""
-#: part/serializers.py:482
+#: part/serializers.py:490
msgid "Select supplier (or leave blank to skip)"
msgstr ""
-#: part/serializers.py:498
+#: part/serializers.py:506
msgid "Select manufacturer (or leave blank to skip)"
msgstr ""
-#: part/serializers.py:508
+#: part/serializers.py:516
msgid "Manufacturer part number"
msgstr ""
-#: part/serializers.py:515
+#: part/serializers.py:523
msgid "Selected company is not a valid supplier"
msgstr ""
-#: part/serializers.py:524
+#: part/serializers.py:532
msgid "Selected company is not a valid manufacturer"
msgstr ""
-#: part/serializers.py:535
+#: part/serializers.py:543
msgid "Manufacturer part matching this MPN already exists"
msgstr ""
-#: part/serializers.py:542
+#: part/serializers.py:550
msgid "Supplier part matching this SKU already exists"
msgstr ""
-#: part/serializers.py:815 part/templates/part/copy_part.html:9
+#: part/serializers.py:804
+#, fuzzy
+#| msgid "External Link"
+msgid "External Stock"
+msgstr "Ekstern link"
+
+#: part/serializers.py:806
+#, fuzzy
+#| msgid "Accept Unallocated"
+msgid "Unallocated Stock"
+msgstr "Accepter Ikke tildelt"
+
+#: part/serializers.py:808
+msgid "Variant Stock"
+msgstr ""
+
+#: part/serializers.py:833 part/templates/part/copy_part.html:9
#: templates/js/translated/part.js:471
msgid "Duplicate Part"
msgstr ""
-#: part/serializers.py:816
+#: part/serializers.py:834
msgid "Copy initial data from another Part"
msgstr ""
-#: part/serializers.py:822 templates/js/translated/part.js:102
+#: part/serializers.py:840 templates/js/translated/part.js:102
msgid "Initial Stock"
msgstr ""
-#: part/serializers.py:823
+#: part/serializers.py:841
msgid "Create Part with initial stock quantity"
msgstr ""
-#: part/serializers.py:829
+#: part/serializers.py:847
msgid "Supplier Information"
msgstr ""
-#: part/serializers.py:830
+#: part/serializers.py:848
msgid "Add initial supplier information for this part"
msgstr ""
-#: part/serializers.py:838
+#: part/serializers.py:856
msgid "Copy Category Parameters"
msgstr ""
-#: part/serializers.py:839
+#: part/serializers.py:857
msgid "Copy parameter templates from selected part category"
msgstr ""
-#: part/serializers.py:844
+#: part/serializers.py:862
msgid "Existing Image"
msgstr ""
-#: part/serializers.py:845
+#: part/serializers.py:863
msgid "Filename of an existing part image"
msgstr ""
-#: part/serializers.py:862
+#: part/serializers.py:880
msgid "Image file does not exist"
msgstr ""
-#: part/serializers.py:1068
+#: part/serializers.py:1086
msgid "Limit stocktake report to a particular part, and any variant parts"
msgstr ""
-#: part/serializers.py:1078
+#: part/serializers.py:1096
msgid "Limit stocktake report to a particular part category, and any child categories"
msgstr ""
-#: part/serializers.py:1088
+#: part/serializers.py:1106
msgid "Limit stocktake report to a particular stock location, and any child locations"
msgstr ""
-#: part/serializers.py:1094
+#: part/serializers.py:1112
msgid "Exclude External Stock"
msgstr ""
-#: part/serializers.py:1095
+#: part/serializers.py:1113
msgid "Exclude stock items in external locations"
msgstr ""
-#: part/serializers.py:1100
+#: part/serializers.py:1118
msgid "Generate Report"
msgstr ""
-#: part/serializers.py:1101
+#: part/serializers.py:1119
msgid "Generate report file containing calculated stocktake data"
msgstr ""
-#: part/serializers.py:1106
+#: part/serializers.py:1124
msgid "Update Parts"
msgstr ""
-#: part/serializers.py:1107
+#: part/serializers.py:1125
msgid "Update specified parts with calculated stocktake data"
msgstr ""
-#: part/serializers.py:1115
+#: part/serializers.py:1133
msgid "Stocktake functionality is not enabled"
msgstr ""
-#: part/serializers.py:1221
+#: part/serializers.py:1239
msgid "Override calculated value for minimum price"
msgstr ""
-#: part/serializers.py:1228
+#: part/serializers.py:1246
msgid "Minimum price currency"
msgstr ""
-#: part/serializers.py:1236
+#: part/serializers.py:1254
msgid "Override calculated value for maximum price"
msgstr ""
-#: part/serializers.py:1243
+#: part/serializers.py:1261
msgid "Maximum price currency"
msgstr ""
-#: part/serializers.py:1272
+#: part/serializers.py:1290
msgid "Update"
msgstr ""
-#: part/serializers.py:1273
+#: part/serializers.py:1291
msgid "Update pricing for this part"
msgstr ""
-#: part/serializers.py:1296
+#: part/serializers.py:1314
#, python-brace-format
msgid "Could not convert from provided currencies to {default_currency}"
msgstr ""
-#: part/serializers.py:1303
+#: part/serializers.py:1321
msgid "Minimum price must not be greater than maximum price"
msgstr ""
-#: part/serializers.py:1306
+#: part/serializers.py:1324
msgid "Maximum price must not be less than minimum price"
msgstr ""
-#: part/serializers.py:1632
+#: part/serializers.py:1660
msgid "Select part to copy BOM from"
msgstr ""
-#: part/serializers.py:1640
+#: part/serializers.py:1668
msgid "Remove Existing Data"
msgstr ""
-#: part/serializers.py:1641
+#: part/serializers.py:1669
msgid "Remove existing BOM items before copying"
msgstr ""
-#: part/serializers.py:1646
+#: part/serializers.py:1674
msgid "Include Inherited"
msgstr ""
-#: part/serializers.py:1647
+#: part/serializers.py:1675
msgid "Include BOM items which are inherited from templated parts"
msgstr ""
-#: part/serializers.py:1652
+#: part/serializers.py:1680
msgid "Skip Invalid Rows"
msgstr ""
-#: part/serializers.py:1653
+#: part/serializers.py:1681
msgid "Enable this option to skip invalid rows"
msgstr ""
-#: part/serializers.py:1658
+#: part/serializers.py:1686
msgid "Copy Substitute Parts"
msgstr ""
-#: part/serializers.py:1659
+#: part/serializers.py:1687
msgid "Copy substitute parts when duplicate BOM items"
msgstr ""
-#: part/serializers.py:1693
+#: part/serializers.py:1721
msgid "Clear Existing BOM"
msgstr ""
-#: part/serializers.py:1694
+#: part/serializers.py:1722
msgid "Delete existing BOM items before uploading"
msgstr ""
-#: part/serializers.py:1724
+#: part/serializers.py:1752
msgid "No part column specified"
msgstr ""
-#: part/serializers.py:1768
+#: part/serializers.py:1796
msgid "Multiple matching parts found"
msgstr ""
-#: part/serializers.py:1771
+#: part/serializers.py:1799
msgid "No matching part found"
msgstr ""
-#: part/serializers.py:1774
+#: part/serializers.py:1802
msgid "Part is not designated as a component"
msgstr ""
-#: part/serializers.py:1783
+#: part/serializers.py:1811
msgid "Quantity not provided"
msgstr ""
-#: part/serializers.py:1791
+#: part/serializers.py:1819
msgid "Invalid quantity"
msgstr ""
-#: part/serializers.py:1812
+#: part/serializers.py:1840
msgid "At least one BOM item is required"
msgstr ""
@@ -7221,7 +7251,7 @@ msgid "Validate BOM"
msgstr ""
#: part/templates/part/detail.html:283 part/templates/part/detail.html:284
-#: templates/js/translated/bom.js:1314 templates/js/translated/bom.js:1315
+#: templates/js/translated/bom.js:1320 templates/js/translated/bom.js:1321
msgid "Add BOM Item"
msgstr ""
@@ -7405,7 +7435,7 @@ msgstr ""
msgid "Allocated to Sales Orders"
msgstr ""
-#: part/templates/part/part_base.html:235 templates/js/translated/bom.js:1213
+#: part/templates/part/part_base.html:235 templates/js/translated/bom.js:1219
msgid "Can Build"
msgstr ""
@@ -8784,7 +8814,7 @@ msgstr ""
msgid "Where is this stock item located?"
msgstr ""
-#: stock/models.py:786 stock/serializers.py:1318
+#: stock/models.py:786 stock/serializers.py:1324
msgid "Packaging this stock item is stored in"
msgstr ""
@@ -8796,7 +8826,7 @@ msgstr ""
msgid "Serial number for this item"
msgstr ""
-#: stock/models.py:830 stock/serializers.py:1301
+#: stock/models.py:830 stock/serializers.py:1307
msgid "Batch code for this stock item"
msgstr ""
@@ -8905,7 +8935,7 @@ msgstr ""
msgid "Serialized stock cannot be merged"
msgstr ""
-#: stock/models.py:1639 stock/serializers.py:1207
+#: stock/models.py:1639 stock/serializers.py:1213
msgid "Duplicate stock items"
msgstr ""
@@ -8986,7 +9016,7 @@ msgstr ""
msgid "Enter serial numbers for new items"
msgstr ""
-#: stock/serializers.py:473 stock/serializers.py:1164 stock/serializers.py:1420
+#: stock/serializers.py:473 stock/serializers.py:1170 stock/serializers.py:1426
msgid "Destination stock location"
msgstr ""
@@ -9059,77 +9089,78 @@ msgstr ""
msgid "No stock items selected"
msgstr ""
-#: stock/serializers.py:863 stock/templates/stock/location.html:165
+#: stock/serializers.py:863 stock/serializers.py:926
+#: stock/templates/stock/location.html:165
#: stock/templates/stock/location.html:213
#: stock/templates/stock/location_sidebar.html:5
msgid "Sublocations"
msgstr ""
-#: stock/serializers.py:1036
+#: stock/serializers.py:1042
msgid "Part must be salable"
msgstr ""
-#: stock/serializers.py:1040
+#: stock/serializers.py:1046
msgid "Item is allocated to a sales order"
msgstr ""
-#: stock/serializers.py:1044
+#: stock/serializers.py:1050
msgid "Item is allocated to a build order"
msgstr ""
-#: stock/serializers.py:1068
+#: stock/serializers.py:1074
msgid "Customer to assign stock items"
msgstr ""
-#: stock/serializers.py:1074
+#: stock/serializers.py:1080
msgid "Selected company is not a customer"
msgstr ""
-#: stock/serializers.py:1082
+#: stock/serializers.py:1088
msgid "Stock assignment notes"
msgstr ""
-#: stock/serializers.py:1092 stock/serializers.py:1346
+#: stock/serializers.py:1098 stock/serializers.py:1352
msgid "A list of stock items must be provided"
msgstr ""
-#: stock/serializers.py:1171
+#: stock/serializers.py:1177
msgid "Stock merging notes"
msgstr ""
-#: stock/serializers.py:1176
+#: stock/serializers.py:1182
msgid "Allow mismatched suppliers"
msgstr ""
-#: stock/serializers.py:1177
+#: stock/serializers.py:1183
msgid "Allow stock items with different supplier parts to be merged"
msgstr ""
-#: stock/serializers.py:1182
+#: stock/serializers.py:1188
msgid "Allow mismatched status"
msgstr ""
-#: stock/serializers.py:1183
+#: stock/serializers.py:1189
msgid "Allow stock items with different status codes to be merged"
msgstr ""
-#: stock/serializers.py:1193
+#: stock/serializers.py:1199
msgid "At least two stock items must be provided"
msgstr ""
-#: stock/serializers.py:1260
+#: stock/serializers.py:1266
msgid "No Change"
msgstr ""
-#: stock/serializers.py:1289
+#: stock/serializers.py:1295
msgid "StockItem primary key value"
msgstr ""
-#: stock/serializers.py:1308
+#: stock/serializers.py:1314
msgid "Stock item status code"
msgstr ""
-#: stock/serializers.py:1336
+#: stock/serializers.py:1342
msgid "Stock transaction notes"
msgstr ""
@@ -10662,7 +10693,7 @@ msgid "The following parts are low on required stock"
msgstr ""
#: templates/email/build_order_required_stock.html:18
-#: templates/js/translated/bom.js:1668 templates/js/translated/build.js:2557
+#: templates/js/translated/bom.js:1674 templates/js/translated/build.js:2557
msgid "Required Quantity"
msgstr ""
@@ -10676,7 +10707,7 @@ msgid "Click on the following link to view this part"
msgstr ""
#: templates/email/low_stock_notification.html:18
-#: templates/js/translated/part.js:3209
+#: templates/js/translated/part.js:3218
msgid "Minimum Quantity"
msgstr ""
@@ -11051,62 +11082,68 @@ msgstr ""
msgid "No pricing available"
msgstr ""
-#: templates/js/translated/bom.js:1182 templates/js/translated/build.js:2596
+#: templates/js/translated/bom.js:1184 templates/js/translated/build.js:2622
+#, fuzzy
+#| msgid "External Link"
+msgid "External stock"
+msgstr "Ekstern link"
+
+#: templates/js/translated/bom.js:1188 templates/js/translated/build.js:2596
#: templates/js/translated/sales_order.js:1910
msgid "No Stock Available"
msgstr ""
-#: templates/js/translated/bom.js:1187 templates/js/translated/build.js:2600
+#: templates/js/translated/bom.js:1193 templates/js/translated/build.js:2600
msgid "Includes variant and substitute stock"
msgstr ""
-#: templates/js/translated/bom.js:1189 templates/js/translated/build.js:2602
+#: templates/js/translated/bom.js:1195 templates/js/translated/build.js:2602
#: templates/js/translated/part.js:1256
#: templates/js/translated/sales_order.js:1907
msgid "Includes variant stock"
msgstr ""
-#: templates/js/translated/bom.js:1191 templates/js/translated/build.js:2604
+#: templates/js/translated/bom.js:1197 templates/js/translated/build.js:2604
msgid "Includes substitute stock"
msgstr ""
-#: templates/js/translated/bom.js:1219 templates/js/translated/build.js:2587
+#: templates/js/translated/bom.js:1225 templates/js/translated/build.js:2587
msgid "Consumable item"
msgstr ""
-#: templates/js/translated/bom.js:1279
+#: templates/js/translated/bom.js:1285
msgid "Validate BOM Item"
msgstr ""
-#: templates/js/translated/bom.js:1281
+#: templates/js/translated/bom.js:1287
msgid "This line has been validated"
msgstr ""
-#: templates/js/translated/bom.js:1283
+#: templates/js/translated/bom.js:1289
msgid "Edit substitute parts"
msgstr ""
-#: templates/js/translated/bom.js:1285 templates/js/translated/bom.js:1480
+#: templates/js/translated/bom.js:1291 templates/js/translated/bom.js:1486
msgid "Edit BOM Item"
msgstr ""
-#: templates/js/translated/bom.js:1287
+#: templates/js/translated/bom.js:1293
msgid "Delete BOM Item"
msgstr ""
-#: templates/js/translated/bom.js:1307
+#: templates/js/translated/bom.js:1313
msgid "View BOM"
msgstr ""
-#: templates/js/translated/bom.js:1391
+#: templates/js/translated/bom.js:1397
msgid "No BOM items found"
msgstr ""
-#: templates/js/translated/bom.js:1651 templates/js/translated/build.js:2486
+#: templates/js/translated/bom.js:1657 templates/js/translated/build.js:2486
msgid "Required Part"
msgstr ""
-#: templates/js/translated/bom.js:1677
+#: templates/js/translated/bom.js:1683
msgid "Inherited from parent BOM"
msgstr ""
@@ -11449,29 +11486,29 @@ msgstr ""
msgid "Sufficient stock available"
msgstr ""
-#: templates/js/translated/build.js:2643
+#: templates/js/translated/build.js:2647
msgid "Consumable Item"
msgstr ""
-#: templates/js/translated/build.js:2648
+#: templates/js/translated/build.js:2652
msgid "Tracked item"
msgstr ""
-#: templates/js/translated/build.js:2655
+#: templates/js/translated/build.js:2659
#: templates/js/translated/sales_order.js:2016
msgid "Build stock"
msgstr ""
-#: templates/js/translated/build.js:2660 templates/js/translated/stock.js:1829
+#: templates/js/translated/build.js:2664 templates/js/translated/stock.js:1829
msgid "Order stock"
msgstr ""
-#: templates/js/translated/build.js:2664
+#: templates/js/translated/build.js:2668
#: templates/js/translated/sales_order.js:2010
msgid "Allocate stock"
msgstr ""
-#: templates/js/translated/build.js:2668
+#: templates/js/translated/build.js:2672
msgid "Remove stock allocation"
msgstr ""
@@ -12313,64 +12350,64 @@ msgstr ""
msgid "Subscribed category"
msgstr ""
-#: templates/js/translated/part.js:2855
+#: templates/js/translated/part.js:2864
msgid "No test templates matching query"
msgstr ""
-#: templates/js/translated/part.js:2877 templates/js/translated/search.js:342
+#: templates/js/translated/part.js:2886 templates/js/translated/search.js:342
msgid "results"
msgstr ""
-#: templates/js/translated/part.js:2927 templates/js/translated/stock.js:1446
+#: templates/js/translated/part.js:2936 templates/js/translated/stock.js:1446
msgid "Edit test result"
msgstr ""
-#: templates/js/translated/part.js:2928 templates/js/translated/stock.js:1447
+#: templates/js/translated/part.js:2937 templates/js/translated/stock.js:1447
#: templates/js/translated/stock.js:1692
msgid "Delete test result"
msgstr ""
-#: templates/js/translated/part.js:2932
+#: templates/js/translated/part.js:2941
msgid "This test is defined for a parent part"
msgstr ""
-#: templates/js/translated/part.js:2948
+#: templates/js/translated/part.js:2957
msgid "Edit Test Result Template"
msgstr ""
-#: templates/js/translated/part.js:2962
+#: templates/js/translated/part.js:2971
msgid "Delete Test Result Template"
msgstr ""
-#: templates/js/translated/part.js:3041 templates/js/translated/part.js:3042
+#: templates/js/translated/part.js:3050 templates/js/translated/part.js:3051
msgid "No date specified"
msgstr ""
-#: templates/js/translated/part.js:3044
+#: templates/js/translated/part.js:3053
msgid "Specified date is in the past"
msgstr ""
-#: templates/js/translated/part.js:3050
+#: templates/js/translated/part.js:3059
msgid "Speculative"
msgstr ""
-#: templates/js/translated/part.js:3100
+#: templates/js/translated/part.js:3109
msgid "No scheduling information available for this part"
msgstr ""
-#: templates/js/translated/part.js:3106
+#: templates/js/translated/part.js:3115
msgid "Error fetching scheduling information for this part"
msgstr ""
-#: templates/js/translated/part.js:3202
+#: templates/js/translated/part.js:3211
msgid "Scheduled Stock Quantities"
msgstr ""
-#: templates/js/translated/part.js:3218
+#: templates/js/translated/part.js:3227
msgid "Maximum Quantity"
msgstr ""
-#: templates/js/translated/part.js:3263
+#: templates/js/translated/part.js:3272
msgid "Minimum Stock Level"
msgstr ""
@@ -14052,4 +14089,3 @@ msgstr ""
#: users/models.py:413
msgid "Permission to delete items"
msgstr ""
-
diff --git a/InvenTree/locale/de/LC_MESSAGES/django.po b/InvenTree/locale/de/LC_MESSAGES/django.po
index 4a3fa970a1..368e85e894 100644
--- a/InvenTree/locale/de/LC_MESSAGES/django.po
+++ b/InvenTree/locale/de/LC_MESSAGES/django.po
@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: inventree\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2024-02-28 04:05+0000\n"
-"PO-Revision-Date: 2024-02-28 07:23\n"
+"POT-Creation-Date: 2024-03-02 07:22+0000\n"
+"PO-Revision-Date: 2024-03-11 09:31\n"
"Last-Translator: \n"
"Language-Team: German\n"
"Language: de_DE\n"
@@ -28,7 +28,7 @@ msgstr "Benutzer hat keine Berechtigung, dieses Modell anzuzeigen"
#: InvenTree/conversion.py:160
#, python-brace-format
msgid "Invalid unit provided ({unit})"
-msgstr ""
+msgstr "Ungültige Einheit angegeben ({unit})"
#: InvenTree/conversion.py:170
msgid "No value provided"
@@ -66,9 +66,9 @@ msgstr "Datum eingeben"
#: report/templates/report/inventree_build_order_base.html:172
#: stock/admin.py:226 stock/models.py:2335 stock/models.py:2451
#: stock/serializers.py:479 stock/serializers.py:632 stock/serializers.py:728
-#: stock/serializers.py:778 stock/serializers.py:1081 stock/serializers.py:1170
-#: stock/serializers.py:1335 stock/templates/stock/stock_sidebar.html:25
-#: templates/js/translated/barcode.js:143 templates/js/translated/bom.js:1259
+#: stock/serializers.py:778 stock/serializers.py:1087 stock/serializers.py:1176
+#: stock/serializers.py:1341 stock/templates/stock/stock_sidebar.html:25
+#: templates/js/translated/barcode.js:143 templates/js/translated/bom.js:1265
#: templates/js/translated/company.js:1674 templates/js/translated/order.js:347
#: templates/js/translated/part.js:1080
#: templates/js/translated/purchase_order.js:2201
@@ -523,7 +523,7 @@ msgstr "Name"
#: templates/js/translated/order.js:298 templates/js/translated/part.js:1238
#: templates/js/translated/part.js:1483 templates/js/translated/part.js:1621
#: templates/js/translated/part.js:1958 templates/js/translated/part.js:2355
-#: templates/js/translated/part.js:2785 templates/js/translated/part.js:2887
+#: templates/js/translated/part.js:2785 templates/js/translated/part.js:2896
#: templates/js/translated/plugin.js:80
#: templates/js/translated/purchase_order.js:1707
#: templates/js/translated/purchase_order.js:1850
@@ -678,7 +678,7 @@ msgstr "URL der Remote-Bilddatei"
msgid "Downloading images from remote URL is not enabled"
msgstr "Das Herunterladen von Bildern von Remote-URLs ist nicht aktiviert"
-#: InvenTree/status.py:66 part/serializers.py:1120
+#: InvenTree/status.py:66 part/serializers.py:1138
msgid "Background worker check failed"
msgstr "Hintergrund-Prozess-Kontrolle fehlgeschlagen"
@@ -960,7 +960,7 @@ msgid "Tracked"
msgstr "Nachverfolgt"
#: build/api.py:285 part/admin.py:144 templates/js/translated/build.js:1741
-#: templates/js/translated/build.js:2626
+#: templates/js/translated/build.js:2630
#: templates/js/translated/sales_order.js:1929
#: templates/js/translated/table_filters.js:571
msgid "Allocated"
@@ -1044,11 +1044,11 @@ msgstr "Bauauftrag, zu dem dieser Bauauftrag zugwiesen ist"
#: build/models.py:199 build/templates/build/build_base.html:97
#: build/templates/build/detail.html:29 company/models.py:1044
#: order/models.py:1389 order/models.py:1532 order/models.py:1533
-#: part/api.py:1528 part/models.py:389 part/models.py:3003 part/models.py:3147
-#: part/models.py:3291 part/models.py:3314 part/models.py:3335
-#: part/models.py:3357 part/models.py:3458 part/models.py:3754
-#: part/models.py:3885 part/models.py:3978 part/models.py:4339
-#: part/serializers.py:1066 part/serializers.py:1631
+#: part/api.py:1528 part/api.py:1820 part/models.py:389 part/models.py:3003
+#: part/models.py:3147 part/models.py:3291 part/models.py:3314
+#: part/models.py:3335 part/models.py:3357 part/models.py:3458
+#: part/models.py:3754 part/models.py:3885 part/models.py:3978
+#: part/models.py:4339 part/serializers.py:1084 part/serializers.py:1659
#: part/templates/part/part_app_base.html:8
#: part/templates/part/part_pricing.html:12
#: part/templates/part/upload_bom.html:52
@@ -1147,7 +1147,7 @@ msgid "Build status code"
msgstr "Bau-Statuscode"
#: build/models.py:264 build/serializers.py:280 order/serializers.py:549
-#: stock/models.py:826 stock/serializers.py:1300
+#: stock/models.py:826 stock/serializers.py:1306
#: templates/js/translated/purchase_order.js:1129
msgid "Batch Code"
msgstr "Losnummer"
@@ -1242,48 +1242,48 @@ msgstr "Projektcode"
msgid "Project code for this build order"
msgstr "Projektcode für diesen Auftrag"
-#: build/models.py:559
+#: build/models.py:575
#, python-brace-format
msgid "Build order {build} has been completed"
msgstr "Bauauftrag {build} wurde fertiggestellt"
-#: build/models.py:565
+#: build/models.py:581
msgid "A build order has been completed"
msgstr "Ein Bauauftrag wurde fertiggestellt"
-#: build/models.py:783 build/models.py:858
+#: build/models.py:799 build/models.py:874
msgid "No build output specified"
msgstr "kein Endprodukt angegeben"
-#: build/models.py:786
+#: build/models.py:802
msgid "Build output is already completed"
msgstr "Endprodukt bereits hergstellt"
-#: build/models.py:789
+#: build/models.py:805
msgid "Build output does not match Build Order"
msgstr "Endprodukt stimmt nicht mit dem Bauauftrag überein"
-#: build/models.py:862 build/serializers.py:223 build/serializers.py:262
+#: build/models.py:878 build/serializers.py:223 build/serializers.py:262
#: build/serializers.py:831 order/models.py:526 order/serializers.py:401
-#: order/serializers.py:544 part/serializers.py:1423 part/serializers.py:1789
+#: order/serializers.py:544 part/serializers.py:1442 part/serializers.py:1817
#: stock/models.py:665 stock/models.py:1477 stock/serializers.py:450
msgid "Quantity must be greater than zero"
msgstr "Anzahl muss größer Null sein"
-#: build/models.py:867 build/serializers.py:228
+#: build/models.py:883 build/serializers.py:228
msgid "Quantity cannot be greater than the output quantity"
msgstr "Menge kann nicht größer als die Ausgangsmenge sein"
-#: build/models.py:924 build/serializers.py:533
+#: build/models.py:940 build/serializers.py:533
#, python-brace-format
msgid "Build output {serial} has not passed all required tests"
msgstr "Build Ausgabe {serial} hat nicht alle erforderlichen Tests bestanden"
-#: build/models.py:1286
+#: build/models.py:1302
msgid "Build object"
msgstr "Objekt bauen"
-#: build/models.py:1300 build/models.py:1558 build/serializers.py:210
+#: build/models.py:1316 build/models.py:1574 build/serializers.py:210
#: build/serializers.py:247 build/templates/build/build_base.html:102
#: build/templates/build/detail.html:34 common/models.py:2432
#: order/models.py:1247 order/models.py:1902 order/serializers.py:1306
@@ -1310,7 +1310,7 @@ msgstr "Objekt bauen"
#: templates/js/translated/company.js:1808
#: templates/js/translated/model_renderers.js:230
#: templates/js/translated/order.js:304 templates/js/translated/part.js:961
-#: templates/js/translated/part.js:1811 templates/js/translated/part.js:3332
+#: templates/js/translated/part.js:1811 templates/js/translated/part.js:3341
#: templates/js/translated/pricing.js:381
#: templates/js/translated/pricing.js:474
#: templates/js/translated/pricing.js:522
@@ -1330,38 +1330,38 @@ msgstr "Objekt bauen"
msgid "Quantity"
msgstr "Anzahl"
-#: build/models.py:1301
+#: build/models.py:1317
msgid "Required quantity for build order"
msgstr "Erforderliche Menge für Auftrag"
-#: build/models.py:1381
+#: build/models.py:1397
msgid "Build item must specify a build output, as master part is marked as trackable"
msgstr "Bauauftragsposition muss ein Endprodukt festlegen, da der übergeordnete Teil verfolgbar ist"
-#: build/models.py:1390
+#: build/models.py:1406
#, python-brace-format
msgid "Allocated quantity ({q}) must not exceed available stock quantity ({a})"
msgstr "Zugewiesene Menge ({q}) darf nicht verfügbare Menge ({a}) übersteigen"
-#: build/models.py:1400 order/models.py:1853
+#: build/models.py:1416 order/models.py:1853
msgid "Stock item is over-allocated"
msgstr "BestandObjekt ist zu oft zugewiesen"
-#: build/models.py:1406 order/models.py:1856
+#: build/models.py:1422 order/models.py:1856
msgid "Allocation quantity must be greater than zero"
msgstr "Reserviermenge muss größer null sein"
-#: build/models.py:1412
+#: build/models.py:1428
msgid "Quantity must be 1 for serialized stock"
msgstr "Anzahl muss 1 für Objekte mit Seriennummer sein"
-#: build/models.py:1473
+#: build/models.py:1489
msgid "Selected stock item does not match BOM line"
msgstr "Ausgewählter Lagerbestand stimmt nicht mit BOM-Linie überein"
-#: build/models.py:1545 build/serializers.py:811 order/serializers.py:1150
-#: order/serializers.py:1171 stock/serializers.py:544 stock/serializers.py:1019
-#: stock/serializers.py:1131 stock/templates/stock/item_base.html:10
+#: build/models.py:1561 build/serializers.py:811 order/serializers.py:1150
+#: order/serializers.py:1171 stock/serializers.py:544 stock/serializers.py:1025
+#: stock/serializers.py:1137 stock/templates/stock/item_base.html:10
#: stock/templates/stock/item_base.html:23
#: stock/templates/stock/item_base.html:194
#: templates/js/translated/build.js:1742
@@ -1376,19 +1376,19 @@ msgstr "Ausgewählter Lagerbestand stimmt nicht mit BOM-Linie überein"
msgid "Stock Item"
msgstr "Lagerartikel"
-#: build/models.py:1546
+#: build/models.py:1562
msgid "Source stock item"
msgstr "Quell-Lagerartikel"
-#: build/models.py:1559
+#: build/models.py:1575
msgid "Stock quantity to allocate to build"
msgstr "Anzahl an Lagerartikel dem Bauauftrag zuweisen"
-#: build/models.py:1567
+#: build/models.py:1583
msgid "Install into"
msgstr "Installiere in"
-#: build/models.py:1568
+#: build/models.py:1584
msgid "Destination stock item"
msgstr "Ziel-Lagerartikel"
@@ -1452,9 +1452,9 @@ msgid "A list of build outputs must be provided"
msgstr "Eine Liste von Endprodukten muss angegeben werden"
#: build/serializers.py:426 build/serializers.py:498 order/serializers.py:533
-#: order/serializers.py:641 order/serializers.py:1646 part/serializers.py:1086
+#: order/serializers.py:641 order/serializers.py:1646 part/serializers.py:1104
#: stock/serializers.py:472 stock/serializers.py:627 stock/serializers.py:723
-#: stock/serializers.py:1163 stock/serializers.py:1419
+#: stock/serializers.py:1169 stock/serializers.py:1425
#: stock/templates/stock/item_base.html:394
#: templates/js/translated/barcode.js:547
#: templates/js/translated/barcode.js:795 templates/js/translated/build.js:999
@@ -1494,7 +1494,7 @@ msgstr "Lagerort für fertige Endprodukte"
#: build/serializers.py:505 build/templates/build/build_base.html:151
#: build/templates/build/detail.html:62 order/models.py:910
#: order/models.py:2005 order/serializers.py:565 stock/admin.py:165
-#: stock/serializers.py:774 stock/serializers.py:1307
+#: stock/serializers.py:774 stock/serializers.py:1313
#: stock/templates/stock/item_base.html:427
#: templates/js/translated/barcode.js:252 templates/js/translated/build.js:2189
#: templates/js/translated/purchase_order.js:1308
@@ -1602,7 +1602,7 @@ msgstr "Bauauftragspositionsartikel"
msgid "bom_item.part must point to the same part as the build order"
msgstr "bom_item.part muss auf dasselbe Teil verweisen wie der Bauauftrag"
-#: build/serializers.py:817 stock/serializers.py:1032
+#: build/serializers.py:817 stock/serializers.py:1038
msgid "Item must be in stock"
msgstr "Teil muss auf Lager sein"
@@ -1659,44 +1659,45 @@ msgstr "Optionale Positionen"
msgid "Allocate optional BOM items to build order"
msgstr "Optionale Stücklisten-Positionen dem Bauauftrag hinzufügen"
-#: build/serializers.py:1096 part/models.py:3895 part/models.py:4331
+#: build/serializers.py:1097 part/models.py:3895 part/models.py:4331
#: stock/api.py:745
msgid "BOM Item"
msgstr "Stücklisten-Position"
-#: build/serializers.py:1105 templates/js/translated/index.js:130
+#: build/serializers.py:1106 templates/js/translated/index.js:130
msgid "Allocated Stock"
msgstr "Zugewiesener Bestand"
-#: build/serializers.py:1110 part/admin.py:132 part/bom.py:173
-#: part/serializers.py:1441 part/templates/part/part_base.html:210
-#: templates/js/translated/bom.js:1202 templates/js/translated/build.js:2614
-#: templates/js/translated/part.js:709 templates/js/translated/part.js:2148
+#: build/serializers.py:1111 part/admin.py:132 part/bom.py:173
+#: part/serializers.py:798 part/serializers.py:1460
+#: part/templates/part/part_base.html:210 templates/js/translated/bom.js:1208
+#: templates/js/translated/build.js:2614 templates/js/translated/part.js:709
+#: templates/js/translated/part.js:2148
#: templates/js/translated/table_filters.js:170
msgid "On Order"
msgstr "Bestellt"
-#: build/serializers.py:1115 part/serializers.py:1443
+#: build/serializers.py:1116 part/serializers.py:1462
#: templates/js/translated/build.js:2618
#: templates/js/translated/table_filters.js:360
msgid "In Production"
msgstr "In Produktion"
-#: build/serializers.py:1120 part/bom.py:172 part/serializers.py:1454
+#: build/serializers.py:1121 part/bom.py:172 part/serializers.py:1473
#: part/templates/part/part_base.html:192
#: templates/js/translated/sales_order.js:1893
msgid "Available Stock"
msgstr "Verfügbarer Bestand"
-#: build/tasks.py:149
+#: build/tasks.py:171
msgid "Stock required for build order"
msgstr "Bestand für Bauauftrag erforderlich"
-#: build/tasks.py:166
+#: build/tasks.py:188
msgid "Overdue Build Order"
msgstr "Überfälliger Bauauftrag"
-#: build/tasks.py:171
+#: build/tasks.py:193
#, python-brace-format
msgid "Build order {bo} is now overdue"
msgstr "Bauauftrag {bo} ist jetzt überfällig"
@@ -1990,27 +1991,31 @@ msgstr "Benötigte Teile bestellen"
msgid "Order Parts"
msgstr "Teile bestellen"
-#: build/templates/build/detail.html:210
+#: build/templates/build/detail.html:205
+msgid "Available stock has been filtered based on specified source location for this build order"
+msgstr "Der verfügbare Bestand wurde auf der Grundlage des angegebenen Ausgangs-Lagers für diesen Bauauftrag gefiltert"
+
+#: build/templates/build/detail.html:215
msgid "Incomplete Build Outputs"
msgstr "Unfertige Endprodukte"
-#: build/templates/build/detail.html:214
+#: build/templates/build/detail.html:219
msgid "Create new build output"
msgstr "Neues Endprodukt anlegen"
-#: build/templates/build/detail.html:215
+#: build/templates/build/detail.html:220
msgid "New Build Output"
msgstr "Neues Endprodukt"
-#: build/templates/build/detail.html:232 build/templates/build/sidebar.html:15
+#: build/templates/build/detail.html:237 build/templates/build/sidebar.html:15
msgid "Consumed Stock"
msgstr "Verbrauchte Bestände"
-#: build/templates/build/detail.html:244
+#: build/templates/build/detail.html:249
msgid "Completed Build Outputs"
msgstr "Fertiggestellte Endprodukte"
-#: build/templates/build/detail.html:256 build/templates/build/sidebar.html:19
+#: build/templates/build/detail.html:261 build/templates/build/sidebar.html:19
#: company/templates/company/detail.html:229
#: company/templates/company/manufacturer_part.html:141
#: company/templates/company/manufacturer_part_sidebar.html:9
@@ -2026,15 +2031,15 @@ msgstr "Fertiggestellte Endprodukte"
msgid "Attachments"
msgstr "Anhänge"
-#: build/templates/build/detail.html:271
+#: build/templates/build/detail.html:276
msgid "Build Notes"
msgstr "Bauauftrags-Notizen"
-#: build/templates/build/detail.html:426
+#: build/templates/build/detail.html:434
msgid "Allocation Complete"
msgstr "Zuordnung abgeschlossen"
-#: build/templates/build/detail.html:427
+#: build/templates/build/detail.html:435
msgid "All lines have been fully allocated"
msgstr "Alle Zeilen wurden vollständig zugewiesen"
@@ -2436,7 +2441,7 @@ msgid "Parts are templates by default"
msgstr "Teile sind standardmäßig Vorlagen"
#: common/models.py:1456 part/admin.py:91 part/admin.py:431 part/models.py:1015
-#: templates/js/translated/bom.js:1633
+#: templates/js/translated/bom.js:1639
#: templates/js/translated/table_filters.js:330
#: templates/js/translated/table_filters.js:721
msgid "Assembly"
@@ -2833,11 +2838,11 @@ msgstr "Erstelle eine Standardsendung für Aufträge"
#: common/models.py:1785
msgid "Edit Completed Sales Orders"
-msgstr "Abgeschlossene Verkaufsaufträge bearbeiten"
+msgstr "Abgeschlossene Aufträge bearbeiten"
#: common/models.py:1787
msgid "Allow editing of sales orders after they have been shipped or completed"
-msgstr "Bearbeitung von Verkaufsaufträgen nach Versand oder Abschluss erlauben"
+msgstr "Bearbeitung von Aufträgen nach Versand oder Abschluss erlauben"
#: common/models.py:1793
msgid "Purchase Order Reference Pattern"
@@ -3495,7 +3500,7 @@ msgstr "Die zuletzt benutzten Druckmaschinen für einen Benutzer speichern"
msgid "Price break quantity"
msgstr "Preisstaffelungs Anzahl"
-#: common/models.py:2440 company/serializers.py:484 order/admin.py:42
+#: common/models.py:2440 company/serializers.py:486 order/admin.py:42
#: order/models.py:1321 order/models.py:2226
#: templates/js/translated/company.js:1813 templates/js/translated/part.js:1885
#: templates/js/translated/pricing.js:621
@@ -3972,7 +3977,7 @@ msgstr "Teil auswählen"
#: company/models.py:495 company/templates/company/company_base.html:76
#: company/templates/company/manufacturer_part.html:90
-#: company/templates/company/supplier_part.html:145 part/serializers.py:497
+#: company/templates/company/supplier_part.html:145 part/serializers.py:505
#: stock/templates/stock/item_base.html:207
#: templates/js/translated/company.js:506
#: templates/js/translated/company.js:1108
@@ -3987,7 +3992,7 @@ msgid "Select manufacturer"
msgstr "Hersteller auswählen"
#: company/models.py:502 company/templates/company/manufacturer_part.html:101
-#: company/templates/company/supplier_part.html:153 part/serializers.py:507
+#: company/templates/company/supplier_part.html:153 part/serializers.py:515
#: templates/js/translated/company.js:351
#: templates/js/translated/company.js:1107
#: templates/js/translated/company.js:1302
@@ -4059,7 +4064,7 @@ msgstr "Verlinktes Herstellerteil muss dasselbe Basisteil referenzieren"
#: company/models.py:795 company/templates/company/company_base.html:81
#: company/templates/company/supplier_part.html:129 order/models.py:453
#: order/templates/order/order_base.html:136 part/bom.py:272 part/bom.py:310
-#: part/serializers.py:481 plugin/builtin/suppliers/digikey.py:25
+#: part/serializers.py:489 plugin/builtin/suppliers/digikey.py:25
#: plugin/builtin/suppliers/lcsc.py:26 plugin/builtin/suppliers/mouser.py:24
#: plugin/builtin/suppliers/tme.py:26 stock/templates/stock/item_base.html:224
#: templates/email/overdue_purchase_order.html:16
@@ -4076,7 +4081,7 @@ msgstr "Zulieferer"
msgid "Select supplier"
msgstr "Zulieferer auswählen"
-#: company/models.py:802 part/serializers.py:492
+#: company/models.py:802 part/serializers.py:500
msgid "Supplier stock keeping unit"
msgstr "Lagerbestandseinheit (SKU) des Zulieferers"
@@ -4112,7 +4117,7 @@ msgid "Minimum charge (e.g. stocking fee)"
msgstr "Mindestpreis"
#: company/models.py:851 company/templates/company/supplier_part.html:160
-#: stock/admin.py:224 stock/models.py:785 stock/serializers.py:1317
+#: stock/admin.py:224 stock/models.py:785 stock/serializers.py:1323
#: stock/templates/stock/item_base.html:240
#: templates/js/translated/company.js:1636
#: templates/js/translated/stock.js:2387
@@ -4157,7 +4162,7 @@ msgstr "Verfügbarkeit aktualisiert"
msgid "Date of last update of availability data"
msgstr "Datum des letzten Updates der Verfügbarkeitsdaten"
-#: company/serializers.py:153
+#: company/serializers.py:155
msgid "Default currency used for this supplier"
msgstr "Standard-Währung für diesen Zulieferer"
@@ -4218,7 +4223,7 @@ msgstr "Bild löschen"
#: company/templates/company/company_base.html:86 order/models.py:898
#: order/models.py:1993 order/templates/order/return_order_base.html:131
#: order/templates/order/sales_order_base.html:144 stock/models.py:807
-#: stock/models.py:808 stock/serializers.py:1067
+#: stock/models.py:808 stock/serializers.py:1073
#: stock/templates/stock/item_base.html:405
#: templates/email/overdue_sales_order.html:16
#: templates/js/translated/company.js:502
@@ -4429,8 +4434,9 @@ msgstr "Keine Herstellerdaten verfügbar"
#: company/templates/company/manufacturer_part.html:119
#: company/templates/company/supplier_part.html:15 company/views.py:31
-#: part/admin.py:122 part/templates/part/part_sidebar.html:33
-#: templates/InvenTree/search.html:190 templates/navbar.html:48
+#: part/admin.py:122 part/serializers.py:802
+#: part/templates/part/part_sidebar.html:33 templates/InvenTree/search.html:190
+#: templates/navbar.html:48
msgid "Suppliers"
msgstr "Zulieferer"
@@ -4528,7 +4534,7 @@ msgid "No supplier information available"
msgstr "Keine Lieferanteninformationen verfügbar"
#: company/templates/company/supplier_part.html:139 part/bom.py:279
-#: part/bom.py:311 part/serializers.py:491
+#: part/bom.py:311 part/serializers.py:499
#: templates/js/translated/company.js:349 templates/js/translated/part.js:1786
#: templates/js/translated/pricing.js:510
#: templates/js/translated/purchase_order.js:1851
@@ -4577,10 +4583,12 @@ msgstr "Barcode mit Zulieferteil verknüpfen"
msgid "Update Part Availability"
msgstr "Verfügbarkeit der Teile aktualisieren"
-#: company/templates/company/supplier_part_sidebar.html:5 part/stocktake.py:223
+#: company/templates/company/supplier_part_sidebar.html:5
+#: part/serializers.py:801 part/stocktake.py:223
#: part/templates/part/category.html:183
#: part/templates/part/category_sidebar.html:17 stock/admin.py:69
-#: stock/serializers.py:760 stock/templates/stock/location.html:170
+#: stock/serializers.py:760 stock/serializers.py:924
+#: stock/templates/stock/location.html:170
#: stock/templates/stock/location.html:184
#: stock/templates/stock/location.html:196
#: stock/templates/stock/location_sidebar.html:7
@@ -4640,7 +4648,7 @@ msgid "Label template file"
msgstr "Label-Vorlage-Datei"
#: label/models.py:143 part/models.py:3484 report/models.py:322
-#: templates/js/translated/part.js:2891
+#: templates/js/translated/part.js:2900
#: templates/js/translated/table_filters.js:481
msgid "Enabled"
msgstr "Aktiviert"
@@ -5693,7 +5701,7 @@ msgstr "Bestelldetails"
#: order/templates/order/sales_order_base.html:60
msgid "Print sales order report"
-msgstr "Verkaufsauftragsbericht drucken"
+msgstr "Auftragsbericht drucken"
#: order/templates/order/sales_order_base.html:88
#: order/templates/order/sales_order_base.html:89
@@ -5717,7 +5725,7 @@ msgstr "Abgeschlossene Sendungen"
#: order/templates/order/sales_order_base.html:312
msgid "Sales Order QR Code"
-msgstr "Verkaufsauftrag QR-Code"
+msgstr "Auftrag QR-Code"
#: order/templates/order/sales_order_base.html:324
msgid "Link Barcode to Sales Order"
@@ -5733,7 +5741,7 @@ msgid "Pending Shipments"
msgstr "Ausstehende Sendungen"
#: order/templates/order/sales_order_detail.html:71
-#: templates/js/translated/bom.js:1271 templates/js/translated/filters.js:296
+#: templates/js/translated/bom.js:1277 templates/js/translated/filters.js:296
msgid "Actions"
msgstr "Aktionen"
@@ -5861,10 +5869,10 @@ msgstr "Name des übergeordneten Teils"
msgid "Category Path"
msgstr "Pfad zur Kategorie"
-#: part/admin.py:323 part/models.py:390 part/serializers.py:259
-#: part/serializers.py:373 part/templates/part/cat_link.html:3
-#: part/templates/part/category.html:23 part/templates/part/category.html:141
-#: part/templates/part/category.html:161
+#: part/admin.py:323 part/models.py:390 part/serializers.py:112
+#: part/serializers.py:265 part/serializers.py:381
+#: part/templates/part/cat_link.html:3 part/templates/part/category.html:23
+#: part/templates/part/category.html:141 part/templates/part/category.html:161
#: part/templates/part/category_sidebar.html:9
#: templates/InvenTree/index.html:36 templates/InvenTree/search.html:84
#: templates/InvenTree/settings/sidebar.html:47
@@ -5889,13 +5897,13 @@ msgstr "Übergeordnete IPN"
msgid "Part IPN"
msgstr "Teil IPN"
-#: part/admin.py:421 part/serializers.py:1220
+#: part/admin.py:421 part/serializers.py:1238
#: templates/js/translated/pricing.js:358
#: templates/js/translated/pricing.js:1024
msgid "Minimum Price"
msgstr "Niedrigster Preis"
-#: part/admin.py:426 part/serializers.py:1235
+#: part/admin.py:426 part/serializers.py:1253
#: templates/js/translated/pricing.js:353
#: templates/js/translated/pricing.js:1032
msgid "Maximum Price"
@@ -5974,7 +5982,7 @@ msgid "This option must be selected"
msgstr "Diese Option muss ausgewählt werden"
#: part/api.py:1541 part/models.py:895 part/models.py:3385 part/models.py:3831
-#: part/serializers.py:388 part/serializers.py:1076
+#: part/serializers.py:396 part/serializers.py:1094
#: part/templates/part/part_base.html:260 stock/api.py:733
#: templates/InvenTree/settings/settings_staff_js.html:300
#: templates/js/translated/notification.js:60
@@ -5982,12 +5990,17 @@ msgstr "Diese Option muss ausgewählt werden"
msgid "Category"
msgstr "Kategorie"
+#: part/api.py:1828
+msgid "Uses"
+msgstr "Verwendet"
+
#: part/bom.py:170 part/models.py:100 part/models.py:938
#: part/templates/part/category.html:116 part/templates/part/part_base.html:367
msgid "Default Location"
msgstr "Standard-Lagerort"
-#: part/bom.py:171 templates/email/low_stock_notification.html:16
+#: part/bom.py:171 part/serializers.py:803
+#: templates/email/low_stock_notification.html:16
msgid "Total Stock"
msgstr "Gesamtbestand"
@@ -6010,7 +6023,8 @@ msgstr "Teil-Kategorien"
msgid "Default location for parts in this category"
msgstr "Standard-Lagerort für Teile dieser Kategorie"
-#: part/models.py:106 stock/models.py:165 templates/js/translated/stock.js:2736
+#: part/models.py:106 stock/models.py:165 templates/js/translated/part.js:2810
+#: templates/js/translated/stock.js:2736
#: templates/js/translated/table_filters.js:239
#: templates/js/translated/table_filters.js:283
msgid "Structural"
@@ -6048,12 +6062,12 @@ msgstr "Ungültige Auswahl für übergeordnetes Teil"
#: part/models.py:531 part/models.py:538
#, python-brace-format
msgid "Part '{self}' cannot be used in BOM for '{parent}' (recursive)"
-msgstr "Teil '{self}' kann im BOM nicht für '{parent}' (rekursiv) verwendet werden"
+msgstr "Teil '{self}' kann in der Stückliste nicht für '{parent}' (rekursiv) verwendet werden"
#: part/models.py:550
#, python-brace-format
msgid "Part '{parent}' is used in BOM for '{self}' (recursive)"
-msgstr "Teil '{parent}' wird im BOM für '{self}' (rekursiv) verwendet"
+msgstr "Teil '{parent}' wird in der Stückliste für '{self}' (rekursiv) verwendet"
#: part/models.py:615
#, python-brace-format
@@ -6418,7 +6432,7 @@ msgstr "Test-Vorlagen können nur für verfolgbare Teile angelegt werden"
msgid "Test with this name already exists for this part"
msgstr "Ein Test mit diesem Namen besteht bereits für dieses Teil"
-#: part/models.py:3464 templates/js/translated/part.js:2870
+#: part/models.py:3464 templates/js/translated/part.js:2879
msgid "Test Name"
msgstr "Test-Name"
@@ -6446,7 +6460,7 @@ msgstr "Beschreibung für diesen Test eingeben"
msgid "Is this test enabled?"
msgstr "Ist dieser Test aktiviert?"
-#: part/models.py:3489 templates/js/translated/part.js:2899
+#: part/models.py:3489 templates/js/translated/part.js:2908
#: templates/js/translated/table_filters.js:477
msgid "Required"
msgstr "Benötigt"
@@ -6455,7 +6469,7 @@ msgstr "Benötigt"
msgid "Is this test required to pass?"
msgstr "Muss dieser Test erfolgreich sein?"
-#: part/models.py:3495 templates/js/translated/part.js:2907
+#: part/models.py:3495 templates/js/translated/part.js:2916
msgid "Requires Value"
msgstr "Erfordert Wert"
@@ -6463,7 +6477,7 @@ msgstr "Erfordert Wert"
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:3501 templates/js/translated/part.js:2914
+#: part/models.py:3501 templates/js/translated/part.js:2923
msgid "Requires Attachment"
msgstr "Anhang muss eingegeben werden"
@@ -6685,311 +6699,323 @@ msgstr "Teil-Beziehung kann nicht zwischen einem Teil und sich selbst erstellt w
msgid "Duplicate relationship already exists"
msgstr "Doppelte Beziehung existiert bereits"
-#: part/serializers.py:128 part/templates/part/category.html:122
-#: part/templates/part/category.html:207
+#: part/serializers.py:114 part/serializers.py:134
+#: part/templates/part/category.html:122 part/templates/part/category.html:207
#: part/templates/part/category_sidebar.html:7
msgid "Subcategories"
msgstr "Unter-Kategorien"
-#: part/serializers.py:172
+#: part/serializers.py:178
msgid "Results"
msgstr "Ergebnisse"
-#: part/serializers.py:173
+#: part/serializers.py:179
msgid "Number of results recorded against this template"
msgstr "Anzahl der Ergebnisse, die in dieser Vorlage aufgezeichnet wurden"
-#: part/serializers.py:197 part/serializers.py:215 stock/serializers.py:384
+#: part/serializers.py:203 part/serializers.py:221 stock/serializers.py:384
msgid "Purchase currency of this stock item"
msgstr "Kaufwährung dieses Lagerartikels"
-#: part/serializers.py:260
+#: part/serializers.py:266
msgid "Number of parts using this template"
msgstr "Anzahl der Teile, die diese Vorlage verwenden"
-#: part/serializers.py:379
+#: part/serializers.py:387
msgid "No parts selected"
msgstr "Keine Teile ausgewählt"
-#: part/serializers.py:389
+#: part/serializers.py:397
msgid "Select category"
msgstr "Kategorie auswählen"
-#: part/serializers.py:419
+#: part/serializers.py:427
msgid "Original Part"
msgstr "Originalteil"
-#: part/serializers.py:420
+#: part/serializers.py:428
msgid "Select original part to duplicate"
msgstr "Originalteil zum Duplizieren auswählen"
-#: part/serializers.py:425
+#: part/serializers.py:433
msgid "Copy Image"
msgstr "Bild kopieren"
-#: part/serializers.py:426
+#: part/serializers.py:434
msgid "Copy image from original part"
msgstr "Bild vom Originalteil kopieren"
-#: part/serializers.py:432 part/templates/part/detail.html:277
+#: part/serializers.py:440 part/templates/part/detail.html:277
msgid "Copy BOM"
msgstr "Stückliste kopieren"
-#: part/serializers.py:433
+#: part/serializers.py:441
msgid "Copy bill of materials from original part"
msgstr "Stückliste vom Originalteil kopieren"
-#: part/serializers.py:439
+#: part/serializers.py:447
msgid "Copy Parameters"
msgstr "Parameter kopieren"
-#: part/serializers.py:440
+#: part/serializers.py:448
msgid "Copy parameter data from original part"
msgstr "Parameterdaten vom Originalteil kopieren"
-#: part/serializers.py:446
+#: part/serializers.py:454
msgid "Copy Notes"
msgstr "Anmerkungen kopieren"
-#: part/serializers.py:447
+#: part/serializers.py:455
msgid "Copy notes from original part"
msgstr "Notizen aus Originalteil kopieren"
-#: part/serializers.py:460
+#: part/serializers.py:468
msgid "Initial Stock Quantity"
msgstr "Start-Bestandsmenge"
-#: part/serializers.py:462
+#: part/serializers.py:470
msgid "Specify initial stock quantity for this Part. If quantity is zero, no stock is added."
msgstr "Initiale Lagermenge für dieses Teil. Wenn die Menge null ist, wird kein Lagerbestand hinzugefügt."
-#: part/serializers.py:469
+#: part/serializers.py:477
msgid "Initial Stock Location"
msgstr "Initialer Lagerort"
-#: part/serializers.py:470
+#: part/serializers.py:478
msgid "Specify initial stock location for this Part"
msgstr "Lagerstandort für dieses Teil angeben"
-#: part/serializers.py:482
+#: part/serializers.py:490
msgid "Select supplier (or leave blank to skip)"
msgstr "Lieferant auswählen (oder leer lassen, um zu überspringen)"
-#: part/serializers.py:498
+#: part/serializers.py:506
msgid "Select manufacturer (or leave blank to skip)"
msgstr "Hersteller auswählen (oder leer lassen, um zu überspringen)"
-#: part/serializers.py:508
+#: part/serializers.py:516
msgid "Manufacturer part number"
msgstr "Hersteller-Teilenummer"
-#: part/serializers.py:515
+#: part/serializers.py:523
msgid "Selected company is not a valid supplier"
msgstr "Ausgewählte Firma ist kein gültiger Lieferant"
-#: part/serializers.py:524
+#: part/serializers.py:532
msgid "Selected company is not a valid manufacturer"
msgstr "Ausgewählte Firma ist kein gültiger Hersteller"
-#: part/serializers.py:535
+#: part/serializers.py:543
msgid "Manufacturer part matching this MPN already exists"
msgstr "Herstellerteil mit dieser MPN existiert bereits"
-#: part/serializers.py:542
+#: part/serializers.py:550
msgid "Supplier part matching this SKU already exists"
msgstr "Lieferantenteil mit dieser SKU existiert bereits"
-#: part/serializers.py:815 part/templates/part/copy_part.html:9
+#: part/serializers.py:804
+msgid "External Stock"
+msgstr "Externes Lager"
+
+#: part/serializers.py:806
+msgid "Unallocated Stock"
+msgstr "Nicht zugewiesenes Lager"
+
+#: part/serializers.py:808
+msgid "Variant Stock"
+msgstr "Alternatives Lager"
+
+#: part/serializers.py:833 part/templates/part/copy_part.html:9
#: templates/js/translated/part.js:471
msgid "Duplicate Part"
msgstr "Teil duplizieren"
-#: part/serializers.py:816
+#: part/serializers.py:834
msgid "Copy initial data from another Part"
msgstr "Initiale Daten von anderem Teil kopieren"
-#: part/serializers.py:822 templates/js/translated/part.js:102
+#: part/serializers.py:840 templates/js/translated/part.js:102
msgid "Initial Stock"
msgstr "Initialer Lagerbestand"
-#: part/serializers.py:823
+#: part/serializers.py:841
msgid "Create Part with initial stock quantity"
msgstr "Erstelle Teil mit Ausgangsbestand"
-#: part/serializers.py:829
+#: part/serializers.py:847
msgid "Supplier Information"
msgstr "Lieferanteninformationen"
-#: part/serializers.py:830
+#: part/serializers.py:848
msgid "Add initial supplier information for this part"
msgstr "Lieferanteninformationen zu diesem Teil hinzufügen"
-#: part/serializers.py:838
+#: part/serializers.py:856
msgid "Copy Category Parameters"
msgstr "Kategorieparameter kopieren"
-#: part/serializers.py:839
+#: part/serializers.py:857
msgid "Copy parameter templates from selected part category"
msgstr "Parametervorlagen aus der ausgewählten Teilkategorie kopieren"
-#: part/serializers.py:844
+#: part/serializers.py:862
msgid "Existing Image"
msgstr "Vorhandenes Bild"
-#: part/serializers.py:845
+#: part/serializers.py:863
msgid "Filename of an existing part image"
msgstr "Dateiname eines vorhandenen Teilbildes"
-#: part/serializers.py:862
+#: part/serializers.py:880
msgid "Image file does not exist"
msgstr "Bilddatei existiert nicht"
-#: part/serializers.py:1068
+#: part/serializers.py:1086
msgid "Limit stocktake report to a particular part, and any variant parts"
msgstr "Inventurbericht auf ein bestimmtes Teil und alle Variantenteile beschränken"
-#: part/serializers.py:1078
+#: part/serializers.py:1096
msgid "Limit stocktake report to a particular part category, and any child categories"
msgstr "Inventurbericht auf eine bestimmte Teilekategorie und alle untergeordneten Kategorien beschränken"
-#: part/serializers.py:1088
+#: part/serializers.py:1106
msgid "Limit stocktake report to a particular stock location, and any child locations"
msgstr "Inventurbericht auf einen bestimmten Lagerort und alle untergeordneten Lagerorte beschränken"
-#: part/serializers.py:1094
+#: part/serializers.py:1112
msgid "Exclude External Stock"
msgstr "Externen Bestand ausschließen"
-#: part/serializers.py:1095
+#: part/serializers.py:1113
msgid "Exclude stock items in external locations"
msgstr "Lagerartikel an externen Orten ausschließen"
-#: part/serializers.py:1100
+#: part/serializers.py:1118
msgid "Generate Report"
msgstr "Bericht generieren"
-#: part/serializers.py:1101
+#: part/serializers.py:1119
msgid "Generate report file containing calculated stocktake data"
msgstr "Erstelle Berichtsdatei mit berechneten Inventurdaten"
-#: part/serializers.py:1106
+#: part/serializers.py:1124
msgid "Update Parts"
msgstr "Teile aktualisieren"
-#: part/serializers.py:1107
+#: part/serializers.py:1125
msgid "Update specified parts with calculated stocktake data"
msgstr "Angegebene Teile mit berechneten Inventurdaten aktualisieren"
-#: part/serializers.py:1115
+#: part/serializers.py:1133
msgid "Stocktake functionality is not enabled"
msgstr "Inventur-Funktionalität ist nicht aktiviert"
-#: part/serializers.py:1221
+#: part/serializers.py:1239
msgid "Override calculated value for minimum price"
msgstr "Berechneten Wert für Mindestpreis überschreiben"
-#: part/serializers.py:1228
+#: part/serializers.py:1246
msgid "Minimum price currency"
msgstr "Mindestpreis Währung"
-#: part/serializers.py:1236
+#: part/serializers.py:1254
msgid "Override calculated value for maximum price"
msgstr "Berechneten Wert für maximalen Preis überschreiben"
-#: part/serializers.py:1243
+#: part/serializers.py:1261
msgid "Maximum price currency"
msgstr "Maximalpreis Währung"
-#: part/serializers.py:1272
+#: part/serializers.py:1290
msgid "Update"
msgstr "Aktualisieren"
-#: part/serializers.py:1273
+#: part/serializers.py:1291
msgid "Update pricing for this part"
msgstr "Preis für dieses Teil aktualisieren"
-#: part/serializers.py:1296
+#: part/serializers.py:1314
#, python-brace-format
msgid "Could not convert from provided currencies to {default_currency}"
msgstr "Konnte nicht von den angegebenen Währungen in {default_currency} umrechnen"
-#: part/serializers.py:1303
+#: part/serializers.py:1321
msgid "Minimum price must not be greater than maximum price"
msgstr "Mindestpreis darf nicht größer als der Maximalpreis sein"
-#: part/serializers.py:1306
+#: part/serializers.py:1324
msgid "Maximum price must not be less than minimum price"
msgstr "Der Maximalpreis darf nicht kleiner als der Mindestpreis sein"
-#: part/serializers.py:1632
+#: part/serializers.py:1660
msgid "Select part to copy BOM from"
msgstr "Teil auswählen, von dem Stückliste kopiert wird"
-#: part/serializers.py:1640
+#: part/serializers.py:1668
msgid "Remove Existing Data"
msgstr "Bestehende Daten entfernen"
-#: part/serializers.py:1641
+#: part/serializers.py:1669
msgid "Remove existing BOM items before copying"
msgstr "Bestehende Stücklisten-Positionen vor dem Kopieren entfernen"
-#: part/serializers.py:1646
+#: part/serializers.py:1674
msgid "Include Inherited"
msgstr "Vererbtes einschließen"
-#: part/serializers.py:1647
+#: part/serializers.py:1675
msgid "Include BOM items which are inherited from templated parts"
msgstr "Stücklisten-Positionen einbeziehen, die von Vorlage-Teilen geerbt werden"
-#: part/serializers.py:1652
+#: part/serializers.py:1680
msgid "Skip Invalid Rows"
msgstr "Ungültige Zeilen überspringen"
-#: part/serializers.py:1653
+#: part/serializers.py:1681
msgid "Enable this option to skip invalid rows"
msgstr "Aktiviere diese Option, um ungültige Zeilen zu überspringen"
-#: part/serializers.py:1658
+#: part/serializers.py:1686
msgid "Copy Substitute Parts"
msgstr "Ersatzteile kopieren"
-#: part/serializers.py:1659
+#: part/serializers.py:1687
msgid "Copy substitute parts when duplicate BOM items"
msgstr "Ersatzteile beim Duplizieren von Stücklisten-Positionen kopieren"
-#: part/serializers.py:1693
+#: part/serializers.py:1721
msgid "Clear Existing BOM"
msgstr "Bestehende Stückliste löschen"
-#: part/serializers.py:1694
+#: part/serializers.py:1722
msgid "Delete existing BOM items before uploading"
msgstr "Bestehende Stücklisten-Positionen vor dem Importieren entfernen"
-#: part/serializers.py:1724
+#: part/serializers.py:1752
msgid "No part column specified"
msgstr "Keine Teilspalte angegeben"
-#: part/serializers.py:1768
+#: part/serializers.py:1796
msgid "Multiple matching parts found"
msgstr "Mehrere übereinstimmende Teile gefunden"
-#: part/serializers.py:1771
+#: part/serializers.py:1799
msgid "No matching part found"
msgstr "Keine passenden Teile gefunden"
-#: part/serializers.py:1774
+#: part/serializers.py:1802
msgid "Part is not designated as a component"
msgstr "Teil ist nicht als Komponente angelegt"
-#: part/serializers.py:1783
+#: part/serializers.py:1811
msgid "Quantity not provided"
msgstr "Menge nicht angegeben"
-#: part/serializers.py:1791
+#: part/serializers.py:1819
msgid "Invalid quantity"
msgstr "Ungültige Menge"
-#: part/serializers.py:1812
+#: part/serializers.py:1840
msgid "At least one BOM item is required"
msgstr "Mindestens eine Stückliste-Position ist erforderlich"
@@ -7221,7 +7247,7 @@ msgid "Validate BOM"
msgstr "Stückliste überprüfen"
#: part/templates/part/detail.html:283 part/templates/part/detail.html:284
-#: templates/js/translated/bom.js:1314 templates/js/translated/bom.js:1315
+#: templates/js/translated/bom.js:1320 templates/js/translated/bom.js:1321
msgid "Add BOM Item"
msgstr "Stücklisten-Position hinzufügen"
@@ -7405,7 +7431,7 @@ msgstr "Zu Bauaufträgen zugeordnet"
msgid "Allocated to Sales Orders"
msgstr "Zur Bestellung zugeordnet"
-#: part/templates/part/part_base.html:235 templates/js/translated/bom.js:1213
+#: part/templates/part/part_base.html:235 templates/js/translated/bom.js:1219
msgid "Can Build"
msgstr "Herstellbar"
@@ -7872,15 +7898,15 @@ msgstr "Labeldruck fehlgeschlagen"
#: plugin/base/label/mixins.py:63
msgid "Error rendering label to PDF"
-msgstr "Fehler beim Rendern des Labels als PDF"
+msgstr "Fehler beim Rendern des Etikett als PDF"
#: plugin/base/label/mixins.py:76
msgid "Error rendering label to HTML"
-msgstr "Fehler beim Rendern des Labels als HTML"
+msgstr "Fehler beim Rendern des Etikett als HTML"
#: plugin/base/label/mixins.py:111
msgid "Error rendering label to PNG"
-msgstr "Fehler beim Rendern des Labels als PNG"
+msgstr "Fehler beim Rendern des Etikett als PNG"
#: plugin/builtin/barcodes/inventree_barcode.py:25
msgid "InvenTree Barcodes"
@@ -7981,7 +8007,7 @@ msgstr "Optionen"
#: plugin/builtin/labels/label_sheet.py:29
msgid "Page size for the label sheet"
-msgstr "Seitengröße für das Labelblatt"
+msgstr "Seitengröße für das Etikett"
#: plugin/builtin/labels/label_sheet.py:34
msgid "Skip Labels"
@@ -8077,7 +8103,7 @@ msgstr "Nur Mitarbeiter können Plugins verwalten"
#: plugin/installer.py:197
msgid "Plugin installation is disabled"
-msgstr ""
+msgstr "Plugin-Installation ist deaktiviert"
#: plugin/installer.py:248
msgid "Installed plugin successfully"
@@ -8102,7 +8128,7 @@ msgstr "Plugin-Paketname nicht gefunden"
#: plugin/installer.py:299
msgid "Plugin uninstalling is disabled"
-msgstr ""
+msgstr "Plugin-Deinstallation ist deaktiviert"
#: plugin/installer.py:303
msgid "Plugin cannot be uninstalled as it is currently active"
@@ -8488,7 +8514,7 @@ msgstr "Seriennummer"
#: report/templates/report/inventree_slr_report.html:97
msgid "Stock location items"
-msgstr "Lagerstandort Elemente"
+msgstr "Lagerstandorte"
#: report/templates/report/inventree_test_report_base.html:21
msgid "Stock Item Test Report"
@@ -8641,7 +8667,7 @@ msgstr "Externer Standort"
#: stock/api.py:753
msgid "Part Tree"
-msgstr "Teilbaum"
+msgstr "Teile-Baum"
#: stock/api.py:781
msgid "Expiry date before"
@@ -8784,7 +8810,7 @@ msgstr "Passendes Zuliefererteil für diesen Lagerartikel auswählen"
msgid "Where is this stock item located?"
msgstr "Wo wird dieses Teil normalerweise gelagert?"
-#: stock/models.py:786 stock/serializers.py:1318
+#: stock/models.py:786 stock/serializers.py:1324
msgid "Packaging this stock item is stored in"
msgstr "Verpackung, in der dieser Lagerartikel gelagert ist"
@@ -8796,7 +8822,7 @@ msgstr "Ist dieses Teil in einem anderen verbaut?"
msgid "Serial number for this item"
msgstr "Seriennummer für dieses Teil"
-#: stock/models.py:830 stock/serializers.py:1301
+#: stock/models.py:830 stock/serializers.py:1307
msgid "Batch code for this stock item"
msgstr "Losnummer für diesen Lagerartikel"
@@ -8905,7 +8931,7 @@ msgstr "Lagerartikel wird aktuell produziert"
msgid "Serialized stock cannot be merged"
msgstr "Nachverfolgbare Lagerartikel können nicht zusammengeführt werden"
-#: stock/models.py:1639 stock/serializers.py:1207
+#: stock/models.py:1639 stock/serializers.py:1213
msgid "Duplicate stock items"
msgstr "Artikel duplizeren"
@@ -8986,7 +9012,7 @@ msgstr "Anzahl darf nicht die verfügbare Menge überschreiten ({q})"
msgid "Enter serial numbers for new items"
msgstr "Seriennummern für neue Teile eingeben"
-#: stock/serializers.py:473 stock/serializers.py:1164 stock/serializers.py:1420
+#: stock/serializers.py:473 stock/serializers.py:1170 stock/serializers.py:1426
msgid "Destination stock location"
msgstr "Ziel-Bestand"
@@ -9008,7 +9034,7 @@ msgstr "Zu installierende Menge"
#: stock/serializers.py:553
msgid "Enter the quantity of items to install"
-msgstr ""
+msgstr "Anzahl der zu verwendenden Artikel eingeben"
#: stock/serializers.py:558 stock/serializers.py:633 stock/serializers.py:729
#: stock/serializers.py:779
@@ -9017,7 +9043,7 @@ msgstr " Transaktionsnotizen hinzufügen (optional)"
#: stock/serializers.py:566
msgid "Quantity to install must be at least 1"
-msgstr ""
+msgstr "Die zu verwendende Menge muss mindestens 1 sein"
#: stock/serializers.py:574
msgid "Stock item is unavailable"
@@ -9029,7 +9055,7 @@ msgstr "Ausgewähltes Teil ist nicht in der Stückliste"
#: stock/serializers.py:593
msgid "Quantity to install must not exceed available quantity"
-msgstr ""
+msgstr "Die zu verwendende Menge darf die verfügbare Menge nicht überschreiten"
#: stock/serializers.py:628
msgid "Destination location for uninstalled item"
@@ -9045,7 +9071,7 @@ msgstr "Das ausgewählte Teil ist keine gültige Option für die Umwandlung"
#: stock/serializers.py:693
msgid "Cannot convert stock item with assigned SupplierPart"
-msgstr ""
+msgstr "Lagerartikel konnte nicht mit Zulieferteil zugewiesen werden"
#: stock/serializers.py:724
msgid "Destination location for returned item"
@@ -9059,77 +9085,78 @@ msgstr "Lagerartikel auswählen, um den Status zu ändern"
msgid "No stock items selected"
msgstr "Keine Lagerartikel ausgewählt"
-#: stock/serializers.py:863 stock/templates/stock/location.html:165
+#: stock/serializers.py:863 stock/serializers.py:926
+#: stock/templates/stock/location.html:165
#: stock/templates/stock/location.html:213
#: stock/templates/stock/location_sidebar.html:5
msgid "Sublocations"
msgstr "Unter-Lagerorte"
-#: stock/serializers.py:1036
+#: stock/serializers.py:1042
msgid "Part must be salable"
msgstr "Teil muss verkaufbar sein"
-#: stock/serializers.py:1040
+#: stock/serializers.py:1046
msgid "Item is allocated to a sales order"
msgstr "Artikel ist einem Kundenauftrag zugeordnet"
-#: stock/serializers.py:1044
+#: stock/serializers.py:1050
msgid "Item is allocated to a build order"
msgstr "Artikel ist einem Fertigungsauftrag zugeordnet"
-#: stock/serializers.py:1068
+#: stock/serializers.py:1074
msgid "Customer to assign stock items"
msgstr "Kunde zum Zuweisen von Lagerartikel"
-#: stock/serializers.py:1074
+#: stock/serializers.py:1080
msgid "Selected company is not a customer"
msgstr "Ausgewählte Firma ist kein Kunde"
-#: stock/serializers.py:1082
+#: stock/serializers.py:1088
msgid "Stock assignment notes"
msgstr "Notizen zur Lagerzuordnung"
-#: stock/serializers.py:1092 stock/serializers.py:1346
+#: stock/serializers.py:1098 stock/serializers.py:1352
msgid "A list of stock items must be provided"
msgstr "Eine Liste der Lagerbestände muss angegeben werden"
-#: stock/serializers.py:1171
+#: stock/serializers.py:1177
msgid "Stock merging notes"
msgstr "Notizen zur Lagerartikelzusammenführung"
-#: stock/serializers.py:1176
+#: stock/serializers.py:1182
msgid "Allow mismatched suppliers"
msgstr "Unterschiedliche Lieferanten erlauben"
-#: stock/serializers.py:1177
+#: stock/serializers.py:1183
msgid "Allow stock items with different supplier parts to be merged"
msgstr "Zusammenführen von Lagerartikeln mit unterschiedlichen Lieferanten erlauben"
-#: stock/serializers.py:1182
+#: stock/serializers.py:1188
msgid "Allow mismatched status"
msgstr "Unterschiedliche Status erlauben"
-#: stock/serializers.py:1183
+#: stock/serializers.py:1189
msgid "Allow stock items with different status codes to be merged"
msgstr "Zusammenführen von Lagerartikeln mit unterschiedlichen Status-Codes erlauben"
-#: stock/serializers.py:1193
+#: stock/serializers.py:1199
msgid "At least two stock items must be provided"
msgstr "Mindestens zwei Lagerartikel müssen angegeben werden"
-#: stock/serializers.py:1260
+#: stock/serializers.py:1266
msgid "No Change"
msgstr "Keine Änderung"
-#: stock/serializers.py:1289
+#: stock/serializers.py:1295
msgid "StockItem primary key value"
msgstr "Primärschlüssel Lagerelement"
-#: stock/serializers.py:1308
+#: stock/serializers.py:1314
msgid "Stock item status code"
-msgstr ""
+msgstr "Lagerartikel Status-Code"
-#: stock/serializers.py:1336
+#: stock/serializers.py:1342
msgid "Stock transaction notes"
msgstr "Bestandsbewegungsnotizen"
@@ -9475,7 +9502,7 @@ msgstr "Lagerort"
#: stock/templates/stock/location.html:315
msgid "Scanned stock container into this location"
-msgstr ""
+msgstr "Lagerbehälter an diesen Ort eingescannt"
#: stock/templates/stock/location.html:388
msgid "Stock Location QR Code"
@@ -9483,7 +9510,7 @@ msgstr "Lagerort QR-Code"
#: stock/templates/stock/location.html:399
msgid "Link Barcode to Stock Location"
-msgstr ""
+msgstr "Barcode mit Lagerort verknüpfen"
#: stock/templates/stock/stock_app_base.html:16
msgid "Loading..."
@@ -9569,7 +9596,7 @@ msgstr "Neueste Teile"
#: templates/InvenTree/index.html:77
msgid "BOM Waiting Validation"
-msgstr ""
+msgstr "Ausstehende Überprüfung der Stückliste"
#: templates/InvenTree/index.html:106
msgid "Recently Updated"
@@ -9577,7 +9604,7 @@ msgstr "Kürzlich aktualisiert"
#: templates/InvenTree/index.html:134
msgid "Depleted Stock"
-msgstr ""
+msgstr "Verbrauchter Bestand"
#: templates/InvenTree/index.html:148
msgid "Required for Build Orders"
@@ -9589,7 +9616,7 @@ msgstr "Abgelaufener Bestand"
#: templates/InvenTree/index.html:172
msgid "Stale Stock"
-msgstr ""
+msgstr "Veralteter Bestand"
#: templates/InvenTree/index.html:199
msgid "Build Orders In Progress"
@@ -10376,7 +10403,7 @@ msgstr "Aktualisierung verfügbar"
#: templates/about.html:43
msgid "Commit Branch"
-msgstr ""
+msgstr "Commit-Branch"
#: templates/about.html:49
msgid "InvenTree Documentation"
@@ -10662,7 +10689,7 @@ msgid "The following parts are low on required stock"
msgstr "Bei den folgenden Teilen gibt es wenige Lagerartikel"
#: templates/email/build_order_required_stock.html:18
-#: templates/js/translated/bom.js:1668 templates/js/translated/build.js:2557
+#: templates/js/translated/bom.js:1674 templates/js/translated/build.js:2557
msgid "Required Quantity"
msgstr "Benötigte Menge"
@@ -10676,7 +10703,7 @@ msgid "Click on the following link to view this part"
msgstr "Klicken Sie auf den folgenden Link, um diesen Teil anzuzeigen"
#: templates/email/low_stock_notification.html:18
-#: templates/js/translated/part.js:3209
+#: templates/js/translated/part.js:3218
msgid "Minimum Quantity"
msgstr "Mindestmenge"
@@ -10702,7 +10729,7 @@ msgstr ""
#: templates/js/translated/api.js:238 templates/js/translated/modals.js:1141
msgid "Authentication credentials not supplied"
-msgstr ""
+msgstr "Anmeldeinformationen nicht angegeben"
#: templates/js/translated/api.js:242 templates/js/translated/modals.js:1145
msgid "Error 403: Permission Denied"
@@ -10710,7 +10737,7 @@ msgstr ""
#: templates/js/translated/api.js:243 templates/js/translated/modals.js:1146
msgid "You do not have the required permissions to access this function"
-msgstr ""
+msgstr "Sie haben nicht die erforderliche Berechtigung auf diesen Inhalt zuzugreifen"
#: templates/js/translated/api.js:247 templates/js/translated/modals.js:1150
msgid "Error 404: Resource Not Found"
@@ -10750,7 +10777,7 @@ msgstr ""
#: templates/js/translated/api.js:266
msgid "Error code"
-msgstr ""
+msgstr "Fehlercode"
#: templates/js/translated/attachment.js:114
msgid "All selected attachments will be deleted"
@@ -10766,7 +10793,7 @@ msgstr "Anhänge löschen"
#: templates/js/translated/attachment.js:253
msgid "Attachment actions"
-msgstr "Anhang Aktionen"
+msgstr "Anhang-Aktionen"
#: templates/js/translated/attachment.js:275
msgid "No attachments found"
@@ -10823,7 +10850,7 @@ msgstr ""
#: templates/js/translated/barcode.js:372
msgid "Scan barcode data"
-msgstr ""
+msgstr "Barcode Daten scannen"
#: templates/js/translated/barcode.js:420 templates/navbar.html:114
msgid "Scan Barcode"
@@ -10831,7 +10858,7 @@ msgstr "Barcode scannen"
#: templates/js/translated/barcode.js:458
msgid "No URL in response"
-msgstr ""
+msgstr "Keine URL in der Antwort"
#: templates/js/translated/barcode.js:498
msgid "This will remove the link to the associated barcode"
@@ -10839,77 +10866,77 @@ msgstr "Dadurch wird der Link zu dem zugehörigen Barcode entfernt"
#: templates/js/translated/barcode.js:504
msgid "Unlink"
-msgstr ""
+msgstr "Verknüpfung aufheben"
#: templates/js/translated/barcode.js:567 templates/js/translated/stock.js:1155
msgid "Remove stock item"
-msgstr ""
+msgstr "Lagerartikel entfernen"
#: templates/js/translated/barcode.js:610
msgid "Scan Stock Items Into Location"
-msgstr ""
+msgstr "Artikel per Barcode-Scan zu Lagerort hinzufügen"
#: templates/js/translated/barcode.js:612
msgid "Scan stock item barcode to check in to this location"
-msgstr ""
+msgstr "Barcode des Lagerartikels scannen um ihn an diesen Ort hinzuzufügen"
#: templates/js/translated/barcode.js:615
#: templates/js/translated/barcode.js:812
msgid "Check In"
-msgstr ""
+msgstr "Einbuchen"
#: templates/js/translated/barcode.js:647
msgid "No barcode provided"
-msgstr ""
+msgstr "Kein Barcode vorhanden"
#: templates/js/translated/barcode.js:687
msgid "Stock Item already scanned"
-msgstr ""
+msgstr "Lagerartikel bereits gescannt"
#: templates/js/translated/barcode.js:691
msgid "Stock Item already in this location"
-msgstr ""
+msgstr "Lagerartikel bereits an diesem Standort vorhanden"
#: templates/js/translated/barcode.js:698
msgid "Added stock item"
-msgstr ""
+msgstr "Lagerartikel hinzugefügt"
#: templates/js/translated/barcode.js:707
msgid "Barcode does not match valid stock item"
-msgstr ""
+msgstr "Barcode entspricht keinem Lagerartikel"
#: templates/js/translated/barcode.js:726
msgid "Scan Stock Container Into Location"
-msgstr ""
+msgstr "Lagerbehälter an diesen Ort einscannen"
#: templates/js/translated/barcode.js:728
msgid "Scan stock container barcode to check in to this location"
-msgstr ""
+msgstr "Barcode des Lagerbehälters scannen um ihn an diesen Ort hinzuzufügen"
#: templates/js/translated/barcode.js:762
msgid "Barcode does not match valid stock location"
-msgstr ""
+msgstr "Barcode entspricht keinem gültigen Lagerort"
#: templates/js/translated/barcode.js:806
msgid "Check Into Location"
-msgstr ""
+msgstr "Zu Lagerort hinzufügen"
#: templates/js/translated/barcode.js:875
#: templates/js/translated/barcode.js:884
msgid "Barcode does not match a valid location"
-msgstr ""
+msgstr "Barcode entspricht keinem Lagerort"
#: templates/js/translated/bom.js:78
msgid "Create BOM Item"
-msgstr ""
+msgstr "Stücklisten-Position anlegen"
#: templates/js/translated/bom.js:132
msgid "Display row data"
-msgstr ""
+msgstr "Zeilendaten anzeigen"
#: templates/js/translated/bom.js:188
msgid "Row Data"
-msgstr ""
+msgstr "Zeilendaten"
#: templates/js/translated/bom.js:189 templates/js/translated/bom.js:700
#: templates/js/translated/modals.js:74 templates/js/translated/modals.js:628
@@ -10925,19 +10952,19 @@ msgstr "Vorlage einer Stückliste herunterladen"
#: templates/js/translated/bom.js:351
msgid "Multi Level BOM"
-msgstr ""
+msgstr "Mehrstufige Stückliste"
#: templates/js/translated/bom.js:352
msgid "Include BOM data for subassemblies"
-msgstr ""
+msgstr "Stücklistendaten für Untergruppen einbeziehen"
#: templates/js/translated/bom.js:357
msgid "Levels"
-msgstr ""
+msgstr "Stufen"
#: templates/js/translated/bom.js:358
msgid "Select maximum number of BOM levels to export (0 = all levels)"
-msgstr ""
+msgstr "Wählen Sie die maximale Anzahl an zu exportierenden Stücklistenstufen (0 = alle Stufen)"
#: templates/js/translated/bom.js:365
msgid "Include Alternative Parts"
@@ -10961,7 +10988,7 @@ msgstr "Bestand einschließen"
#: templates/js/translated/bom.js:378
msgid "Include part stock data in exported BOM"
-msgstr ""
+msgstr "Teilebestand in exportierte Stückliste einbeziehen"
#: templates/js/translated/bom.js:383
msgid "Include Manufacturer Data"
@@ -11033,7 +11060,7 @@ msgstr "Ersatzteile verfügbar"
#: templates/js/translated/bom.js:950 templates/js/translated/build.js:2501
msgid "Variant stock allowed"
-msgstr ""
+msgstr "Alternatives Lager erlaubt"
#: templates/js/translated/bom.js:1014
msgid "Substitutes"
@@ -11041,136 +11068,140 @@ msgstr "Ersatzteile"
#: templates/js/translated/bom.js:1139
msgid "BOM pricing is complete"
-msgstr ""
+msgstr "Stücklistenpreise sind vollständig"
#: templates/js/translated/bom.js:1144
msgid "BOM pricing is incomplete"
-msgstr ""
+msgstr "Stücklistenpreise sind vollständig"
#: templates/js/translated/bom.js:1151
msgid "No pricing available"
msgstr "Keine Preisinformation verfügbar"
-#: templates/js/translated/bom.js:1182 templates/js/translated/build.js:2596
+#: templates/js/translated/bom.js:1184 templates/js/translated/build.js:2622
+msgid "External stock"
+msgstr "Externes Lager"
+
+#: templates/js/translated/bom.js:1188 templates/js/translated/build.js:2596
#: templates/js/translated/sales_order.js:1910
msgid "No Stock Available"
msgstr "Kein Lagerbestand verfügbar"
-#: templates/js/translated/bom.js:1187 templates/js/translated/build.js:2600
+#: templates/js/translated/bom.js:1193 templates/js/translated/build.js:2600
msgid "Includes variant and substitute stock"
-msgstr ""
+msgstr "Alternatives Lager und Ersatzteillager einschließen"
-#: templates/js/translated/bom.js:1189 templates/js/translated/build.js:2602
+#: templates/js/translated/bom.js:1195 templates/js/translated/build.js:2602
#: templates/js/translated/part.js:1256
#: templates/js/translated/sales_order.js:1907
msgid "Includes variant stock"
-msgstr ""
+msgstr "Alternatives Lager einschließen"
-#: templates/js/translated/bom.js:1191 templates/js/translated/build.js:2604
+#: templates/js/translated/bom.js:1197 templates/js/translated/build.js:2604
msgid "Includes substitute stock"
-msgstr ""
+msgstr "Ersatzteillager einschließen"
-#: templates/js/translated/bom.js:1219 templates/js/translated/build.js:2587
+#: templates/js/translated/bom.js:1225 templates/js/translated/build.js:2587
msgid "Consumable item"
msgstr "Verbrauchsartikel"
-#: templates/js/translated/bom.js:1279
+#: templates/js/translated/bom.js:1285
msgid "Validate BOM Item"
msgstr "Stücklisten-Position kontrollieren"
-#: templates/js/translated/bom.js:1281
+#: templates/js/translated/bom.js:1287
msgid "This line has been validated"
msgstr "Diese Position wurde kontrolliert"
-#: templates/js/translated/bom.js:1283
+#: templates/js/translated/bom.js:1289
msgid "Edit substitute parts"
msgstr "Ersatzteile bearbeiten"
-#: templates/js/translated/bom.js:1285 templates/js/translated/bom.js:1480
+#: templates/js/translated/bom.js:1291 templates/js/translated/bom.js:1486
msgid "Edit BOM Item"
msgstr "Stücklisten-Position bearbeiten"
-#: templates/js/translated/bom.js:1287
+#: templates/js/translated/bom.js:1293
msgid "Delete BOM Item"
msgstr "Stücklisten-Position löschen"
-#: templates/js/translated/bom.js:1307
+#: templates/js/translated/bom.js:1313
msgid "View BOM"
msgstr "Stückliste anzeigen"
-#: templates/js/translated/bom.js:1391
+#: templates/js/translated/bom.js:1397
msgid "No BOM items found"
-msgstr ""
+msgstr "Keine Stücklisten-Position(en) gefunden"
-#: templates/js/translated/bom.js:1651 templates/js/translated/build.js:2486
+#: templates/js/translated/bom.js:1657 templates/js/translated/build.js:2486
msgid "Required Part"
-msgstr ""
+msgstr "Benötigtes Teil"
-#: templates/js/translated/bom.js:1677
+#: templates/js/translated/bom.js:1683
msgid "Inherited from parent BOM"
-msgstr ""
+msgstr "Von übergeordneter Stückliste geerbt"
#: templates/js/translated/build.js:142
msgid "Edit Build Order"
-msgstr ""
+msgstr "Bauauftrag bearbeiten"
#: templates/js/translated/build.js:190
msgid "Create Build Order"
-msgstr ""
+msgstr "Bauauftrag erstellen"
#: templates/js/translated/build.js:222
msgid "Cancel Build Order"
-msgstr ""
+msgstr "Bauauftrag abbrechen"
#: templates/js/translated/build.js:231
msgid "Are you sure you wish to cancel this build?"
-msgstr ""
+msgstr "Sind Sie sicher, dass sie diesen Bauauftrag abbrechen möchten?"
#: templates/js/translated/build.js:237
msgid "Stock items have been allocated to this build order"
-msgstr ""
+msgstr "Lagerartikel wurden zu diesem Bauauftrag hinzugefügt"
#: templates/js/translated/build.js:244
msgid "There are incomplete outputs remaining for this build order"
-msgstr ""
+msgstr "Es sind noch unvollständige Artikel für diesen Bauauftrag vorhanden"
#: templates/js/translated/build.js:296
msgid "Build order is ready to be completed"
-msgstr ""
+msgstr "Bauauftrag ist bereit abgeschlossen zu werden"
#: templates/js/translated/build.js:304
msgid "This build order cannot be completed as there are incomplete outputs"
-msgstr ""
+msgstr "Dieser Bauauftrag kann nicht abgeschlossen werden, da es unfertige Endprodukte gibt"
#: templates/js/translated/build.js:309
msgid "Build Order is incomplete"
-msgstr ""
+msgstr "Bauauftrag ist unvollständig"
#: templates/js/translated/build.js:327
msgid "Complete Build Order"
-msgstr ""
+msgstr "Bauauftrag fertigstellen"
#: templates/js/translated/build.js:368 templates/js/translated/stock.js:119
#: templates/js/translated/stock.js:294
msgid "Next available serial number"
-msgstr ""
+msgstr "Nächste verfügbare Seriennummer"
#: templates/js/translated/build.js:370 templates/js/translated/stock.js:121
#: templates/js/translated/stock.js:296
msgid "Latest serial number"
-msgstr ""
+msgstr "Letzte Seriennummer"
#: templates/js/translated/build.js:379
msgid "The Bill of Materials contains trackable parts"
-msgstr ""
+msgstr "Die Stückliste enthält verfolgbare Teile"
#: templates/js/translated/build.js:380
msgid "Build outputs must be generated individually"
-msgstr ""
+msgstr "Endprodukte müssen individuell angelegt werden"
#: templates/js/translated/build.js:388
msgid "Trackable parts can have serial numbers specified"
-msgstr ""
+msgstr "Nachverfolgbare Teile können Seriennummern haben"
#: templates/js/translated/build.js:389
msgid "Enter serial numbers to generate multiple single build outputs"
@@ -11178,94 +11209,94 @@ msgstr ""
#: templates/js/translated/build.js:396
msgid "Create Build Output"
-msgstr ""
+msgstr "Endprodukt anlegen"
#: templates/js/translated/build.js:427
msgid "Allocate stock items to this build output"
-msgstr ""
+msgstr "Lagerartikel zu diesem Endprodukt zuweisen"
#: templates/js/translated/build.js:435
msgid "Deallocate stock from build output"
-msgstr ""
+msgstr "Bestand von Endprodukt entfernen"
#: templates/js/translated/build.js:444
msgid "Complete build output"
-msgstr ""
+msgstr "Endprodukt fertigstellen"
#: templates/js/translated/build.js:452
msgid "Scrap build output"
-msgstr ""
+msgstr "Ausschuss Endprodukt"
#: templates/js/translated/build.js:459
msgid "Delete build output"
-msgstr ""
+msgstr "Endprodukt entfernen"
#: templates/js/translated/build.js:479
msgid "Are you sure you wish to deallocate the selected stock items from this build?"
-msgstr ""
+msgstr "Sind Sie sicher, dass sie alle Lagerartikel von diesem Bauauftrag entfernen möchten?"
#: templates/js/translated/build.js:497
msgid "Deallocate Stock Items"
-msgstr ""
+msgstr "Lagerartikel entfernen"
#: templates/js/translated/build.js:583 templates/js/translated/build.js:711
#: templates/js/translated/build.js:837
msgid "Select Build Outputs"
-msgstr ""
+msgstr "Endprodukte auswählen"
#: templates/js/translated/build.js:584 templates/js/translated/build.js:712
#: templates/js/translated/build.js:838
msgid "At least one build output must be selected"
-msgstr ""
+msgstr "Mindestens ein Endprodukt muss ausgewählt werden"
#: templates/js/translated/build.js:598
msgid "Selected build outputs will be marked as complete"
-msgstr ""
+msgstr "Ausgewählte Endprodukte werden als vollständig markiert"
#: templates/js/translated/build.js:602 templates/js/translated/build.js:736
#: templates/js/translated/build.js:860
msgid "Output"
-msgstr ""
+msgstr "Endprodukt"
#: templates/js/translated/build.js:630
msgid "Complete Build Outputs"
-msgstr ""
+msgstr "Endprodukte fertigstellen"
#: templates/js/translated/build.js:727
msgid "Selected build outputs will be marked as scrapped"
-msgstr ""
+msgstr "Ausgewählte Endprodukte werden als Ausschuss markiert"
#: templates/js/translated/build.js:729
msgid "Scrapped output are marked as rejected"
-msgstr ""
+msgstr "Ausschuss wird als verworfen markiert"
#: templates/js/translated/build.js:730
msgid "Allocated stock items will no longer be available"
-msgstr ""
+msgstr "Zugewiesene Lagerbestände werden nicht mehr verfügbar sein"
#: templates/js/translated/build.js:731
msgid "The completion status of the build order will not be adjusted"
-msgstr ""
+msgstr "Der Fertigstellungsstatus des Bauauftrags wird nicht angepasst"
#: templates/js/translated/build.js:762
msgid "Scrap Build Outputs"
-msgstr ""
+msgstr "Ausschuss Endprodukte"
#: templates/js/translated/build.js:852
msgid "Selected build outputs will be deleted"
-msgstr ""
+msgstr "Ausgewählte Endprodukte werden gelöscht"
#: templates/js/translated/build.js:854
msgid "Build output data will be permanently deleted"
-msgstr ""
+msgstr "Endprodukte werden dauerhaft gelöscht"
#: templates/js/translated/build.js:855
msgid "Allocated stock items will be returned to stock"
-msgstr ""
+msgstr "Zugewiesene Lagerartikel werden in den Bestand zurückgeführt"
#: templates/js/translated/build.js:873
msgid "Delete Build Outputs"
-msgstr ""
+msgstr "Endprodukte entfernen"
#: templates/js/translated/build.js:960
msgid "No build order allocations found"
@@ -11273,205 +11304,205 @@ msgstr ""
#: templates/js/translated/build.js:989 templates/js/translated/build.js:2342
msgid "Allocated Quantity"
-msgstr ""
+msgstr "Zugewiesene Menge"
#: templates/js/translated/build.js:1003
msgid "Location not specified"
-msgstr ""
+msgstr "Standort nicht angegeben"
#: templates/js/translated/build.js:1025
msgid "Complete outputs"
-msgstr ""
+msgstr "Endprodukte fertigstellen"
#: templates/js/translated/build.js:1043
msgid "Scrap outputs"
-msgstr ""
+msgstr "Ausschuss"
#: templates/js/translated/build.js:1061
msgid "Delete outputs"
-msgstr ""
+msgstr "Endprodukte löschen"
#: templates/js/translated/build.js:1115
msgid "build output"
-msgstr ""
+msgstr "Endprodukt"
#: templates/js/translated/build.js:1116
msgid "build outputs"
-msgstr ""
+msgstr "Endprodukte"
#: templates/js/translated/build.js:1120
msgid "Build output actions"
-msgstr ""
+msgstr "Endprodukt-Aktionen"
#: templates/js/translated/build.js:1294
msgid "No active build outputs found"
-msgstr ""
+msgstr "Keine aktiven Endprodukte gefunden"
#: templates/js/translated/build.js:1387
msgid "Allocated Lines"
-msgstr ""
+msgstr "Zugewiesene Positionen"
#: templates/js/translated/build.js:1401
msgid "Required Tests"
-msgstr ""
+msgstr "Erforderliche Prüfungen"
#: templates/js/translated/build.js:1573
#: templates/js/translated/purchase_order.js:611
#: templates/js/translated/sales_order.js:1171
msgid "Select Parts"
-msgstr ""
+msgstr "Teile auswählen"
#: templates/js/translated/build.js:1574
#: templates/js/translated/sales_order.js:1172
msgid "You must select at least one part to allocate"
-msgstr ""
+msgstr "Sie müssen mindestens einen Teil für die Zuweisung auswählen"
#: templates/js/translated/build.js:1637
#: templates/js/translated/sales_order.js:1121
msgid "Specify stock allocation quantity"
-msgstr ""
+msgstr "Anzahl für Bestandszuordnung eingeben"
#: templates/js/translated/build.js:1714
msgid "All Parts Allocated"
-msgstr ""
+msgstr "Alle Teile zugeordnet"
#: templates/js/translated/build.js:1715
msgid "All selected parts have been fully allocated"
-msgstr ""
+msgstr "Alle ausgewählten Teile wurden vollständig zugeordnet"
#: templates/js/translated/build.js:1729
#: templates/js/translated/sales_order.js:1186
msgid "Select source location (leave blank to take from all locations)"
-msgstr ""
+msgstr "Wählen Sie den Quellort aus (leer lassen, um von allen Standorten zu nehmen)"
#: templates/js/translated/build.js:1757
msgid "Allocate Stock Items to Build Order"
-msgstr ""
+msgstr "Lagerartikel für Bauauftrag zuweisen"
#: templates/js/translated/build.js:1768
#: templates/js/translated/sales_order.js:1283
msgid "No matching stock locations"
-msgstr ""
+msgstr "Keine passenden Lagerstandorte"
#: templates/js/translated/build.js:1841
#: templates/js/translated/sales_order.js:1362
msgid "No matching stock items"
-msgstr ""
+msgstr "Keine passenden Lagerartikel"
#: templates/js/translated/build.js:1938
msgid "Automatic Stock Allocation"
-msgstr ""
+msgstr "Automatische Lagerzuordnung"
#: templates/js/translated/build.js:1939
msgid "Stock items will be automatically allocated to this build order, according to the provided guidelines"
-msgstr ""
+msgstr "Lagerartikel werden automatisch diesem Bauauftrag zugewiesen, entsprechend den angegebenen Richtlinien"
#: templates/js/translated/build.js:1941
msgid "If a location is specified, stock will only be allocated from that location"
-msgstr ""
+msgstr "Wenn ein Lagerort angegeben ist, wird der Lagerbestand nur von diesem Ort zugewiesen"
#: templates/js/translated/build.js:1942
msgid "If stock is considered interchangeable, it will be allocated from the first location it is found"
-msgstr ""
+msgstr "Wenn der Lagerbestand als austauschbar gilt, wird er vom ersten Standort zugewiesen, an dem er gefunden wird"
#: templates/js/translated/build.js:1943
msgid "If substitute stock is allowed, it will be used where stock of the primary part cannot be found"
-msgstr ""
+msgstr "Wenn ein Ersatzlager zugelassen ist, wird dieses verwendet, wenn das Primärteil nicht vorrätig ist"
#: templates/js/translated/build.js:1974
msgid "Allocate Stock Items"
-msgstr ""
+msgstr "Lagerartikel zuordnen"
#: templates/js/translated/build.js:2080
msgid "No builds matching query"
-msgstr ""
+msgstr "Keine Bauaufträge zur Suchanfrage"
#: templates/js/translated/build.js:2115 templates/js/translated/build.js:2480
#: templates/js/translated/forms.js:2155 templates/js/translated/forms.js:2171
#: templates/js/translated/part.js:2316 templates/js/translated/part.js:2742
#: templates/js/translated/stock.js:1946 templates/js/translated/stock.js:2674
msgid "Select"
-msgstr ""
+msgstr "Auswählen"
#: templates/js/translated/build.js:2129
msgid "Build order is overdue"
-msgstr ""
+msgstr "Bauauftrag ist überfällig"
#: templates/js/translated/build.js:2175
msgid "Progress"
-msgstr ""
+msgstr "Fortschritt"
#: templates/js/translated/build.js:2211 templates/js/translated/stock.js:3006
msgid "No user information"
-msgstr ""
+msgstr "Keine Benutzerinformation"
#: templates/js/translated/build.js:2387
#: templates/js/translated/sales_order.js:1646
msgid "Edit stock allocation"
-msgstr ""
+msgstr "Bestands-Zuordnung bearbeiten"
#: templates/js/translated/build.js:2388
#: templates/js/translated/sales_order.js:1647
msgid "Delete stock allocation"
-msgstr ""
+msgstr "Bestands-Zuordnung löschen"
#: templates/js/translated/build.js:2403
msgid "Edit Allocation"
-msgstr ""
+msgstr "Zuordnung bearbeiten"
#: templates/js/translated/build.js:2415
msgid "Remove Allocation"
-msgstr ""
+msgstr "Zuordnung entfernen"
#: templates/js/translated/build.js:2456
msgid "build line"
-msgstr ""
+msgstr "Bauauftragsposition"
#: templates/js/translated/build.js:2457
msgid "build lines"
-msgstr ""
+msgstr "Bauauftragspositionen"
#: templates/js/translated/build.js:2475
msgid "No build lines found"
-msgstr ""
+msgstr "Keine Bauauftragspositionen gefunden"
#: templates/js/translated/build.js:2505 templates/js/translated/part.js:790
#: templates/js/translated/part.js:1202
msgid "Trackable part"
-msgstr ""
+msgstr "Nachverfolgbares Teil"
#: templates/js/translated/build.js:2540
msgid "Unit Quantity"
-msgstr ""
+msgstr "Menge"
#: templates/js/translated/build.js:2592
#: templates/js/translated/sales_order.js:1915
msgid "Sufficient stock available"
-msgstr ""
+msgstr "Ausreichender Bestand vorhanden"
-#: templates/js/translated/build.js:2643
+#: templates/js/translated/build.js:2647
msgid "Consumable Item"
-msgstr ""
+msgstr "Verbrauchsartikel"
-#: templates/js/translated/build.js:2648
+#: templates/js/translated/build.js:2652
msgid "Tracked item"
-msgstr ""
+msgstr "Verfolgtes Objekt"
-#: templates/js/translated/build.js:2655
+#: templates/js/translated/build.js:2659
#: templates/js/translated/sales_order.js:2016
msgid "Build stock"
msgstr ""
-#: templates/js/translated/build.js:2660 templates/js/translated/stock.js:1829
+#: templates/js/translated/build.js:2664 templates/js/translated/stock.js:1829
msgid "Order stock"
msgstr ""
-#: templates/js/translated/build.js:2664
+#: templates/js/translated/build.js:2668
#: templates/js/translated/sales_order.js:2010
msgid "Allocate stock"
msgstr ""
-#: templates/js/translated/build.js:2668
+#: templates/js/translated/build.js:2672
msgid "Remove stock allocation"
msgstr ""
@@ -11516,7 +11547,7 @@ msgstr "Teile geliefert"
#: templates/js/translated/company.js:545
msgid "Parts Manufactured"
-msgstr ""
+msgstr "Hersteller-Teile"
#: templates/js/translated/company.js:560
msgid "No company information found"
@@ -11628,7 +11659,7 @@ msgstr "Herstellerteile löschen"
#: templates/js/translated/company.js:1230
msgid "Manufacturer part actions"
-msgstr ""
+msgstr "Herstellerteil-Aktionen"
#: templates/js/translated/company.js:1249
msgid "No manufacturer parts found"
@@ -11728,11 +11759,11 @@ msgstr ""
#: templates/js/translated/filters.js:214
msgid "Select filter"
-msgstr ""
+msgstr "Filter auswählen"
#: templates/js/translated/filters.js:437
msgid "Print Labels"
-msgstr ""
+msgstr "Etiketten drucken"
#: templates/js/translated/filters.js:441
msgid "Print Reports"
@@ -11785,7 +11816,7 @@ msgstr ""
#: templates/js/translated/forms.js:903
msgid "Enter a valid number"
-msgstr ""
+msgstr "Gib eine gültige Nummer ein"
#: templates/js/translated/forms.js:1473 templates/modals.html:19
#: templates/modals.html:43
@@ -11794,27 +11825,27 @@ msgstr "Fehler in Formular"
#: templates/js/translated/forms.js:1971
msgid "No results found"
-msgstr ""
+msgstr "Keine Ergebnisse gefunden"
#: templates/js/translated/forms.js:2275 templates/js/translated/search.js:239
msgid "Searching"
-msgstr ""
+msgstr "Suche"
#: templates/js/translated/forms.js:2489
msgid "Clear input"
-msgstr ""
+msgstr "Eingabe löschen"
#: templates/js/translated/forms.js:3075
msgid "File Column"
-msgstr ""
+msgstr "Dateispalte"
#: templates/js/translated/forms.js:3075
msgid "Field Name"
-msgstr ""
+msgstr "Feldname"
#: templates/js/translated/forms.js:3087
msgid "Select Columns"
-msgstr ""
+msgstr "Spalten auswählen"
#: templates/js/translated/helpers.js:77
msgid "YES"
@@ -11838,15 +11869,15 @@ msgstr ""
#: templates/js/translated/label.js:53 templates/js/translated/report.js:123
msgid "Select Items"
-msgstr ""
+msgstr "Elemente auswählen"
#: templates/js/translated/label.js:54
msgid "No items selected for printing"
-msgstr ""
+msgstr "Keine Elemente zum Drucken ausgewählt"
#: templates/js/translated/label.js:72
msgid "No Labels Found"
-msgstr ""
+msgstr "Keine Etiketten gefunden"
#: templates/js/translated/label.js:73
msgid "No label templates found which match the selected items"
@@ -11854,31 +11885,31 @@ msgstr ""
#: templates/js/translated/label.js:97
msgid "selected"
-msgstr ""
+msgstr "ausgewählt"
#: templates/js/translated/label.js:133
msgid "Printing Options"
-msgstr ""
+msgstr "Druckoptionen"
#: templates/js/translated/label.js:148
msgid "Print label"
-msgstr ""
+msgstr "Etikett drucken"
#: templates/js/translated/label.js:148
msgid "Print labels"
-msgstr ""
+msgstr "Etiketten drucken"
#: templates/js/translated/label.js:149
msgid "Print"
-msgstr ""
+msgstr "Drucken"
#: templates/js/translated/label.js:155
msgid "Select label template"
-msgstr ""
+msgstr "Etiketten-Vorlage auswählen"
#: templates/js/translated/label.js:168
msgid "Select plugin"
-msgstr ""
+msgstr "Plugin auswählen"
#: templates/js/translated/label.js:187
msgid "Labels sent to printer"
@@ -11929,7 +11960,7 @@ msgstr ""
#: templates/js/translated/modals.js:1120
msgid "JSON response missing form data"
-msgstr ""
+msgstr "JSON Antwort enthält keine Formulardaten"
#: templates/js/translated/modals.js:1135
msgid "Error 400: Bad Request"
@@ -11979,7 +12010,7 @@ msgstr "Benachrichtigungen erscheinen hier"
#: templates/js/translated/order.js:89
msgid "Add Extra Line Item"
-msgstr ""
+msgstr "Zusätzliche Position hinzufügen"
#: templates/js/translated/order.js:126
msgid "Export Order"
@@ -11987,32 +12018,32 @@ msgstr "Bestellung exportieren"
#: templates/js/translated/order.js:241
msgid "Duplicate Line"
-msgstr ""
+msgstr "Position duplizieren"
#: templates/js/translated/order.js:255
msgid "Edit Line"
-msgstr ""
+msgstr "Postion bearbeiten"
#: templates/js/translated/order.js:268
msgid "Delete Line"
-msgstr ""
+msgstr "Position löschen"
#: templates/js/translated/order.js:281
#: templates/js/translated/purchase_order.js:1991
msgid "No line items found"
-msgstr ""
+msgstr "Keine Postionen gefunden"
#: templates/js/translated/order.js:369
msgid "Duplicate line"
-msgstr ""
+msgstr "Postionen duplizieren"
#: templates/js/translated/order.js:370
msgid "Edit line"
-msgstr ""
+msgstr "Position bearbeiten"
#: templates/js/translated/order.js:374
msgid "Delete line"
-msgstr ""
+msgstr "Position löschen"
#: templates/js/translated/part.js:90
msgid "Part Attributes"
@@ -12144,7 +12175,7 @@ msgstr ""
#: templates/js/translated/part.js:619
msgid "Validating the BOM will mark each line item as valid"
-msgstr ""
+msgstr "Die Stückliste zu validieren markiert jede Position als gültig"
#: templates/js/translated/part.js:629
msgid "Validate Bill of Materials"
@@ -12245,12 +12276,12 @@ msgstr ""
#: templates/js/translated/return_order.js:756
#: templates/js/translated/sales_order.js:1875
msgid "This line item is overdue"
-msgstr ""
+msgstr "Diese Position ist überfällig"
#: templates/js/translated/part.js:1906
#: templates/js/translated/purchase_order.js:2221
msgid "Receive line item"
-msgstr ""
+msgstr "Position empfangen"
#: templates/js/translated/part.js:1969
msgid "Delete part relationship"
@@ -12313,64 +12344,64 @@ msgstr ""
msgid "Subscribed category"
msgstr ""
-#: templates/js/translated/part.js:2855
+#: templates/js/translated/part.js:2864
msgid "No test templates matching query"
msgstr ""
-#: templates/js/translated/part.js:2877 templates/js/translated/search.js:342
+#: templates/js/translated/part.js:2886 templates/js/translated/search.js:342
msgid "results"
msgstr ""
-#: templates/js/translated/part.js:2927 templates/js/translated/stock.js:1446
+#: templates/js/translated/part.js:2936 templates/js/translated/stock.js:1446
msgid "Edit test result"
msgstr ""
-#: templates/js/translated/part.js:2928 templates/js/translated/stock.js:1447
+#: templates/js/translated/part.js:2937 templates/js/translated/stock.js:1447
#: templates/js/translated/stock.js:1692
msgid "Delete test result"
msgstr ""
-#: templates/js/translated/part.js:2932
+#: templates/js/translated/part.js:2941
msgid "This test is defined for a parent part"
msgstr ""
-#: templates/js/translated/part.js:2948
+#: templates/js/translated/part.js:2957
msgid "Edit Test Result Template"
msgstr ""
-#: templates/js/translated/part.js:2962
+#: templates/js/translated/part.js:2971
msgid "Delete Test Result Template"
msgstr ""
-#: templates/js/translated/part.js:3041 templates/js/translated/part.js:3042
+#: templates/js/translated/part.js:3050 templates/js/translated/part.js:3051
msgid "No date specified"
msgstr ""
-#: templates/js/translated/part.js:3044
+#: templates/js/translated/part.js:3053
msgid "Specified date is in the past"
msgstr ""
-#: templates/js/translated/part.js:3050
+#: templates/js/translated/part.js:3059
msgid "Speculative"
msgstr ""
-#: templates/js/translated/part.js:3100
+#: templates/js/translated/part.js:3109
msgid "No scheduling information available for this part"
msgstr ""
-#: templates/js/translated/part.js:3106
+#: templates/js/translated/part.js:3115
msgid "Error fetching scheduling information for this part"
msgstr ""
-#: templates/js/translated/part.js:3202
+#: templates/js/translated/part.js:3211
msgid "Scheduled Stock Quantities"
msgstr ""
-#: templates/js/translated/part.js:3218
+#: templates/js/translated/part.js:3227
msgid "Maximum Quantity"
-msgstr ""
+msgstr "Maximale Menge"
-#: templates/js/translated/part.js:3263
+#: templates/js/translated/part.js:3272
msgid "Minimum Stock Level"
msgstr ""
@@ -12468,19 +12499,19 @@ msgstr ""
#: templates/js/translated/purchase_order.js:176
msgid "Duplicate Line Items"
-msgstr ""
+msgstr "Positionen duplizieren"
#: templates/js/translated/purchase_order.js:177
msgid "Duplicate all line items from the selected order"
-msgstr ""
+msgstr "Alle Positionen der ausgewählten Bestellung duplizieren"
#: templates/js/translated/purchase_order.js:184
msgid "Duplicate Extra Lines"
-msgstr ""
+msgstr "Zusätzliche Positionen duplizieren"
#: templates/js/translated/purchase_order.js:185
msgid "Duplicate extra line items from the selected order"
-msgstr ""
+msgstr "Zusätzliche Positionen der ausgewählten Bestellung duplizieren"
#: templates/js/translated/purchase_order.js:206
msgid "Edit Purchase Order"
@@ -12502,16 +12533,16 @@ msgstr ""
#: templates/js/translated/purchase_order.js:454
msgid "All line items have been received"
-msgstr ""
+msgstr "Alle Positionen wurden erhalten"
#: templates/js/translated/purchase_order.js:459
msgid "This order has line items which have not been marked as received."
-msgstr ""
+msgstr "Diese Bestellung enthält Positionen, die nicht als empfangen markiert wurden."
#: templates/js/translated/purchase_order.js:460
#: templates/js/translated/sales_order.js:514
msgid "Completing this order means that the order and line items will no longer be editable."
-msgstr ""
+msgstr "Fertigstellen dieser Bestellung bedeutet, dass sie ihre Positionen nicht länger bearbeiten können."
#: templates/js/translated/purchase_order.js:483
msgid "Cancel Purchase Order"
@@ -12528,7 +12559,7 @@ msgstr ""
#: templates/js/translated/purchase_order.js:515
#: templates/js/translated/return_order.js:164
msgid "After placing this order, line items will no longer be editable."
-msgstr ""
+msgstr "Nachdem diese Bestellung platziert ist, können die Positionen nicht länger bearbeitet werden."
#: templates/js/translated/purchase_order.js:520
msgid "Issue Purchase Order"
@@ -12540,7 +12571,7 @@ msgstr ""
#: templates/js/translated/purchase_order.js:637
msgid "Quantity to order"
-msgstr ""
+msgstr "Zu bestellende Menge"
#: templates/js/translated/purchase_order.js:646
msgid "New supplier part"
@@ -12568,20 +12599,20 @@ msgstr ""
#: templates/js/translated/purchase_order.js:1073
msgid "Select Line Items"
-msgstr ""
+msgstr "Positionen auswählen"
#: templates/js/translated/purchase_order.js:1074
#: templates/js/translated/return_order.js:492
msgid "At least one line item must be selected"
-msgstr ""
+msgstr "Mindestens eine Position muss ausgewählt werden"
#: templates/js/translated/purchase_order.js:1104
msgid "Received Quantity"
-msgstr ""
+msgstr "Erhaltene Menge"
#: templates/js/translated/purchase_order.js:1115
msgid "Quantity to receive"
-msgstr ""
+msgstr "Zu erhaltende Menge"
#: templates/js/translated/purchase_order.js:1191
msgid "Stock Status"
@@ -12617,7 +12648,7 @@ msgstr ""
#: templates/js/translated/purchase_order.js:1307
msgid "Quantity to Receive"
-msgstr ""
+msgstr "Zu erhaltende Menge"
#: templates/js/translated/purchase_order.js:1333
#: templates/js/translated/return_order.js:561
@@ -12656,46 +12687,46 @@ msgstr ""
#: templates/js/translated/purchase_order.js:1844
msgid "All selected Line items will be deleted"
-msgstr ""
+msgstr "Alle ausgewählten Positionen werden gelöscht"
#: templates/js/translated/purchase_order.js:1862
msgid "Delete selected Line items?"
-msgstr ""
+msgstr "Ausgewählte Positionen löschen?"
#: templates/js/translated/purchase_order.js:1917
#: templates/js/translated/sales_order.js:2070
msgid "Duplicate Line Item"
-msgstr ""
+msgstr "Position duplizieren"
#: templates/js/translated/purchase_order.js:1932
#: templates/js/translated/return_order.js:476
#: templates/js/translated/return_order.js:669
#: templates/js/translated/sales_order.js:2083
msgid "Edit Line Item"
-msgstr ""
+msgstr "Position bearbeiten"
#: templates/js/translated/purchase_order.js:1943
#: templates/js/translated/return_order.js:682
#: templates/js/translated/sales_order.js:2094
msgid "Delete Line Item"
-msgstr ""
+msgstr "Position löschen"
#: templates/js/translated/purchase_order.js:2225
#: templates/js/translated/sales_order.js:2024
msgid "Duplicate line item"
-msgstr ""
+msgstr "Position duplizieren"
#: templates/js/translated/purchase_order.js:2226
#: templates/js/translated/return_order.js:801
#: templates/js/translated/sales_order.js:2025
msgid "Edit line item"
-msgstr ""
+msgstr "Position bearbeiten"
#: templates/js/translated/purchase_order.js:2227
#: templates/js/translated/return_order.js:805
#: templates/js/translated/sales_order.js:2031
msgid "Delete line item"
-msgstr ""
+msgstr "Position löschen"
#: templates/js/translated/report.js:63
msgid "items selected"
@@ -12762,7 +12793,7 @@ msgstr ""
#: templates/js/translated/return_order.js:693
#: templates/js/translated/sales_order.js:2231
msgid "No matching line items"
-msgstr ""
+msgstr "Keine passenden Positionen gefunden"
#: templates/js/translated/return_order.js:798
msgid "Mark item as received"
@@ -12770,11 +12801,11 @@ msgstr ""
#: templates/js/translated/sales_order.js:161
msgid "Create Sales Order"
-msgstr ""
+msgstr "Auftrag anlegen"
#: templates/js/translated/sales_order.js:176
msgid "Edit Sales Order"
-msgstr ""
+msgstr "Auftrag bearbeiten"
#: templates/js/translated/sales_order.js:291
msgid "No stock items have been allocated to this shipment"
@@ -12810,19 +12841,19 @@ msgstr ""
#: templates/js/translated/sales_order.js:513
msgid "This order has line items which have not been completed."
-msgstr ""
+msgstr "Dieser Auftrag enthält Positionen, die noch nicht abgeschlossen sind."
#: templates/js/translated/sales_order.js:535
msgid "Issue this Sales Order?"
-msgstr ""
+msgstr "Diesen Auftrag aufgeben?"
#: templates/js/translated/sales_order.js:540
msgid "Issue Sales Order"
-msgstr ""
+msgstr "Auftrag aufgeben"
#: templates/js/translated/sales_order.js:559
msgid "Cancel Sales Order"
-msgstr ""
+msgstr "Auftrag stornieren"
#: templates/js/translated/sales_order.js:564
msgid "Cancelling this order means that the order will no longer be editable."
@@ -12834,7 +12865,7 @@ msgstr ""
#: templates/js/translated/sales_order.js:728
msgid "No sales orders found"
-msgstr ""
+msgstr "Keine Aufträge gefunden"
#: templates/js/translated/sales_order.js:908
msgid "Edit shipment"
@@ -12887,11 +12918,11 @@ msgstr ""
#: templates/js/translated/sales_order.js:1271
msgid "Allocate Stock Items to Sales Order"
-msgstr ""
+msgstr "Lagerartikel Auftrag zuweisen"
#: templates/js/translated/sales_order.js:1477
msgid "No sales order allocations found"
-msgstr ""
+msgstr "Keine Allokationen für Auftrag gefunden"
#: templates/js/translated/sales_order.js:1569
msgid "Edit Stock Allocation"
@@ -13251,7 +13282,7 @@ msgstr ""
#: templates/js/translated/stock.js:1932
msgid "Stock Actions"
-msgstr ""
+msgstr "Lager-Aktionen"
#: templates/js/translated/stock.js:1976
msgid "Load installed items"
@@ -13461,7 +13492,7 @@ msgstr ""
#: templates/js/translated/table_filters.js:158
msgid "Trackable Part"
-msgstr ""
+msgstr "Nachverfolgbares Teil"
#: templates/js/translated/table_filters.js:162
msgid "Assembled Part"
@@ -13473,7 +13504,7 @@ msgstr ""
#: templates/js/translated/table_filters.js:182
msgid "Allow Variant Stock"
-msgstr ""
+msgstr "Erlaube alternatives Lager"
#: templates/js/translated/table_filters.js:194
#: templates/js/translated/table_filters.js:779
@@ -13588,7 +13619,7 @@ msgstr ""
#: templates/js/translated/table_filters.js:366
msgid "Include stock items for variant parts"
-msgstr ""
+msgstr "Lagerartikel für Teile-Varianten einschließen"
#: templates/js/translated/table_filters.js:371
msgid "Show stock items which are installed in another item"
diff --git a/InvenTree/locale/el/LC_MESSAGES/django.po b/InvenTree/locale/el/LC_MESSAGES/django.po
index 5afc1fc072..d671c1c73b 100644
--- a/InvenTree/locale/el/LC_MESSAGES/django.po
+++ b/InvenTree/locale/el/LC_MESSAGES/django.po
@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: inventree\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2024-02-28 04:05+0000\n"
-"PO-Revision-Date: 2024-02-28 07:23\n"
+"POT-Creation-Date: 2024-03-02 07:22+0000\n"
+"PO-Revision-Date: 2024-03-11 09:31\n"
"Last-Translator: \n"
"Language-Team: Greek\n"
"Language: el_GR\n"
@@ -28,7 +28,7 @@ msgstr "Δεν έχετε δικαιώματα να το δείτε αυτό"
#: InvenTree/conversion.py:160
#, python-brace-format
msgid "Invalid unit provided ({unit})"
-msgstr ""
+msgstr "Η μονάδα μέτρησης δεν είναι έγκυρη ({unit})"
#: InvenTree/conversion.py:170
msgid "No value provided"
@@ -66,9 +66,9 @@ msgstr "Εισάγετε ημερομηνία"
#: report/templates/report/inventree_build_order_base.html:172
#: stock/admin.py:226 stock/models.py:2335 stock/models.py:2451
#: stock/serializers.py:479 stock/serializers.py:632 stock/serializers.py:728
-#: stock/serializers.py:778 stock/serializers.py:1081 stock/serializers.py:1170
-#: stock/serializers.py:1335 stock/templates/stock/stock_sidebar.html:25
-#: templates/js/translated/barcode.js:143 templates/js/translated/bom.js:1259
+#: stock/serializers.py:778 stock/serializers.py:1087 stock/serializers.py:1176
+#: stock/serializers.py:1341 stock/templates/stock/stock_sidebar.html:25
+#: templates/js/translated/barcode.js:143 templates/js/translated/bom.js:1265
#: templates/js/translated/company.js:1674 templates/js/translated/order.js:347
#: templates/js/translated/part.js:1080
#: templates/js/translated/purchase_order.js:2201
@@ -213,7 +213,7 @@ msgstr "Τσέχικα"
#: InvenTree/locales.py:18
msgid "Danish"
-msgstr ""
+msgstr "Δανέζικα"
#: InvenTree/locales.py:19
msgid "German"
@@ -297,15 +297,15 @@ msgstr "Ρωσικά"
#: InvenTree/locales.py:39
msgid "Slovak"
-msgstr ""
+msgstr "Σλοβάκικα"
#: InvenTree/locales.py:40
msgid "Slovenian"
-msgstr ""
+msgstr "Σλοβενικά"
#: InvenTree/locales.py:41
msgid "Serbian"
-msgstr ""
+msgstr "Σερβικά"
#: InvenTree/locales.py:42
msgid "Swedish"
@@ -334,7 +334,7 @@ msgstr "Κινέζικα (Παραδοσιακά)"
#: InvenTree/magic_login.py:28
#, python-brace-format
msgid "[{site_name}] Log in to the app"
-msgstr ""
+msgstr "[{site_name}] Σύνδεση στην εφαρμογή"
#: InvenTree/magic_login.py:38 company/models.py:132
#: company/templates/company/company_base.html:132
@@ -345,7 +345,7 @@ msgstr "Email"
#: InvenTree/models.py:107
msgid "Error running plugin validation"
-msgstr ""
+msgstr "Σφάλμα κατά την εκτέλεση επικύρωσης προσθέτου"
#: InvenTree/models.py:162
msgid "Metadata must be a python dict object"
@@ -523,7 +523,7 @@ msgstr "Όνομα"
#: templates/js/translated/order.js:298 templates/js/translated/part.js:1238
#: templates/js/translated/part.js:1483 templates/js/translated/part.js:1621
#: templates/js/translated/part.js:1958 templates/js/translated/part.js:2355
-#: templates/js/translated/part.js:2785 templates/js/translated/part.js:2887
+#: templates/js/translated/part.js:2785 templates/js/translated/part.js:2896
#: templates/js/translated/plugin.js:80
#: templates/js/translated/purchase_order.js:1707
#: templates/js/translated/purchase_order.js:1850
@@ -598,23 +598,23 @@ msgstr "Επιλέξτε νόμισμα από τις διαθέσιμες επ
#: InvenTree/serializers.py:436
msgid "You do not have permission to change this user role."
-msgstr ""
+msgstr "Δεν έχετε άδεια να αλλάξετε αυτόν τον ρόλο χρήστη."
#: InvenTree/serializers.py:448
msgid "Only superusers can create new users"
-msgstr ""
+msgstr "Μόνο υπερχρήστες (superusers) μπορούν να δημιουργήσουν νέους χρήστες"
#: InvenTree/serializers.py:467
msgid "Your account has been created."
-msgstr ""
+msgstr "Ο λογαριασμός σας δημιουργήθηκε."
#: InvenTree/serializers.py:469
msgid "Please use the password reset function to login"
-msgstr ""
+msgstr "Παρακαλούμε χρησιμοποιήστε τη λειτουργία επαναφοράς κωδικού πρόσβασης για να συνδεθείτε"
#: InvenTree/serializers.py:476
msgid "Welcome to InvenTree"
-msgstr ""
+msgstr "Καλώς ήρθατε στο InvenTree"
#: InvenTree/serializers.py:537
msgid "Filename"
@@ -668,7 +668,7 @@ msgstr "Διπλή στήλη: '{col}'"
#: InvenTree/serializers.py:854
msgid "Remote Image"
-msgstr ""
+msgstr "Απομακρυσμένες Εικόνες"
#: InvenTree/serializers.py:855
msgid "URL of remote image file"
@@ -678,7 +678,7 @@ msgstr "Διεύθυνση URL του αρχείου απομακρυσμένη
msgid "Downloading images from remote URL is not enabled"
msgstr "Η λήψη εικόνων από απομακρυσμένο URL δεν είναι ενεργοποιημένη"
-#: InvenTree/status.py:66 part/serializers.py:1120
+#: InvenTree/status.py:66 part/serializers.py:1138
msgid "Background worker check failed"
msgstr "Ο έλεγχος εργασίας στο παρασκήνιο απέτυχε"
@@ -836,7 +836,7 @@ msgstr "Η έξοδος της σειράς κατασκευής ολοκληρ
#: InvenTree/status_codes.py:128
msgid "Build order output rejected"
-msgstr ""
+msgstr "Η εντολή κατασκευής απορρίφθηκε"
#: InvenTree/status_codes.py:129 templates/js/translated/stock.js:1725
msgid "Consumed by build order"
@@ -844,15 +844,15 @@ msgstr "Κατανάλωση με εντολή κατασκευής"
#: InvenTree/status_codes.py:132
msgid "Shipped against Sales Order"
-msgstr ""
+msgstr "Αποστολή έναντι Εντολής Πώλησης"
#: InvenTree/status_codes.py:135
msgid "Received against Purchase Order"
-msgstr ""
+msgstr "Λήφθηκε έναντι Εντολής Αγοράς"
#: InvenTree/status_codes.py:138
msgid "Returned against Return Order"
-msgstr ""
+msgstr "Επιστράφηκε έναντι Εντολής Αγοράς"
#: InvenTree/status_codes.py:141 templates/js/translated/table_filters.js:375
msgid "Sent to customer"
@@ -868,31 +868,31 @@ msgstr "Παραγωγή"
#: InvenTree/status_codes.py:185
msgid "Return"
-msgstr ""
+msgstr "Επιστροφή"
#: InvenTree/status_codes.py:188
msgid "Repair"
-msgstr ""
+msgstr "Επισκευή"
#: InvenTree/status_codes.py:191
msgid "Replace"
-msgstr ""
+msgstr "Αντικατάσταση"
#: InvenTree/status_codes.py:194
msgid "Refund"
-msgstr ""
+msgstr "Επιστροφή χρημάτων"
#: InvenTree/status_codes.py:197
msgid "Reject"
-msgstr ""
+msgstr "Απόρριψη"
#: InvenTree/templatetags/inventree_extras.py:183
msgid "Unknown database"
-msgstr ""
+msgstr "Άγνωστη βάση δεδομένων"
#: InvenTree/validators.py:31 InvenTree/validators.py:33
msgid "Invalid physical unit"
-msgstr ""
+msgstr "Μη έγκυρη φυσική μονάδα"
#: InvenTree/validators.py:39
msgid "Not a valid currency code"
@@ -943,7 +943,7 @@ msgstr "Η έκδοση πρέπει να ακυρωθεί πριν διαγρα
#: templates/js/translated/table_filters.js:190
#: templates/js/translated/table_filters.js:583
msgid "Consumable"
-msgstr ""
+msgstr "Αναλώσιμο"
#: build/api.py:282 part/models.py:4006 part/templates/part/upload_bom.html:58
#: templates/js/translated/bom.js:1001 templates/js/translated/bom.js:1028
@@ -952,19 +952,19 @@ msgstr ""
#: templates/js/translated/table_filters.js:215
#: templates/js/translated/table_filters.js:587
msgid "Optional"
-msgstr ""
+msgstr "Προαιρετικό"
#: build/api.py:283 templates/js/translated/table_filters.js:408
#: templates/js/translated/table_filters.js:579
msgid "Tracked"
-msgstr ""
+msgstr "Υπό παρακολούθηση"
#: build/api.py:285 part/admin.py:144 templates/js/translated/build.js:1741
-#: templates/js/translated/build.js:2626
+#: templates/js/translated/build.js:2630
#: templates/js/translated/sales_order.js:1929
#: templates/js/translated/table_filters.js:571
msgid "Allocated"
-msgstr ""
+msgstr "Κατανεμημένο"
#: build/api.py:293 company/models.py:890
#: company/templates/company/supplier_part.html:114
@@ -978,7 +978,7 @@ msgstr ""
#: templates/js/translated/table_filters.js:340
#: templates/js/translated/table_filters.js:575
msgid "Available"
-msgstr ""
+msgstr "Διαθέσιμο"
#: build/models.py:74 build/templates/build/build_base.html:9
#: build/templates/build/build_base.html:27
@@ -1006,7 +1006,7 @@ msgstr "Μη έγκυρη επιλογή για γονική κατασκευή"
#: build/models.py:127
msgid "Build order part cannot be changed"
-msgstr ""
+msgstr "Εξάρτημα από εντολή κατασκευής δεν μπορεί να αλλάξει"
#: build/models.py:173
msgid "Build Order Reference"
@@ -1030,7 +1030,7 @@ msgstr "Αναφορά"
#: build/models.py:185
msgid "Brief description of the build (optional)"
-msgstr ""
+msgstr "Σύντομη περιγραφή της κατασκευής (προαιρετικό)"
#: build/models.py:193 build/templates/build/build_base.html:183
#: build/templates/build/detail.html:87
@@ -1044,11 +1044,11 @@ msgstr "BuildOrder στην οποία έχει δοθεί αυτή η κατα
#: build/models.py:199 build/templates/build/build_base.html:97
#: build/templates/build/detail.html:29 company/models.py:1044
#: order/models.py:1389 order/models.py:1532 order/models.py:1533
-#: part/api.py:1528 part/models.py:389 part/models.py:3003 part/models.py:3147
-#: part/models.py:3291 part/models.py:3314 part/models.py:3335
-#: part/models.py:3357 part/models.py:3458 part/models.py:3754
-#: part/models.py:3885 part/models.py:3978 part/models.py:4339
-#: part/serializers.py:1066 part/serializers.py:1631
+#: part/api.py:1528 part/api.py:1820 part/models.py:389 part/models.py:3003
+#: part/models.py:3147 part/models.py:3291 part/models.py:3314
+#: part/models.py:3335 part/models.py:3357 part/models.py:3458
+#: part/models.py:3754 part/models.py:3885 part/models.py:3978
+#: part/models.py:4339 part/serializers.py:1084 part/serializers.py:1659
#: part/templates/part/part_app_base.html:8
#: part/templates/part/part_pricing.html:12
#: part/templates/part/upload_bom.html:52
@@ -1147,7 +1147,7 @@ msgid "Build status code"
msgstr "Κωδικός κατάστασης κατασκευής"
#: build/models.py:264 build/serializers.py:280 order/serializers.py:549
-#: stock/models.py:826 stock/serializers.py:1300
+#: stock/models.py:826 stock/serializers.py:1306
#: templates/js/translated/purchase_order.js:1129
msgid "Batch Code"
msgstr "Κωδικός Παρτίδας"
@@ -1205,7 +1205,7 @@ msgstr "Υπεύθυνος"
#: build/models.py:303
msgid "User or group responsible for this build order"
-msgstr ""
+msgstr "Χρήστης ή ομάδα υπεύθυνη για αυτή την εντολή κατασκευής"
#: build/models.py:308 build/templates/build/detail.html:108
#: company/templates/company/manufacturer_part.html:107
@@ -1221,11 +1221,11 @@ msgstr "Εξωτερικοί σύνδεσμοι"
#: build/models.py:313
msgid "Build Priority"
-msgstr ""
+msgstr "Προτεραιότητα Κατασκευής"
#: build/models.py:316
msgid "Priority of this build order"
-msgstr ""
+msgstr "Προτεραιότητα αυτής της εντολής κατασκευής"
#: build/models.py:323 common/models.py:129 order/admin.py:18
#: order/models.py:274 templates/InvenTree/settings/settings_staff_js.html:146
@@ -1236,54 +1236,54 @@ msgstr ""
#: templates/js/translated/table_filters.js:48
#: templates/project_code_data.html:6
msgid "Project Code"
-msgstr ""
+msgstr "Κωδικός Έργου"
#: build/models.py:324
msgid "Project code for this build order"
-msgstr ""
+msgstr "Κωδικός έργου για αυτήν την εντολή κατασκευής"
-#: build/models.py:559
+#: build/models.py:575
#, python-brace-format
msgid "Build order {build} has been completed"
msgstr "Η παραγγελία κατασκευής {build} έχει ολοκληρωθεί"
-#: build/models.py:565
+#: build/models.py:581
msgid "A build order has been completed"
msgstr "Η παραγγελία κατασκευής έχει ολοκληρωθεί"
-#: build/models.py:783 build/models.py:858
+#: build/models.py:799 build/models.py:874
msgid "No build output specified"
msgstr "Δεν καθορίστηκε έξοδος κατασκευής"
-#: build/models.py:786
+#: build/models.py:802
msgid "Build output is already completed"
msgstr "Η παραγγελία κατασκευής έχει ολοκληρωθεί"
-#: build/models.py:789
+#: build/models.py:805
msgid "Build output does not match Build Order"
msgstr "Η έξοδος κατασκευής δεν ταιριάζει με την παραγγελία κατασκευής"
-#: build/models.py:862 build/serializers.py:223 build/serializers.py:262
+#: build/models.py:878 build/serializers.py:223 build/serializers.py:262
#: build/serializers.py:831 order/models.py:526 order/serializers.py:401
-#: order/serializers.py:544 part/serializers.py:1423 part/serializers.py:1789
+#: order/serializers.py:544 part/serializers.py:1442 part/serializers.py:1817
#: stock/models.py:665 stock/models.py:1477 stock/serializers.py:450
msgid "Quantity must be greater than zero"
msgstr "Η ποσότητα πρέπει να είναι μεγαλύτερη από 0"
-#: build/models.py:867 build/serializers.py:228
+#: build/models.py:883 build/serializers.py:228
msgid "Quantity cannot be greater than the output quantity"
-msgstr ""
+msgstr "Η ποσότητα δεν μπορεί να είναι μεγαλύτερη από την παραγόμενη ποσότητα"
-#: build/models.py:924 build/serializers.py:533
+#: build/models.py:940 build/serializers.py:533
#, python-brace-format
msgid "Build output {serial} has not passed all required tests"
-msgstr ""
+msgstr "Το προϊόν κατασκευής {serial} δεν έχει περάσει όλες τις απαιτούμενες δοκιμές"
-#: build/models.py:1286
+#: build/models.py:1302
msgid "Build object"
-msgstr ""
+msgstr "Αντικείμενο κατασκευής"
-#: build/models.py:1300 build/models.py:1558 build/serializers.py:210
+#: build/models.py:1316 build/models.py:1574 build/serializers.py:210
#: build/serializers.py:247 build/templates/build/build_base.html:102
#: build/templates/build/detail.html:34 common/models.py:2432
#: order/models.py:1247 order/models.py:1902 order/serializers.py:1306
@@ -1310,7 +1310,7 @@ msgstr ""
#: templates/js/translated/company.js:1808
#: templates/js/translated/model_renderers.js:230
#: templates/js/translated/order.js:304 templates/js/translated/part.js:961
-#: templates/js/translated/part.js:1811 templates/js/translated/part.js:3332
+#: templates/js/translated/part.js:1811 templates/js/translated/part.js:3341
#: templates/js/translated/pricing.js:381
#: templates/js/translated/pricing.js:474
#: templates/js/translated/pricing.js:522
@@ -1330,38 +1330,38 @@ msgstr ""
msgid "Quantity"
msgstr "Ποσότητα"
-#: build/models.py:1301
+#: build/models.py:1317
msgid "Required quantity for build order"
-msgstr ""
+msgstr "Απαιτούμενη ποσότητα για την εντολή κατασκευής"
-#: build/models.py:1381
+#: build/models.py:1397
msgid "Build item must specify a build output, as master part is marked as trackable"
msgstr "Το στοιχείο κατασκευής πρέπει να ορίζει μια έξοδο κατασκευής, καθώς το κύριο τμήμα επισημαίνεται ως ανιχνεύσιμο"
-#: build/models.py:1390
+#: build/models.py:1406
#, python-brace-format
msgid "Allocated quantity ({q}) must not exceed available stock quantity ({a})"
msgstr "Η καταχωρημένη ποσότητα ({q}) δεν πρέπει να υπερβαίνει τη διαθέσιμη ποσότητα αποθέματος ({a})"
-#: build/models.py:1400 order/models.py:1853
+#: build/models.py:1416 order/models.py:1853
msgid "Stock item is over-allocated"
msgstr "Στοιχείο αποθέματος είναι υπερ-κατανεμημένο"
-#: build/models.py:1406 order/models.py:1856
+#: build/models.py:1422 order/models.py:1856
msgid "Allocation quantity must be greater than zero"
msgstr "Η ποσότητα πρέπει να είναι μεγαλύτερη από 0"
-#: build/models.py:1412
+#: build/models.py:1428
msgid "Quantity must be 1 for serialized stock"
msgstr "Η ποσότητα πρέπει να είναι 1 για σειριακό απόθεμα"
-#: build/models.py:1473
+#: build/models.py:1489
msgid "Selected stock item does not match BOM line"
-msgstr ""
+msgstr "Το επιλεγμένο στοιχείο αποθέματος δεν ταιριάζει με τη γραμμή ΤΥ"
-#: build/models.py:1545 build/serializers.py:811 order/serializers.py:1150
-#: order/serializers.py:1171 stock/serializers.py:544 stock/serializers.py:1019
-#: stock/serializers.py:1131 stock/templates/stock/item_base.html:10
+#: build/models.py:1561 build/serializers.py:811 order/serializers.py:1150
+#: order/serializers.py:1171 stock/serializers.py:544 stock/serializers.py:1025
+#: stock/serializers.py:1137 stock/templates/stock/item_base.html:10
#: stock/templates/stock/item_base.html:23
#: stock/templates/stock/item_base.html:194
#: templates/js/translated/build.js:1742
@@ -1376,19 +1376,19 @@ msgstr ""
msgid "Stock Item"
msgstr "Στοιχείο Αποθέματος"
-#: build/models.py:1546
+#: build/models.py:1562
msgid "Source stock item"
msgstr "Στοιχείο πηγαίου αποθέματος"
-#: build/models.py:1559
+#: build/models.py:1575
msgid "Stock quantity to allocate to build"
msgstr "Ποσότητα αποθέματος για διάθεση για κατασκευή"
-#: build/models.py:1567
+#: build/models.py:1583
msgid "Install into"
msgstr "Εγκατάσταση σε"
-#: build/models.py:1568
+#: build/models.py:1584
msgid "Destination stock item"
msgstr "Αποθήκη προορισμού"
@@ -1441,20 +1441,20 @@ msgstr "Αυτόματη Κατανομή Σειριακών Αριθμών"
#: build/serializers.py:302
msgid "Automatically allocate required items with matching serial numbers"
-msgstr ""
+msgstr "Αυτόματη κατανομή των απαιτούμενων στοιχείων με τους αντίστοιχους σειριακούς αριθμούς"
#: build/serializers.py:337 stock/api.py:978
msgid "The following serial numbers already exist or are invalid"
-msgstr ""
+msgstr "Οι παρακάτω σειριακοί αριθμοί υπάρχουν ήδη ή δεν είναι έγκυροι"
#: build/serializers.py:388 build/serializers.py:450 build/serializers.py:539
msgid "A list of build outputs must be provided"
-msgstr ""
+msgstr "Πρέπει να παρέχεται μια λίστα με τα αποτελέσματα κατασκευής"
#: build/serializers.py:426 build/serializers.py:498 order/serializers.py:533
-#: order/serializers.py:641 order/serializers.py:1646 part/serializers.py:1086
+#: order/serializers.py:641 order/serializers.py:1646 part/serializers.py:1104
#: stock/serializers.py:472 stock/serializers.py:627 stock/serializers.py:723
-#: stock/serializers.py:1163 stock/serializers.py:1419
+#: stock/serializers.py:1169 stock/serializers.py:1425
#: stock/templates/stock/item_base.html:394
#: templates/js/translated/barcode.js:547
#: templates/js/translated/barcode.js:795 templates/js/translated/build.js:999
@@ -1469,32 +1469,32 @@ msgstr ""
#: templates/js/translated/stock.js:1060 templates/js/translated/stock.js:2164
#: templates/js/translated/stock.js:2835
msgid "Location"
-msgstr ""
+msgstr "Τοποθεσία"
#: build/serializers.py:427
msgid "Stock location for scrapped outputs"
-msgstr ""
+msgstr "Θέση αποθέματος για απορριφθείσες παραγωγές"
#: build/serializers.py:433
msgid "Discard Allocations"
-msgstr ""
+msgstr "Απόρριψη Κατανομών"
#: build/serializers.py:434
msgid "Discard any stock allocations for scrapped outputs"
-msgstr ""
+msgstr "Απορρίψτε τυχόν κατανομές αποθέματος για παραγωγές που έχουν απορριφθεί"
#: build/serializers.py:439
msgid "Reason for scrapping build output(s)"
-msgstr ""
+msgstr "Αιτία απόρριψης προϊόντων κατασκευής"
#: build/serializers.py:499
msgid "Location for completed build outputs"
-msgstr ""
+msgstr "Τοποθεσία για ολοκληρωμένα προϊόντα κατασκευής"
#: build/serializers.py:505 build/templates/build/build_base.html:151
#: build/templates/build/detail.html:62 order/models.py:910
#: order/models.py:2005 order/serializers.py:565 stock/admin.py:165
-#: stock/serializers.py:774 stock/serializers.py:1307
+#: stock/serializers.py:774 stock/serializers.py:1313
#: stock/templates/stock/item_base.html:427
#: templates/js/translated/barcode.js:252 templates/js/translated/build.js:2189
#: templates/js/translated/purchase_order.js:1308
@@ -1504,105 +1504,105 @@ msgstr ""
#: templates/js/translated/stock.js:2139 templates/js/translated/stock.js:2959
#: templates/js/translated/stock.js:3084
msgid "Status"
-msgstr ""
+msgstr "Κατάσταση"
#: build/serializers.py:511
msgid "Accept Incomplete Allocation"
-msgstr ""
+msgstr "Αποδοχή Ελλιπούς Δέσμευσης"
#: build/serializers.py:512
msgid "Complete outputs if stock has not been fully allocated"
-msgstr ""
+msgstr "Ολοκλήρωσε τα προϊόντα εάν το απόθεμα δεν έχει δεσμευτεί πλήρως"
#: build/serializers.py:592
msgid "Remove Allocated Stock"
-msgstr ""
+msgstr "Αφαίρεση Καταχωρημένου Αποθέματος"
#: build/serializers.py:593
msgid "Subtract any stock which has already been allocated to this build"
-msgstr ""
+msgstr "Αφαίρεσε το απόθεμα που έχει κατανεμηθεί σε αυτή την κατασκευή"
#: build/serializers.py:599
msgid "Remove Incomplete Outputs"
-msgstr ""
+msgstr "Αφαίρεση Ατελείωτων Προϊόντων"
#: build/serializers.py:600
msgid "Delete any build outputs which have not been completed"
-msgstr ""
+msgstr "Διαγράψτε τυχόν προϊόντα κατασκευής που δεν έχουν ολοκληρωθεί"
#: build/serializers.py:627
msgid "Not permitted"
-msgstr ""
+msgstr "Δεν επιτρέπεται"
#: build/serializers.py:628
msgid "Accept as consumed by this build order"
-msgstr ""
+msgstr "Αποδοχή ως κατανάλωση για αυτή την παραγγελία κατασκευής"
#: build/serializers.py:629
msgid "Deallocate before completing this build order"
-msgstr ""
+msgstr "Αποδέσμευση πριν από την ολοκλήρωση αυτής της παραγγελίας κατασκευής"
#: build/serializers.py:651
msgid "Overallocated Stock"
-msgstr ""
+msgstr "Υπερ-δεσμευμένο Απόθεμα"
#: build/serializers.py:653
msgid "How do you want to handle extra stock items assigned to the build order"
-msgstr ""
+msgstr "Πώς θέλετε να χειριστείτε το επιπλέον απόθεμα που έχει δεσμευτεί στην παραγγελία κατασκευής"
#: build/serializers.py:663
msgid "Some stock items have been overallocated"
-msgstr ""
+msgstr "Μερικά στοιχεία αποθέματος έχουν υπερ-δεσμευτεί"
#: build/serializers.py:668
msgid "Accept Unallocated"
-msgstr ""
+msgstr "Αποδοχή Μη Δεσμευμένων"
#: build/serializers.py:669
msgid "Accept that stock items have not been fully allocated to this build order"
-msgstr ""
+msgstr "Αποδεχτείτε ότι αντικείμενα αποθέματος δεν έχουν δεσμευτεί πλήρως σε αυτή την παραγγελία κατασκευής"
#: build/serializers.py:679 templates/js/translated/build.js:315
msgid "Required stock has not been fully allocated"
-msgstr ""
+msgstr "Το απαιτούμενο απόθεμα δεν έχει δεσμευτεί πλήρως"
#: build/serializers.py:684 order/serializers.py:280 order/serializers.py:1213
msgid "Accept Incomplete"
-msgstr ""
+msgstr "Αποδοχή Μη Ολοκληρωμένων"
#: build/serializers.py:685
msgid "Accept that the required number of build outputs have not been completed"
-msgstr ""
+msgstr "Αποδεχτείτε ότι ο απαιτούμενος αριθμός προϊόντων κατασκευής δεν έχει ολοκληρωθεί"
#: build/serializers.py:695 templates/js/translated/build.js:319
msgid "Required build quantity has not been completed"
-msgstr ""
+msgstr "Ο απαιτούμενος αριθμός προϊόντων δεν έχει ολοκληρωθεί"
#: build/serializers.py:704 templates/js/translated/build.js:303
msgid "Build order has incomplete outputs"
-msgstr ""
+msgstr "Η παραγγελία κατασκευής έχει ελλιπή προϊόντα"
#: build/serializers.py:734
msgid "Build Line"
-msgstr ""
+msgstr "Γραμμή Κατασκευής"
#: build/serializers.py:744
msgid "Build output"
-msgstr ""
+msgstr "Προϊόν Κατασκευής"
#: build/serializers.py:752
msgid "Build output must point to the same build"
-msgstr ""
+msgstr "Το προϊόν κατασκευής πρέπει να δείχνει στην ίδια κατασκευή"
#: build/serializers.py:788
msgid "Build Line Item"
-msgstr ""
+msgstr "Αντικείμενο Γραμμής Κατασκευής"
#: build/serializers.py:802
msgid "bom_item.part must point to the same part as the build order"
msgstr ""
-#: build/serializers.py:817 stock/serializers.py:1032
+#: build/serializers.py:817 stock/serializers.py:1038
msgid "Item must be in stock"
msgstr ""
@@ -1659,44 +1659,45 @@ msgstr ""
msgid "Allocate optional BOM items to build order"
msgstr ""
-#: build/serializers.py:1096 part/models.py:3895 part/models.py:4331
+#: build/serializers.py:1097 part/models.py:3895 part/models.py:4331
#: stock/api.py:745
msgid "BOM Item"
msgstr ""
-#: build/serializers.py:1105 templates/js/translated/index.js:130
+#: build/serializers.py:1106 templates/js/translated/index.js:130
msgid "Allocated Stock"
msgstr ""
-#: build/serializers.py:1110 part/admin.py:132 part/bom.py:173
-#: part/serializers.py:1441 part/templates/part/part_base.html:210
-#: templates/js/translated/bom.js:1202 templates/js/translated/build.js:2614
-#: templates/js/translated/part.js:709 templates/js/translated/part.js:2148
+#: build/serializers.py:1111 part/admin.py:132 part/bom.py:173
+#: part/serializers.py:798 part/serializers.py:1460
+#: part/templates/part/part_base.html:210 templates/js/translated/bom.js:1208
+#: templates/js/translated/build.js:2614 templates/js/translated/part.js:709
+#: templates/js/translated/part.js:2148
#: templates/js/translated/table_filters.js:170
msgid "On Order"
msgstr ""
-#: build/serializers.py:1115 part/serializers.py:1443
+#: build/serializers.py:1116 part/serializers.py:1462
#: templates/js/translated/build.js:2618
#: templates/js/translated/table_filters.js:360
msgid "In Production"
msgstr ""
-#: build/serializers.py:1120 part/bom.py:172 part/serializers.py:1454
+#: build/serializers.py:1121 part/bom.py:172 part/serializers.py:1473
#: part/templates/part/part_base.html:192
#: templates/js/translated/sales_order.js:1893
msgid "Available Stock"
msgstr ""
-#: build/tasks.py:149
+#: build/tasks.py:171
msgid "Stock required for build order"
msgstr ""
-#: build/tasks.py:166
+#: build/tasks.py:188
msgid "Overdue Build Order"
msgstr ""
-#: build/tasks.py:171
+#: build/tasks.py:193
#, python-brace-format
msgid "Build order {bo} is now overdue"
msgstr ""
@@ -1739,7 +1740,7 @@ msgstr ""
#: templates/js/translated/barcode.js:496
#: templates/js/translated/barcode.js:501
msgid "Unlink Barcode"
-msgstr ""
+msgstr "Αποσύνδεση Barcode"
#: build/templates/build/build_base.html:47
#: company/templates/company/supplier_part.html:43
@@ -1750,67 +1751,67 @@ msgstr ""
#: stock/templates/stock/item_base.html:49
#: stock/templates/stock/location.html:61
msgid "Link Barcode"
-msgstr ""
+msgstr "Σύνδεση Barcode"
#: build/templates/build/build_base.html:56
#: order/templates/order/order_base.html:46
#: order/templates/order/return_order_base.html:55
#: order/templates/order/sales_order_base.html:55
msgid "Print actions"
-msgstr ""
+msgstr "Ενέργειες εκτύπωσης"
#: build/templates/build/build_base.html:60
msgid "Print build order report"
-msgstr ""
+msgstr "Εκτύπωση αναφοράς εντολών κατασκευής"
#: build/templates/build/build_base.html:67
msgid "Build actions"
-msgstr ""
+msgstr "Εντολές κατασκευής"
#: build/templates/build/build_base.html:71
msgid "Edit Build"
-msgstr ""
+msgstr "Επεξεργασία Κατασκευής"
#: build/templates/build/build_base.html:73
msgid "Cancel Build"
-msgstr ""
+msgstr "Ακύρωση κατασκευής"
#: build/templates/build/build_base.html:76
msgid "Duplicate Build"
-msgstr ""
+msgstr "Αντιγραφή Κατασκευής"
#: build/templates/build/build_base.html:79
msgid "Delete Build"
-msgstr ""
+msgstr "Διαγραφή Κατασκευής"
#: build/templates/build/build_base.html:84
#: build/templates/build/build_base.html:85
msgid "Complete Build"
-msgstr ""
+msgstr "Ολοκλήρωση Κατασκευής"
#: build/templates/build/build_base.html:107
msgid "Build Description"
-msgstr ""
+msgstr "Περιγραφή Κατασκευής"
#: build/templates/build/build_base.html:117
msgid "No build outputs have been created for this build order"
-msgstr ""
+msgstr "Δεν έχουν δημιουργηθεί προϊόντα για αυτήν την εντολή κατασκευής"
#: build/templates/build/build_base.html:124
msgid "Build Order is ready to mark as completed"
-msgstr ""
+msgstr "Η εντολή Κατασκευής είναι έτοιμη για να επισημανθεί ως ολοκληρωμένη"
#: build/templates/build/build_base.html:129
msgid "Build Order cannot be completed as outstanding outputs remain"
-msgstr ""
+msgstr "Η Εντολή Κατασκευής δεν μπορεί να ολοκληρωθεί καθώς υπάρχουν εκκρεμή προϊόντα"
#: build/templates/build/build_base.html:134
msgid "Required build quantity has not yet been completed"
-msgstr ""
+msgstr "Ο απαιτούμενος αριθμός προϊόντων δεν έχει ακόμα ολοκληρωθεί"
#: build/templates/build/build_base.html:139
msgid "Stock has not been fully allocated to this Build Order"
-msgstr ""
+msgstr "Το Απόθεμα δεν έχει κατανεμηθεί πλήρως σε αυτή την Εντολή Κατασκευής"
#: build/templates/build/build_base.html:160
#: build/templates/build/detail.html:138 order/models.py:285
@@ -1826,12 +1827,12 @@ msgstr ""
#: templates/js/translated/sales_order.js:835
#: templates/js/translated/sales_order.js:1867
msgid "Target Date"
-msgstr ""
+msgstr "Επιθυμητή Προθεσμία"
#: build/templates/build/build_base.html:165
#, python-format
msgid "This build was due on %(target)s"
-msgstr ""
+msgstr "Αυτή η κατασκευή είχε προθεσμία %(target)s"
#: build/templates/build/build_base.html:165
#: build/templates/build/build_base.html:222
@@ -1843,12 +1844,12 @@ msgstr ""
#: templates/js/translated/table_filters.js:626
#: templates/js/translated/table_filters.js:667
msgid "Overdue"
-msgstr ""
+msgstr "Εκπρόθεσμη"
#: build/templates/build/build_base.html:177
#: build/templates/build/detail.html:67 build/templates/build/sidebar.html:13
msgid "Completed Outputs"
-msgstr ""
+msgstr "Ολοκληρωμένα Προϊόντα"
#: build/templates/build/build_base.html:190
#: build/templates/build/detail.html:101 order/api.py:1457 order/models.py:1524
@@ -1864,48 +1865,48 @@ msgstr ""
#: templates/js/translated/sales_order.js:992
#: templates/js/translated/stock.js:2888
msgid "Sales Order"
-msgstr ""
+msgstr "Εντολές Πώλησης"
#: build/templates/build/build_base.html:197
#: build/templates/build/detail.html:115
#: report/templates/report/inventree_build_order_base.html:152
#: templates/js/translated/table_filters.js:24
msgid "Issued By"
-msgstr ""
+msgstr "Εκδόθηκε από"
#: build/templates/build/build_base.html:211
#: build/templates/build/detail.html:94 templates/js/translated/build.js:2154
msgid "Priority"
-msgstr ""
+msgstr "Προτεραιότητα"
#: build/templates/build/build_base.html:273
msgid "Delete Build Order"
-msgstr ""
+msgstr "Διαγραφή Εντολής Κατασκευής"
#: build/templates/build/build_base.html:283
msgid "Build Order QR Code"
-msgstr ""
+msgstr "Κωδικός QR Εντολής Κατασκευής"
#: build/templates/build/build_base.html:295
msgid "Link Barcode to Build Order"
-msgstr ""
+msgstr "Σύνδεση Barcode με την Εντολή Κατασκευής"
#: build/templates/build/detail.html:15
msgid "Build Details"
-msgstr ""
+msgstr "Λεπτομέρειες Κατασκευής"
#: build/templates/build/detail.html:38
msgid "Stock Source"
-msgstr ""
+msgstr "Προέλευση Αποθέματος"
#: build/templates/build/detail.html:43
msgid "Stock can be taken from any available location."
-msgstr ""
+msgstr "Το απόθεμα μπορεί να ληφθεί από οποιαδήποτε διαθέσιμη τοποθεσία."
#: build/templates/build/detail.html:49 order/models.py:1418
#: templates/js/translated/purchase_order.js:2190
msgid "Destination"
-msgstr ""
+msgstr "Προορισμός"
#: build/templates/build/detail.html:56
msgid "Destination location not specified"
@@ -1990,27 +1991,31 @@ msgstr ""
msgid "Order Parts"
msgstr ""
-#: build/templates/build/detail.html:210
-msgid "Incomplete Build Outputs"
-msgstr ""
-
-#: build/templates/build/detail.html:214
-msgid "Create new build output"
+#: build/templates/build/detail.html:205
+msgid "Available stock has been filtered based on specified source location for this build order"
msgstr ""
#: build/templates/build/detail.html:215
+msgid "Incomplete Build Outputs"
+msgstr ""
+
+#: build/templates/build/detail.html:219
+msgid "Create new build output"
+msgstr ""
+
+#: build/templates/build/detail.html:220
msgid "New Build Output"
msgstr ""
-#: build/templates/build/detail.html:232 build/templates/build/sidebar.html:15
+#: build/templates/build/detail.html:237 build/templates/build/sidebar.html:15
msgid "Consumed Stock"
msgstr ""
-#: build/templates/build/detail.html:244
+#: build/templates/build/detail.html:249
msgid "Completed Build Outputs"
msgstr ""
-#: build/templates/build/detail.html:256 build/templates/build/sidebar.html:19
+#: build/templates/build/detail.html:261 build/templates/build/sidebar.html:19
#: company/templates/company/detail.html:229
#: company/templates/company/manufacturer_part.html:141
#: company/templates/company/manufacturer_part_sidebar.html:9
@@ -2026,15 +2031,15 @@ msgstr ""
msgid "Attachments"
msgstr ""
-#: build/templates/build/detail.html:271
+#: build/templates/build/detail.html:276
msgid "Build Notes"
msgstr ""
-#: build/templates/build/detail.html:426
+#: build/templates/build/detail.html:434
msgid "Allocation Complete"
msgstr ""
-#: build/templates/build/detail.html:427
+#: build/templates/build/detail.html:435
msgid "All lines have been fully allocated"
msgstr ""
@@ -2436,7 +2441,7 @@ msgid "Parts are templates by default"
msgstr ""
#: common/models.py:1456 part/admin.py:91 part/admin.py:431 part/models.py:1015
-#: templates/js/translated/bom.js:1633
+#: templates/js/translated/bom.js:1639
#: templates/js/translated/table_filters.js:330
#: templates/js/translated/table_filters.js:721
msgid "Assembly"
@@ -3495,7 +3500,7 @@ msgstr ""
msgid "Price break quantity"
msgstr ""
-#: common/models.py:2440 company/serializers.py:484 order/admin.py:42
+#: common/models.py:2440 company/serializers.py:486 order/admin.py:42
#: order/models.py:1321 order/models.py:2226
#: templates/js/translated/company.js:1813 templates/js/translated/part.js:1885
#: templates/js/translated/pricing.js:621
@@ -3972,7 +3977,7 @@ msgstr ""
#: company/models.py:495 company/templates/company/company_base.html:76
#: company/templates/company/manufacturer_part.html:90
-#: company/templates/company/supplier_part.html:145 part/serializers.py:497
+#: company/templates/company/supplier_part.html:145 part/serializers.py:505
#: stock/templates/stock/item_base.html:207
#: templates/js/translated/company.js:506
#: templates/js/translated/company.js:1108
@@ -3987,7 +3992,7 @@ msgid "Select manufacturer"
msgstr ""
#: company/models.py:502 company/templates/company/manufacturer_part.html:101
-#: company/templates/company/supplier_part.html:153 part/serializers.py:507
+#: company/templates/company/supplier_part.html:153 part/serializers.py:515
#: templates/js/translated/company.js:351
#: templates/js/translated/company.js:1107
#: templates/js/translated/company.js:1302
@@ -4059,7 +4064,7 @@ msgstr ""
#: company/models.py:795 company/templates/company/company_base.html:81
#: company/templates/company/supplier_part.html:129 order/models.py:453
#: order/templates/order/order_base.html:136 part/bom.py:272 part/bom.py:310
-#: part/serializers.py:481 plugin/builtin/suppliers/digikey.py:25
+#: part/serializers.py:489 plugin/builtin/suppliers/digikey.py:25
#: plugin/builtin/suppliers/lcsc.py:26 plugin/builtin/suppliers/mouser.py:24
#: plugin/builtin/suppliers/tme.py:26 stock/templates/stock/item_base.html:224
#: templates/email/overdue_purchase_order.html:16
@@ -4076,7 +4081,7 @@ msgstr ""
msgid "Select supplier"
msgstr ""
-#: company/models.py:802 part/serializers.py:492
+#: company/models.py:802 part/serializers.py:500
msgid "Supplier stock keeping unit"
msgstr ""
@@ -4112,7 +4117,7 @@ msgid "Minimum charge (e.g. stocking fee)"
msgstr ""
#: company/models.py:851 company/templates/company/supplier_part.html:160
-#: stock/admin.py:224 stock/models.py:785 stock/serializers.py:1317
+#: stock/admin.py:224 stock/models.py:785 stock/serializers.py:1323
#: stock/templates/stock/item_base.html:240
#: templates/js/translated/company.js:1636
#: templates/js/translated/stock.js:2387
@@ -4157,7 +4162,7 @@ msgstr ""
msgid "Date of last update of availability data"
msgstr ""
-#: company/serializers.py:153
+#: company/serializers.py:155
msgid "Default currency used for this supplier"
msgstr ""
@@ -4218,7 +4223,7 @@ msgstr ""
#: company/templates/company/company_base.html:86 order/models.py:898
#: order/models.py:1993 order/templates/order/return_order_base.html:131
#: order/templates/order/sales_order_base.html:144 stock/models.py:807
-#: stock/models.py:808 stock/serializers.py:1067
+#: stock/models.py:808 stock/serializers.py:1073
#: stock/templates/stock/item_base.html:405
#: templates/email/overdue_sales_order.html:16
#: templates/js/translated/company.js:502
@@ -4429,8 +4434,9 @@ msgstr ""
#: company/templates/company/manufacturer_part.html:119
#: company/templates/company/supplier_part.html:15 company/views.py:31
-#: part/admin.py:122 part/templates/part/part_sidebar.html:33
-#: templates/InvenTree/search.html:190 templates/navbar.html:48
+#: part/admin.py:122 part/serializers.py:802
+#: part/templates/part/part_sidebar.html:33 templates/InvenTree/search.html:190
+#: templates/navbar.html:48
msgid "Suppliers"
msgstr ""
@@ -4528,7 +4534,7 @@ msgid "No supplier information available"
msgstr ""
#: company/templates/company/supplier_part.html:139 part/bom.py:279
-#: part/bom.py:311 part/serializers.py:491
+#: part/bom.py:311 part/serializers.py:499
#: templates/js/translated/company.js:349 templates/js/translated/part.js:1786
#: templates/js/translated/pricing.js:510
#: templates/js/translated/purchase_order.js:1851
@@ -4577,10 +4583,12 @@ msgstr ""
msgid "Update Part Availability"
msgstr ""
-#: company/templates/company/supplier_part_sidebar.html:5 part/stocktake.py:223
+#: company/templates/company/supplier_part_sidebar.html:5
+#: part/serializers.py:801 part/stocktake.py:223
#: part/templates/part/category.html:183
#: part/templates/part/category_sidebar.html:17 stock/admin.py:69
-#: stock/serializers.py:760 stock/templates/stock/location.html:170
+#: stock/serializers.py:760 stock/serializers.py:924
+#: stock/templates/stock/location.html:170
#: stock/templates/stock/location.html:184
#: stock/templates/stock/location.html:196
#: stock/templates/stock/location_sidebar.html:7
@@ -4640,7 +4648,7 @@ msgid "Label template file"
msgstr ""
#: label/models.py:143 part/models.py:3484 report/models.py:322
-#: templates/js/translated/part.js:2891
+#: templates/js/translated/part.js:2900
#: templates/js/translated/table_filters.js:481
msgid "Enabled"
msgstr ""
@@ -5733,7 +5741,7 @@ msgid "Pending Shipments"
msgstr ""
#: order/templates/order/sales_order_detail.html:71
-#: templates/js/translated/bom.js:1271 templates/js/translated/filters.js:296
+#: templates/js/translated/bom.js:1277 templates/js/translated/filters.js:296
msgid "Actions"
msgstr ""
@@ -5861,10 +5869,10 @@ msgstr ""
msgid "Category Path"
msgstr ""
-#: part/admin.py:323 part/models.py:390 part/serializers.py:259
-#: part/serializers.py:373 part/templates/part/cat_link.html:3
-#: part/templates/part/category.html:23 part/templates/part/category.html:141
-#: part/templates/part/category.html:161
+#: part/admin.py:323 part/models.py:390 part/serializers.py:112
+#: part/serializers.py:265 part/serializers.py:381
+#: part/templates/part/cat_link.html:3 part/templates/part/category.html:23
+#: part/templates/part/category.html:141 part/templates/part/category.html:161
#: part/templates/part/category_sidebar.html:9
#: templates/InvenTree/index.html:36 templates/InvenTree/search.html:84
#: templates/InvenTree/settings/sidebar.html:47
@@ -5889,13 +5897,13 @@ msgstr ""
msgid "Part IPN"
msgstr ""
-#: part/admin.py:421 part/serializers.py:1220
+#: part/admin.py:421 part/serializers.py:1238
#: templates/js/translated/pricing.js:358
#: templates/js/translated/pricing.js:1024
msgid "Minimum Price"
msgstr ""
-#: part/admin.py:426 part/serializers.py:1235
+#: part/admin.py:426 part/serializers.py:1253
#: templates/js/translated/pricing.js:353
#: templates/js/translated/pricing.js:1032
msgid "Maximum Price"
@@ -5974,7 +5982,7 @@ msgid "This option must be selected"
msgstr ""
#: part/api.py:1541 part/models.py:895 part/models.py:3385 part/models.py:3831
-#: part/serializers.py:388 part/serializers.py:1076
+#: part/serializers.py:396 part/serializers.py:1094
#: part/templates/part/part_base.html:260 stock/api.py:733
#: templates/InvenTree/settings/settings_staff_js.html:300
#: templates/js/translated/notification.js:60
@@ -5982,12 +5990,17 @@ msgstr ""
msgid "Category"
msgstr ""
+#: part/api.py:1828
+msgid "Uses"
+msgstr ""
+
#: part/bom.py:170 part/models.py:100 part/models.py:938
#: part/templates/part/category.html:116 part/templates/part/part_base.html:367
msgid "Default Location"
msgstr ""
-#: part/bom.py:171 templates/email/low_stock_notification.html:16
+#: part/bom.py:171 part/serializers.py:803
+#: templates/email/low_stock_notification.html:16
msgid "Total Stock"
msgstr ""
@@ -6010,7 +6023,8 @@ msgstr ""
msgid "Default location for parts in this category"
msgstr ""
-#: part/models.py:106 stock/models.py:165 templates/js/translated/stock.js:2736
+#: part/models.py:106 stock/models.py:165 templates/js/translated/part.js:2810
+#: templates/js/translated/stock.js:2736
#: templates/js/translated/table_filters.js:239
#: templates/js/translated/table_filters.js:283
msgid "Structural"
@@ -6418,7 +6432,7 @@ msgstr ""
msgid "Test with this name already exists for this part"
msgstr ""
-#: part/models.py:3464 templates/js/translated/part.js:2870
+#: part/models.py:3464 templates/js/translated/part.js:2879
msgid "Test Name"
msgstr ""
@@ -6446,7 +6460,7 @@ msgstr ""
msgid "Is this test enabled?"
msgstr ""
-#: part/models.py:3489 templates/js/translated/part.js:2899
+#: part/models.py:3489 templates/js/translated/part.js:2908
#: templates/js/translated/table_filters.js:477
msgid "Required"
msgstr ""
@@ -6455,7 +6469,7 @@ msgstr ""
msgid "Is this test required to pass?"
msgstr ""
-#: part/models.py:3495 templates/js/translated/part.js:2907
+#: part/models.py:3495 templates/js/translated/part.js:2916
msgid "Requires Value"
msgstr ""
@@ -6463,7 +6477,7 @@ msgstr ""
msgid "Does this test require a value when adding a test result?"
msgstr ""
-#: part/models.py:3501 templates/js/translated/part.js:2914
+#: part/models.py:3501 templates/js/translated/part.js:2923
msgid "Requires Attachment"
msgstr ""
@@ -6685,311 +6699,323 @@ msgstr ""
msgid "Duplicate relationship already exists"
msgstr ""
-#: part/serializers.py:128 part/templates/part/category.html:122
-#: part/templates/part/category.html:207
+#: part/serializers.py:114 part/serializers.py:134
+#: part/templates/part/category.html:122 part/templates/part/category.html:207
#: part/templates/part/category_sidebar.html:7
msgid "Subcategories"
msgstr ""
-#: part/serializers.py:172
+#: part/serializers.py:178
msgid "Results"
msgstr ""
-#: part/serializers.py:173
+#: part/serializers.py:179
msgid "Number of results recorded against this template"
msgstr ""
-#: part/serializers.py:197 part/serializers.py:215 stock/serializers.py:384
+#: part/serializers.py:203 part/serializers.py:221 stock/serializers.py:384
msgid "Purchase currency of this stock item"
msgstr ""
-#: part/serializers.py:260
+#: part/serializers.py:266
msgid "Number of parts using this template"
msgstr ""
-#: part/serializers.py:379
+#: part/serializers.py:387
msgid "No parts selected"
msgstr ""
-#: part/serializers.py:389
+#: part/serializers.py:397
msgid "Select category"
msgstr ""
-#: part/serializers.py:419
+#: part/serializers.py:427
msgid "Original Part"
msgstr ""
-#: part/serializers.py:420
+#: part/serializers.py:428
msgid "Select original part to duplicate"
msgstr ""
-#: part/serializers.py:425
+#: part/serializers.py:433
msgid "Copy Image"
msgstr ""
-#: part/serializers.py:426
+#: part/serializers.py:434
msgid "Copy image from original part"
msgstr ""
-#: part/serializers.py:432 part/templates/part/detail.html:277
+#: part/serializers.py:440 part/templates/part/detail.html:277
msgid "Copy BOM"
msgstr ""
-#: part/serializers.py:433
+#: part/serializers.py:441
msgid "Copy bill of materials from original part"
msgstr ""
-#: part/serializers.py:439
+#: part/serializers.py:447
msgid "Copy Parameters"
msgstr ""
-#: part/serializers.py:440
+#: part/serializers.py:448
msgid "Copy parameter data from original part"
msgstr ""
-#: part/serializers.py:446
+#: part/serializers.py:454
msgid "Copy Notes"
msgstr ""
-#: part/serializers.py:447
+#: part/serializers.py:455
msgid "Copy notes from original part"
msgstr ""
-#: part/serializers.py:460
+#: part/serializers.py:468
msgid "Initial Stock Quantity"
msgstr ""
-#: part/serializers.py:462
+#: part/serializers.py:470
msgid "Specify initial stock quantity for this Part. If quantity is zero, no stock is added."
msgstr ""
-#: part/serializers.py:469
+#: part/serializers.py:477
msgid "Initial Stock Location"
msgstr ""
-#: part/serializers.py:470
+#: part/serializers.py:478
msgid "Specify initial stock location for this Part"
msgstr ""
-#: part/serializers.py:482
+#: part/serializers.py:490
msgid "Select supplier (or leave blank to skip)"
msgstr ""
-#: part/serializers.py:498
+#: part/serializers.py:506
msgid "Select manufacturer (or leave blank to skip)"
msgstr ""
-#: part/serializers.py:508
+#: part/serializers.py:516
msgid "Manufacturer part number"
msgstr ""
-#: part/serializers.py:515
+#: part/serializers.py:523
msgid "Selected company is not a valid supplier"
msgstr ""
-#: part/serializers.py:524
+#: part/serializers.py:532
msgid "Selected company is not a valid manufacturer"
msgstr ""
-#: part/serializers.py:535
+#: part/serializers.py:543
msgid "Manufacturer part matching this MPN already exists"
msgstr ""
-#: part/serializers.py:542
+#: part/serializers.py:550
msgid "Supplier part matching this SKU already exists"
msgstr ""
-#: part/serializers.py:815 part/templates/part/copy_part.html:9
+#: part/serializers.py:804
+msgid "External Stock"
+msgstr ""
+
+#: part/serializers.py:806
+msgid "Unallocated Stock"
+msgstr ""
+
+#: part/serializers.py:808
+msgid "Variant Stock"
+msgstr ""
+
+#: part/serializers.py:833 part/templates/part/copy_part.html:9
#: templates/js/translated/part.js:471
msgid "Duplicate Part"
msgstr ""
-#: part/serializers.py:816
+#: part/serializers.py:834
msgid "Copy initial data from another Part"
msgstr ""
-#: part/serializers.py:822 templates/js/translated/part.js:102
+#: part/serializers.py:840 templates/js/translated/part.js:102
msgid "Initial Stock"
msgstr ""
-#: part/serializers.py:823
+#: part/serializers.py:841
msgid "Create Part with initial stock quantity"
msgstr ""
-#: part/serializers.py:829
+#: part/serializers.py:847
msgid "Supplier Information"
msgstr ""
-#: part/serializers.py:830
+#: part/serializers.py:848
msgid "Add initial supplier information for this part"
msgstr ""
-#: part/serializers.py:838
+#: part/serializers.py:856
msgid "Copy Category Parameters"
msgstr ""
-#: part/serializers.py:839
+#: part/serializers.py:857
msgid "Copy parameter templates from selected part category"
msgstr ""
-#: part/serializers.py:844
+#: part/serializers.py:862
msgid "Existing Image"
msgstr ""
-#: part/serializers.py:845
+#: part/serializers.py:863
msgid "Filename of an existing part image"
msgstr ""
-#: part/serializers.py:862
+#: part/serializers.py:880
msgid "Image file does not exist"
msgstr ""
-#: part/serializers.py:1068
+#: part/serializers.py:1086
msgid "Limit stocktake report to a particular part, and any variant parts"
msgstr ""
-#: part/serializers.py:1078
+#: part/serializers.py:1096
msgid "Limit stocktake report to a particular part category, and any child categories"
msgstr ""
-#: part/serializers.py:1088
+#: part/serializers.py:1106
msgid "Limit stocktake report to a particular stock location, and any child locations"
msgstr ""
-#: part/serializers.py:1094
+#: part/serializers.py:1112
msgid "Exclude External Stock"
msgstr ""
-#: part/serializers.py:1095
+#: part/serializers.py:1113
msgid "Exclude stock items in external locations"
msgstr ""
-#: part/serializers.py:1100
+#: part/serializers.py:1118
msgid "Generate Report"
msgstr ""
-#: part/serializers.py:1101
+#: part/serializers.py:1119
msgid "Generate report file containing calculated stocktake data"
msgstr ""
-#: part/serializers.py:1106
+#: part/serializers.py:1124
msgid "Update Parts"
msgstr ""
-#: part/serializers.py:1107
+#: part/serializers.py:1125
msgid "Update specified parts with calculated stocktake data"
msgstr ""
-#: part/serializers.py:1115
+#: part/serializers.py:1133
msgid "Stocktake functionality is not enabled"
msgstr ""
-#: part/serializers.py:1221
+#: part/serializers.py:1239
msgid "Override calculated value for minimum price"
msgstr ""
-#: part/serializers.py:1228
+#: part/serializers.py:1246
msgid "Minimum price currency"
msgstr ""
-#: part/serializers.py:1236
+#: part/serializers.py:1254
msgid "Override calculated value for maximum price"
msgstr ""
-#: part/serializers.py:1243
+#: part/serializers.py:1261
msgid "Maximum price currency"
msgstr ""
-#: part/serializers.py:1272
+#: part/serializers.py:1290
msgid "Update"
msgstr ""
-#: part/serializers.py:1273
+#: part/serializers.py:1291
msgid "Update pricing for this part"
msgstr ""
-#: part/serializers.py:1296
+#: part/serializers.py:1314
#, python-brace-format
msgid "Could not convert from provided currencies to {default_currency}"
msgstr ""
-#: part/serializers.py:1303
+#: part/serializers.py:1321
msgid "Minimum price must not be greater than maximum price"
msgstr ""
-#: part/serializers.py:1306
+#: part/serializers.py:1324
msgid "Maximum price must not be less than minimum price"
msgstr ""
-#: part/serializers.py:1632
+#: part/serializers.py:1660
msgid "Select part to copy BOM from"
msgstr ""
-#: part/serializers.py:1640
+#: part/serializers.py:1668
msgid "Remove Existing Data"
msgstr ""
-#: part/serializers.py:1641
+#: part/serializers.py:1669
msgid "Remove existing BOM items before copying"
msgstr ""
-#: part/serializers.py:1646
+#: part/serializers.py:1674
msgid "Include Inherited"
msgstr ""
-#: part/serializers.py:1647
+#: part/serializers.py:1675
msgid "Include BOM items which are inherited from templated parts"
msgstr ""
-#: part/serializers.py:1652
+#: part/serializers.py:1680
msgid "Skip Invalid Rows"
msgstr ""
-#: part/serializers.py:1653
+#: part/serializers.py:1681
msgid "Enable this option to skip invalid rows"
msgstr ""
-#: part/serializers.py:1658
+#: part/serializers.py:1686
msgid "Copy Substitute Parts"
msgstr ""
-#: part/serializers.py:1659
+#: part/serializers.py:1687
msgid "Copy substitute parts when duplicate BOM items"
msgstr ""
-#: part/serializers.py:1693
+#: part/serializers.py:1721
msgid "Clear Existing BOM"
msgstr ""
-#: part/serializers.py:1694
+#: part/serializers.py:1722
msgid "Delete existing BOM items before uploading"
msgstr ""
-#: part/serializers.py:1724
+#: part/serializers.py:1752
msgid "No part column specified"
msgstr ""
-#: part/serializers.py:1768
+#: part/serializers.py:1796
msgid "Multiple matching parts found"
msgstr ""
-#: part/serializers.py:1771
+#: part/serializers.py:1799
msgid "No matching part found"
msgstr ""
-#: part/serializers.py:1774
+#: part/serializers.py:1802
msgid "Part is not designated as a component"
msgstr ""
-#: part/serializers.py:1783
+#: part/serializers.py:1811
msgid "Quantity not provided"
msgstr ""
-#: part/serializers.py:1791
+#: part/serializers.py:1819
msgid "Invalid quantity"
msgstr ""
-#: part/serializers.py:1812
+#: part/serializers.py:1840
msgid "At least one BOM item is required"
msgstr ""
@@ -7221,7 +7247,7 @@ msgid "Validate BOM"
msgstr ""
#: part/templates/part/detail.html:283 part/templates/part/detail.html:284
-#: templates/js/translated/bom.js:1314 templates/js/translated/bom.js:1315
+#: templates/js/translated/bom.js:1320 templates/js/translated/bom.js:1321
msgid "Add BOM Item"
msgstr ""
@@ -7405,7 +7431,7 @@ msgstr ""
msgid "Allocated to Sales Orders"
msgstr ""
-#: part/templates/part/part_base.html:235 templates/js/translated/bom.js:1213
+#: part/templates/part/part_base.html:235 templates/js/translated/bom.js:1219
msgid "Can Build"
msgstr ""
@@ -8784,7 +8810,7 @@ msgstr ""
msgid "Where is this stock item located?"
msgstr ""
-#: stock/models.py:786 stock/serializers.py:1318
+#: stock/models.py:786 stock/serializers.py:1324
msgid "Packaging this stock item is stored in"
msgstr ""
@@ -8796,7 +8822,7 @@ msgstr ""
msgid "Serial number for this item"
msgstr ""
-#: stock/models.py:830 stock/serializers.py:1301
+#: stock/models.py:830 stock/serializers.py:1307
msgid "Batch code for this stock item"
msgstr ""
@@ -8905,7 +8931,7 @@ msgstr ""
msgid "Serialized stock cannot be merged"
msgstr ""
-#: stock/models.py:1639 stock/serializers.py:1207
+#: stock/models.py:1639 stock/serializers.py:1213
msgid "Duplicate stock items"
msgstr ""
@@ -8986,7 +9012,7 @@ msgstr ""
msgid "Enter serial numbers for new items"
msgstr ""
-#: stock/serializers.py:473 stock/serializers.py:1164 stock/serializers.py:1420
+#: stock/serializers.py:473 stock/serializers.py:1170 stock/serializers.py:1426
msgid "Destination stock location"
msgstr ""
@@ -9059,77 +9085,78 @@ msgstr ""
msgid "No stock items selected"
msgstr ""
-#: stock/serializers.py:863 stock/templates/stock/location.html:165
+#: stock/serializers.py:863 stock/serializers.py:926
+#: stock/templates/stock/location.html:165
#: stock/templates/stock/location.html:213
#: stock/templates/stock/location_sidebar.html:5
msgid "Sublocations"
msgstr ""
-#: stock/serializers.py:1036
+#: stock/serializers.py:1042
msgid "Part must be salable"
msgstr ""
-#: stock/serializers.py:1040
+#: stock/serializers.py:1046
msgid "Item is allocated to a sales order"
msgstr ""
-#: stock/serializers.py:1044
+#: stock/serializers.py:1050
msgid "Item is allocated to a build order"
msgstr ""
-#: stock/serializers.py:1068
+#: stock/serializers.py:1074
msgid "Customer to assign stock items"
msgstr ""
-#: stock/serializers.py:1074
+#: stock/serializers.py:1080
msgid "Selected company is not a customer"
msgstr ""
-#: stock/serializers.py:1082
+#: stock/serializers.py:1088
msgid "Stock assignment notes"
msgstr ""
-#: stock/serializers.py:1092 stock/serializers.py:1346
+#: stock/serializers.py:1098 stock/serializers.py:1352
msgid "A list of stock items must be provided"
msgstr ""
-#: stock/serializers.py:1171
+#: stock/serializers.py:1177
msgid "Stock merging notes"
msgstr ""
-#: stock/serializers.py:1176
+#: stock/serializers.py:1182
msgid "Allow mismatched suppliers"
msgstr ""
-#: stock/serializers.py:1177
+#: stock/serializers.py:1183
msgid "Allow stock items with different supplier parts to be merged"
msgstr ""
-#: stock/serializers.py:1182
+#: stock/serializers.py:1188
msgid "Allow mismatched status"
msgstr ""
-#: stock/serializers.py:1183
+#: stock/serializers.py:1189
msgid "Allow stock items with different status codes to be merged"
msgstr ""
-#: stock/serializers.py:1193
+#: stock/serializers.py:1199
msgid "At least two stock items must be provided"
msgstr ""
-#: stock/serializers.py:1260
+#: stock/serializers.py:1266
msgid "No Change"
msgstr ""
-#: stock/serializers.py:1289
+#: stock/serializers.py:1295
msgid "StockItem primary key value"
msgstr ""
-#: stock/serializers.py:1308
+#: stock/serializers.py:1314
msgid "Stock item status code"
msgstr ""
-#: stock/serializers.py:1336
+#: stock/serializers.py:1342
msgid "Stock transaction notes"
msgstr ""
@@ -10662,7 +10689,7 @@ msgid "The following parts are low on required stock"
msgstr ""
#: templates/email/build_order_required_stock.html:18
-#: templates/js/translated/bom.js:1668 templates/js/translated/build.js:2557
+#: templates/js/translated/bom.js:1674 templates/js/translated/build.js:2557
msgid "Required Quantity"
msgstr ""
@@ -10676,7 +10703,7 @@ msgid "Click on the following link to view this part"
msgstr ""
#: templates/email/low_stock_notification.html:18
-#: templates/js/translated/part.js:3209
+#: templates/js/translated/part.js:3218
msgid "Minimum Quantity"
msgstr ""
@@ -11051,62 +11078,66 @@ msgstr ""
msgid "No pricing available"
msgstr ""
-#: templates/js/translated/bom.js:1182 templates/js/translated/build.js:2596
+#: templates/js/translated/bom.js:1184 templates/js/translated/build.js:2622
+msgid "External stock"
+msgstr ""
+
+#: templates/js/translated/bom.js:1188 templates/js/translated/build.js:2596
#: templates/js/translated/sales_order.js:1910
msgid "No Stock Available"
msgstr ""
-#: templates/js/translated/bom.js:1187 templates/js/translated/build.js:2600
+#: templates/js/translated/bom.js:1193 templates/js/translated/build.js:2600
msgid "Includes variant and substitute stock"
msgstr ""
-#: templates/js/translated/bom.js:1189 templates/js/translated/build.js:2602
+#: templates/js/translated/bom.js:1195 templates/js/translated/build.js:2602
#: templates/js/translated/part.js:1256
#: templates/js/translated/sales_order.js:1907
msgid "Includes variant stock"
msgstr ""
-#: templates/js/translated/bom.js:1191 templates/js/translated/build.js:2604
+#: templates/js/translated/bom.js:1197 templates/js/translated/build.js:2604
msgid "Includes substitute stock"
msgstr ""
-#: templates/js/translated/bom.js:1219 templates/js/translated/build.js:2587
+#: templates/js/translated/bom.js:1225 templates/js/translated/build.js:2587
msgid "Consumable item"
msgstr ""
-#: templates/js/translated/bom.js:1279
+#: templates/js/translated/bom.js:1285
msgid "Validate BOM Item"
msgstr ""
-#: templates/js/translated/bom.js:1281
+#: templates/js/translated/bom.js:1287
msgid "This line has been validated"
msgstr ""
-#: templates/js/translated/bom.js:1283
+#: templates/js/translated/bom.js:1289
msgid "Edit substitute parts"
msgstr ""
-#: templates/js/translated/bom.js:1285 templates/js/translated/bom.js:1480
+#: templates/js/translated/bom.js:1291 templates/js/translated/bom.js:1486
msgid "Edit BOM Item"
msgstr ""
-#: templates/js/translated/bom.js:1287
+#: templates/js/translated/bom.js:1293
msgid "Delete BOM Item"
msgstr ""
-#: templates/js/translated/bom.js:1307
+#: templates/js/translated/bom.js:1313
msgid "View BOM"
msgstr ""
-#: templates/js/translated/bom.js:1391
+#: templates/js/translated/bom.js:1397
msgid "No BOM items found"
msgstr ""
-#: templates/js/translated/bom.js:1651 templates/js/translated/build.js:2486
+#: templates/js/translated/bom.js:1657 templates/js/translated/build.js:2486
msgid "Required Part"
msgstr ""
-#: templates/js/translated/bom.js:1677
+#: templates/js/translated/bom.js:1683
msgid "Inherited from parent BOM"
msgstr ""
@@ -11449,29 +11480,29 @@ msgstr ""
msgid "Sufficient stock available"
msgstr ""
-#: templates/js/translated/build.js:2643
+#: templates/js/translated/build.js:2647
msgid "Consumable Item"
msgstr ""
-#: templates/js/translated/build.js:2648
+#: templates/js/translated/build.js:2652
msgid "Tracked item"
msgstr ""
-#: templates/js/translated/build.js:2655
+#: templates/js/translated/build.js:2659
#: templates/js/translated/sales_order.js:2016
msgid "Build stock"
msgstr ""
-#: templates/js/translated/build.js:2660 templates/js/translated/stock.js:1829
+#: templates/js/translated/build.js:2664 templates/js/translated/stock.js:1829
msgid "Order stock"
msgstr ""
-#: templates/js/translated/build.js:2664
+#: templates/js/translated/build.js:2668
#: templates/js/translated/sales_order.js:2010
msgid "Allocate stock"
msgstr ""
-#: templates/js/translated/build.js:2668
+#: templates/js/translated/build.js:2672
msgid "Remove stock allocation"
msgstr ""
@@ -12313,64 +12344,64 @@ msgstr ""
msgid "Subscribed category"
msgstr ""
-#: templates/js/translated/part.js:2855
+#: templates/js/translated/part.js:2864
msgid "No test templates matching query"
msgstr ""
-#: templates/js/translated/part.js:2877 templates/js/translated/search.js:342
+#: templates/js/translated/part.js:2886 templates/js/translated/search.js:342
msgid "results"
msgstr ""
-#: templates/js/translated/part.js:2927 templates/js/translated/stock.js:1446
+#: templates/js/translated/part.js:2936 templates/js/translated/stock.js:1446
msgid "Edit test result"
msgstr ""
-#: templates/js/translated/part.js:2928 templates/js/translated/stock.js:1447
+#: templates/js/translated/part.js:2937 templates/js/translated/stock.js:1447
#: templates/js/translated/stock.js:1692
msgid "Delete test result"
msgstr ""
-#: templates/js/translated/part.js:2932
+#: templates/js/translated/part.js:2941
msgid "This test is defined for a parent part"
msgstr ""
-#: templates/js/translated/part.js:2948
+#: templates/js/translated/part.js:2957
msgid "Edit Test Result Template"
msgstr ""
-#: templates/js/translated/part.js:2962
+#: templates/js/translated/part.js:2971
msgid "Delete Test Result Template"
msgstr ""
-#: templates/js/translated/part.js:3041 templates/js/translated/part.js:3042
+#: templates/js/translated/part.js:3050 templates/js/translated/part.js:3051
msgid "No date specified"
msgstr ""
-#: templates/js/translated/part.js:3044
+#: templates/js/translated/part.js:3053
msgid "Specified date is in the past"
msgstr ""
-#: templates/js/translated/part.js:3050
+#: templates/js/translated/part.js:3059
msgid "Speculative"
msgstr ""
-#: templates/js/translated/part.js:3100
+#: templates/js/translated/part.js:3109
msgid "No scheduling information available for this part"
msgstr ""
-#: templates/js/translated/part.js:3106
+#: templates/js/translated/part.js:3115
msgid "Error fetching scheduling information for this part"
msgstr ""
-#: templates/js/translated/part.js:3202
+#: templates/js/translated/part.js:3211
msgid "Scheduled Stock Quantities"
msgstr ""
-#: templates/js/translated/part.js:3218
+#: templates/js/translated/part.js:3227
msgid "Maximum Quantity"
msgstr ""
-#: templates/js/translated/part.js:3263
+#: templates/js/translated/part.js:3272
msgid "Minimum Stock Level"
msgstr ""
diff --git a/InvenTree/locale/en/LC_MESSAGES/django.po b/InvenTree/locale/en/LC_MESSAGES/django.po
index a6f744f447..7d787a6234 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: 2024-02-28 06:44+0000\n"
+"POT-Creation-Date: 2024-03-05 00:41+0000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME \n"
"Language-Team: LANGUAGE \n"
@@ -67,9 +67,9 @@ msgstr ""
#: report/templates/report/inventree_build_order_base.html:172
#: stock/admin.py:226 stock/models.py:2335 stock/models.py:2451
#: stock/serializers.py:479 stock/serializers.py:632 stock/serializers.py:728
-#: stock/serializers.py:778 stock/serializers.py:1081 stock/serializers.py:1170
-#: stock/serializers.py:1335 stock/templates/stock/stock_sidebar.html:25
-#: templates/js/translated/barcode.js:143 templates/js/translated/bom.js:1259
+#: stock/serializers.py:778 stock/serializers.py:1087 stock/serializers.py:1176
+#: stock/serializers.py:1341 stock/templates/stock/stock_sidebar.html:25
+#: templates/js/translated/barcode.js:143 templates/js/translated/bom.js:1265
#: templates/js/translated/company.js:1674 templates/js/translated/order.js:347
#: templates/js/translated/part.js:1080
#: templates/js/translated/purchase_order.js:2201
@@ -524,7 +524,7 @@ msgstr ""
#: templates/js/translated/order.js:298 templates/js/translated/part.js:1238
#: templates/js/translated/part.js:1483 templates/js/translated/part.js:1621
#: templates/js/translated/part.js:1958 templates/js/translated/part.js:2355
-#: templates/js/translated/part.js:2785 templates/js/translated/part.js:2887
+#: templates/js/translated/part.js:2785 templates/js/translated/part.js:2896
#: templates/js/translated/plugin.js:80
#: templates/js/translated/purchase_order.js:1707
#: templates/js/translated/purchase_order.js:1850
@@ -679,7 +679,7 @@ msgstr ""
msgid "Downloading images from remote URL is not enabled"
msgstr ""
-#: InvenTree/status.py:66 part/serializers.py:1120
+#: InvenTree/status.py:66 part/serializers.py:1138
msgid "Background worker check failed"
msgstr ""
@@ -961,7 +961,7 @@ msgid "Tracked"
msgstr ""
#: build/api.py:285 part/admin.py:144 templates/js/translated/build.js:1741
-#: templates/js/translated/build.js:2626
+#: templates/js/translated/build.js:2630
#: templates/js/translated/sales_order.js:1929
#: templates/js/translated/table_filters.js:571
msgid "Allocated"
@@ -1045,11 +1045,11 @@ msgstr ""
#: build/models.py:199 build/templates/build/build_base.html:97
#: build/templates/build/detail.html:29 company/models.py:1044
#: order/models.py:1389 order/models.py:1532 order/models.py:1533
-#: part/api.py:1528 part/models.py:389 part/models.py:3003 part/models.py:3147
-#: part/models.py:3291 part/models.py:3314 part/models.py:3335
-#: part/models.py:3357 part/models.py:3458 part/models.py:3754
-#: part/models.py:3885 part/models.py:3978 part/models.py:4339
-#: part/serializers.py:1066 part/serializers.py:1631
+#: part/api.py:1528 part/api.py:1820 part/models.py:389 part/models.py:3003
+#: part/models.py:3147 part/models.py:3291 part/models.py:3314
+#: part/models.py:3335 part/models.py:3357 part/models.py:3458
+#: part/models.py:3754 part/models.py:3885 part/models.py:3978
+#: part/models.py:4339 part/serializers.py:1084 part/serializers.py:1659
#: part/templates/part/part_app_base.html:8
#: part/templates/part/part_pricing.html:12
#: part/templates/part/upload_bom.html:52
@@ -1148,7 +1148,7 @@ msgid "Build status code"
msgstr ""
#: build/models.py:264 build/serializers.py:280 order/serializers.py:549
-#: stock/models.py:826 stock/serializers.py:1300
+#: stock/models.py:826 stock/serializers.py:1306
#: templates/js/translated/purchase_order.js:1129
msgid "Batch Code"
msgstr ""
@@ -1243,48 +1243,48 @@ msgstr ""
msgid "Project code for this build order"
msgstr ""
-#: build/models.py:559
+#: build/models.py:575
#, python-brace-format
msgid "Build order {build} has been completed"
msgstr ""
-#: build/models.py:565
+#: build/models.py:581
msgid "A build order has been completed"
msgstr ""
-#: build/models.py:783 build/models.py:858
+#: build/models.py:799 build/models.py:874
msgid "No build output specified"
msgstr ""
-#: build/models.py:786
+#: build/models.py:802
msgid "Build output is already completed"
msgstr ""
-#: build/models.py:789
+#: build/models.py:805
msgid "Build output does not match Build Order"
msgstr ""
-#: build/models.py:862 build/serializers.py:223 build/serializers.py:262
+#: build/models.py:878 build/serializers.py:223 build/serializers.py:262
#: build/serializers.py:831 order/models.py:526 order/serializers.py:401
-#: order/serializers.py:544 part/serializers.py:1423 part/serializers.py:1789
+#: order/serializers.py:544 part/serializers.py:1442 part/serializers.py:1817
#: stock/models.py:665 stock/models.py:1477 stock/serializers.py:450
msgid "Quantity must be greater than zero"
msgstr ""
-#: build/models.py:867 build/serializers.py:228
+#: build/models.py:883 build/serializers.py:228
msgid "Quantity cannot be greater than the output quantity"
msgstr ""
-#: build/models.py:924 build/serializers.py:533
+#: build/models.py:940 build/serializers.py:533
#, python-brace-format
msgid "Build output {serial} has not passed all required tests"
msgstr ""
-#: build/models.py:1286
+#: build/models.py:1302
msgid "Build object"
msgstr ""
-#: build/models.py:1300 build/models.py:1558 build/serializers.py:210
+#: build/models.py:1316 build/models.py:1574 build/serializers.py:210
#: build/serializers.py:247 build/templates/build/build_base.html:102
#: build/templates/build/detail.html:34 common/models.py:2432
#: order/models.py:1247 order/models.py:1902 order/serializers.py:1306
@@ -1311,7 +1311,7 @@ msgstr ""
#: templates/js/translated/company.js:1808
#: templates/js/translated/model_renderers.js:230
#: templates/js/translated/order.js:304 templates/js/translated/part.js:961
-#: templates/js/translated/part.js:1811 templates/js/translated/part.js:3332
+#: templates/js/translated/part.js:1811 templates/js/translated/part.js:3341
#: templates/js/translated/pricing.js:381
#: templates/js/translated/pricing.js:474
#: templates/js/translated/pricing.js:522
@@ -1331,38 +1331,38 @@ msgstr ""
msgid "Quantity"
msgstr ""
-#: build/models.py:1301
+#: build/models.py:1317
msgid "Required quantity for build order"
msgstr ""
-#: build/models.py:1381
+#: build/models.py:1397
msgid "Build item must specify a build output, as master part is marked as trackable"
msgstr ""
-#: build/models.py:1390
+#: build/models.py:1406
#, python-brace-format
msgid "Allocated quantity ({q}) must not exceed available stock quantity ({a})"
msgstr ""
-#: build/models.py:1400 order/models.py:1853
+#: build/models.py:1416 order/models.py:1853
msgid "Stock item is over-allocated"
msgstr ""
-#: build/models.py:1406 order/models.py:1856
+#: build/models.py:1422 order/models.py:1856
msgid "Allocation quantity must be greater than zero"
msgstr ""
-#: build/models.py:1412
+#: build/models.py:1428
msgid "Quantity must be 1 for serialized stock"
msgstr ""
-#: build/models.py:1473
+#: build/models.py:1489
msgid "Selected stock item does not match BOM line"
msgstr ""
-#: build/models.py:1545 build/serializers.py:811 order/serializers.py:1150
-#: order/serializers.py:1171 stock/serializers.py:544 stock/serializers.py:1019
-#: stock/serializers.py:1131 stock/templates/stock/item_base.html:10
+#: build/models.py:1561 build/serializers.py:811 order/serializers.py:1150
+#: order/serializers.py:1171 stock/serializers.py:544 stock/serializers.py:1025
+#: stock/serializers.py:1137 stock/templates/stock/item_base.html:10
#: stock/templates/stock/item_base.html:23
#: stock/templates/stock/item_base.html:194
#: templates/js/translated/build.js:1742
@@ -1377,19 +1377,19 @@ msgstr ""
msgid "Stock Item"
msgstr ""
-#: build/models.py:1546
+#: build/models.py:1562
msgid "Source stock item"
msgstr ""
-#: build/models.py:1559
+#: build/models.py:1575
msgid "Stock quantity to allocate to build"
msgstr ""
-#: build/models.py:1567
+#: build/models.py:1583
msgid "Install into"
msgstr ""
-#: build/models.py:1568
+#: build/models.py:1584
msgid "Destination stock item"
msgstr ""
@@ -1453,9 +1453,9 @@ msgid "A list of build outputs must be provided"
msgstr ""
#: build/serializers.py:426 build/serializers.py:498 order/serializers.py:533
-#: order/serializers.py:641 order/serializers.py:1646 part/serializers.py:1086
+#: order/serializers.py:641 order/serializers.py:1646 part/serializers.py:1104
#: stock/serializers.py:472 stock/serializers.py:627 stock/serializers.py:723
-#: stock/serializers.py:1163 stock/serializers.py:1419
+#: stock/serializers.py:1169 stock/serializers.py:1425
#: stock/templates/stock/item_base.html:394
#: templates/js/translated/barcode.js:547
#: templates/js/translated/barcode.js:795 templates/js/translated/build.js:999
@@ -1495,7 +1495,7 @@ msgstr ""
#: build/serializers.py:505 build/templates/build/build_base.html:151
#: build/templates/build/detail.html:62 order/models.py:910
#: order/models.py:2005 order/serializers.py:565 stock/admin.py:165
-#: stock/serializers.py:774 stock/serializers.py:1307
+#: stock/serializers.py:774 stock/serializers.py:1313
#: stock/templates/stock/item_base.html:427
#: templates/js/translated/barcode.js:252 templates/js/translated/build.js:2189
#: templates/js/translated/purchase_order.js:1308
@@ -1603,7 +1603,7 @@ msgstr ""
msgid "bom_item.part must point to the same part as the build order"
msgstr ""
-#: build/serializers.py:817 stock/serializers.py:1032
+#: build/serializers.py:817 stock/serializers.py:1038
msgid "Item must be in stock"
msgstr ""
@@ -1660,44 +1660,45 @@ msgstr ""
msgid "Allocate optional BOM items to build order"
msgstr ""
-#: build/serializers.py:1096 part/models.py:3895 part/models.py:4331
+#: build/serializers.py:1097 part/models.py:3895 part/models.py:4331
#: stock/api.py:745
msgid "BOM Item"
msgstr ""
-#: build/serializers.py:1105 templates/js/translated/index.js:130
+#: build/serializers.py:1106 templates/js/translated/index.js:130
msgid "Allocated Stock"
msgstr ""
-#: build/serializers.py:1110 part/admin.py:132 part/bom.py:173
-#: part/serializers.py:1441 part/templates/part/part_base.html:210
-#: templates/js/translated/bom.js:1202 templates/js/translated/build.js:2614
-#: templates/js/translated/part.js:709 templates/js/translated/part.js:2148
+#: build/serializers.py:1111 part/admin.py:132 part/bom.py:173
+#: part/serializers.py:798 part/serializers.py:1460
+#: part/templates/part/part_base.html:210 templates/js/translated/bom.js:1208
+#: templates/js/translated/build.js:2614 templates/js/translated/part.js:709
+#: templates/js/translated/part.js:2148
#: templates/js/translated/table_filters.js:170
msgid "On Order"
msgstr ""
-#: build/serializers.py:1115 part/serializers.py:1443
+#: build/serializers.py:1116 part/serializers.py:1462
#: templates/js/translated/build.js:2618
#: templates/js/translated/table_filters.js:360
msgid "In Production"
msgstr ""
-#: build/serializers.py:1120 part/bom.py:172 part/serializers.py:1454
+#: build/serializers.py:1121 part/bom.py:172 part/serializers.py:1473
#: part/templates/part/part_base.html:192
#: templates/js/translated/sales_order.js:1893
msgid "Available Stock"
msgstr ""
-#: build/tasks.py:149
+#: build/tasks.py:171
msgid "Stock required for build order"
msgstr ""
-#: build/tasks.py:166
+#: build/tasks.py:188
msgid "Overdue Build Order"
msgstr ""
-#: build/tasks.py:171
+#: build/tasks.py:193
#, python-brace-format
msgid "Build order {bo} is now overdue"
msgstr ""
@@ -1991,27 +1992,31 @@ msgstr ""
msgid "Order Parts"
msgstr ""
-#: build/templates/build/detail.html:210
-msgid "Incomplete Build Outputs"
-msgstr ""
-
-#: build/templates/build/detail.html:214
-msgid "Create new build output"
+#: build/templates/build/detail.html:205
+msgid "Available stock has been filtered based on specified source location for this build order"
msgstr ""
#: build/templates/build/detail.html:215
+msgid "Incomplete Build Outputs"
+msgstr ""
+
+#: build/templates/build/detail.html:219
+msgid "Create new build output"
+msgstr ""
+
+#: build/templates/build/detail.html:220
msgid "New Build Output"
msgstr ""
-#: build/templates/build/detail.html:232 build/templates/build/sidebar.html:15
+#: build/templates/build/detail.html:237 build/templates/build/sidebar.html:15
msgid "Consumed Stock"
msgstr ""
-#: build/templates/build/detail.html:244
+#: build/templates/build/detail.html:249
msgid "Completed Build Outputs"
msgstr ""
-#: build/templates/build/detail.html:256 build/templates/build/sidebar.html:19
+#: build/templates/build/detail.html:261 build/templates/build/sidebar.html:19
#: company/templates/company/detail.html:229
#: company/templates/company/manufacturer_part.html:141
#: company/templates/company/manufacturer_part_sidebar.html:9
@@ -2027,15 +2032,15 @@ msgstr ""
msgid "Attachments"
msgstr ""
-#: build/templates/build/detail.html:271
+#: build/templates/build/detail.html:276
msgid "Build Notes"
msgstr ""
-#: build/templates/build/detail.html:426
+#: build/templates/build/detail.html:434
msgid "Allocation Complete"
msgstr ""
-#: build/templates/build/detail.html:427
+#: build/templates/build/detail.html:435
msgid "All lines have been fully allocated"
msgstr ""
@@ -2437,7 +2442,7 @@ msgid "Parts are templates by default"
msgstr ""
#: common/models.py:1456 part/admin.py:91 part/admin.py:431 part/models.py:1015
-#: templates/js/translated/bom.js:1633
+#: templates/js/translated/bom.js:1639
#: templates/js/translated/table_filters.js:330
#: templates/js/translated/table_filters.js:721
msgid "Assembly"
@@ -3496,7 +3501,7 @@ msgstr ""
msgid "Price break quantity"
msgstr ""
-#: common/models.py:2440 company/serializers.py:484 order/admin.py:42
+#: common/models.py:2440 company/serializers.py:486 order/admin.py:42
#: order/models.py:1321 order/models.py:2226
#: templates/js/translated/company.js:1813 templates/js/translated/part.js:1885
#: templates/js/translated/pricing.js:621
@@ -3973,7 +3978,7 @@ msgstr ""
#: company/models.py:495 company/templates/company/company_base.html:76
#: company/templates/company/manufacturer_part.html:90
-#: company/templates/company/supplier_part.html:145 part/serializers.py:497
+#: company/templates/company/supplier_part.html:145 part/serializers.py:505
#: stock/templates/stock/item_base.html:207
#: templates/js/translated/company.js:506
#: templates/js/translated/company.js:1108
@@ -3988,7 +3993,7 @@ msgid "Select manufacturer"
msgstr ""
#: company/models.py:502 company/templates/company/manufacturer_part.html:101
-#: company/templates/company/supplier_part.html:153 part/serializers.py:507
+#: company/templates/company/supplier_part.html:153 part/serializers.py:515
#: templates/js/translated/company.js:351
#: templates/js/translated/company.js:1107
#: templates/js/translated/company.js:1302
@@ -4060,7 +4065,7 @@ msgstr ""
#: company/models.py:795 company/templates/company/company_base.html:81
#: company/templates/company/supplier_part.html:129 order/models.py:453
#: order/templates/order/order_base.html:136 part/bom.py:272 part/bom.py:310
-#: part/serializers.py:481 plugin/builtin/suppliers/digikey.py:25
+#: part/serializers.py:489 plugin/builtin/suppliers/digikey.py:25
#: plugin/builtin/suppliers/lcsc.py:26 plugin/builtin/suppliers/mouser.py:24
#: plugin/builtin/suppliers/tme.py:26 stock/templates/stock/item_base.html:224
#: templates/email/overdue_purchase_order.html:16
@@ -4077,7 +4082,7 @@ msgstr ""
msgid "Select supplier"
msgstr ""
-#: company/models.py:802 part/serializers.py:492
+#: company/models.py:802 part/serializers.py:500
msgid "Supplier stock keeping unit"
msgstr ""
@@ -4113,7 +4118,7 @@ msgid "Minimum charge (e.g. stocking fee)"
msgstr ""
#: company/models.py:851 company/templates/company/supplier_part.html:160
-#: stock/admin.py:224 stock/models.py:785 stock/serializers.py:1317
+#: stock/admin.py:224 stock/models.py:785 stock/serializers.py:1323
#: stock/templates/stock/item_base.html:240
#: templates/js/translated/company.js:1636
#: templates/js/translated/stock.js:2387
@@ -4158,7 +4163,7 @@ msgstr ""
msgid "Date of last update of availability data"
msgstr ""
-#: company/serializers.py:153
+#: company/serializers.py:155
msgid "Default currency used for this supplier"
msgstr ""
@@ -4219,7 +4224,7 @@ msgstr ""
#: company/templates/company/company_base.html:86 order/models.py:898
#: order/models.py:1993 order/templates/order/return_order_base.html:131
#: order/templates/order/sales_order_base.html:144 stock/models.py:807
-#: stock/models.py:808 stock/serializers.py:1067
+#: stock/models.py:808 stock/serializers.py:1073
#: stock/templates/stock/item_base.html:405
#: templates/email/overdue_sales_order.html:16
#: templates/js/translated/company.js:502
@@ -4430,8 +4435,9 @@ msgstr ""
#: company/templates/company/manufacturer_part.html:119
#: company/templates/company/supplier_part.html:15 company/views.py:31
-#: part/admin.py:122 part/templates/part/part_sidebar.html:33
-#: templates/InvenTree/search.html:190 templates/navbar.html:48
+#: part/admin.py:122 part/serializers.py:802
+#: part/templates/part/part_sidebar.html:33 templates/InvenTree/search.html:190
+#: templates/navbar.html:48
msgid "Suppliers"
msgstr ""
@@ -4529,7 +4535,7 @@ msgid "No supplier information available"
msgstr ""
#: company/templates/company/supplier_part.html:139 part/bom.py:279
-#: part/bom.py:311 part/serializers.py:491
+#: part/bom.py:311 part/serializers.py:499
#: templates/js/translated/company.js:349 templates/js/translated/part.js:1786
#: templates/js/translated/pricing.js:510
#: templates/js/translated/purchase_order.js:1851
@@ -4578,10 +4584,12 @@ msgstr ""
msgid "Update Part Availability"
msgstr ""
-#: company/templates/company/supplier_part_sidebar.html:5 part/stocktake.py:223
+#: company/templates/company/supplier_part_sidebar.html:5
+#: part/serializers.py:801 part/stocktake.py:223
#: part/templates/part/category.html:183
#: part/templates/part/category_sidebar.html:17 stock/admin.py:69
-#: stock/serializers.py:760 stock/templates/stock/location.html:170
+#: stock/serializers.py:760 stock/serializers.py:924
+#: stock/templates/stock/location.html:170
#: stock/templates/stock/location.html:184
#: stock/templates/stock/location.html:196
#: stock/templates/stock/location_sidebar.html:7
@@ -4641,7 +4649,7 @@ msgid "Label template file"
msgstr ""
#: label/models.py:143 part/models.py:3484 report/models.py:322
-#: templates/js/translated/part.js:2891
+#: templates/js/translated/part.js:2900
#: templates/js/translated/table_filters.js:481
msgid "Enabled"
msgstr ""
@@ -5734,7 +5742,7 @@ msgid "Pending Shipments"
msgstr ""
#: order/templates/order/sales_order_detail.html:71
-#: templates/js/translated/bom.js:1271 templates/js/translated/filters.js:296
+#: templates/js/translated/bom.js:1277 templates/js/translated/filters.js:296
msgid "Actions"
msgstr ""
@@ -5862,10 +5870,10 @@ msgstr ""
msgid "Category Path"
msgstr ""
-#: part/admin.py:323 part/models.py:390 part/serializers.py:259
-#: part/serializers.py:373 part/templates/part/cat_link.html:3
-#: part/templates/part/category.html:23 part/templates/part/category.html:141
-#: part/templates/part/category.html:161
+#: part/admin.py:323 part/models.py:390 part/serializers.py:112
+#: part/serializers.py:265 part/serializers.py:381
+#: part/templates/part/cat_link.html:3 part/templates/part/category.html:23
+#: part/templates/part/category.html:141 part/templates/part/category.html:161
#: part/templates/part/category_sidebar.html:9
#: templates/InvenTree/index.html:36 templates/InvenTree/search.html:84
#: templates/InvenTree/settings/sidebar.html:47
@@ -5890,13 +5898,13 @@ msgstr ""
msgid "Part IPN"
msgstr ""
-#: part/admin.py:421 part/serializers.py:1220
+#: part/admin.py:421 part/serializers.py:1238
#: templates/js/translated/pricing.js:358
#: templates/js/translated/pricing.js:1024
msgid "Minimum Price"
msgstr ""
-#: part/admin.py:426 part/serializers.py:1235
+#: part/admin.py:426 part/serializers.py:1253
#: templates/js/translated/pricing.js:353
#: templates/js/translated/pricing.js:1032
msgid "Maximum Price"
@@ -5975,7 +5983,7 @@ msgid "This option must be selected"
msgstr ""
#: part/api.py:1541 part/models.py:895 part/models.py:3385 part/models.py:3831
-#: part/serializers.py:388 part/serializers.py:1076
+#: part/serializers.py:396 part/serializers.py:1094
#: part/templates/part/part_base.html:260 stock/api.py:733
#: templates/InvenTree/settings/settings_staff_js.html:300
#: templates/js/translated/notification.js:60
@@ -5983,12 +5991,17 @@ msgstr ""
msgid "Category"
msgstr ""
+#: part/api.py:1828
+msgid "Uses"
+msgstr ""
+
#: part/bom.py:170 part/models.py:100 part/models.py:938
#: part/templates/part/category.html:116 part/templates/part/part_base.html:367
msgid "Default Location"
msgstr ""
-#: part/bom.py:171 templates/email/low_stock_notification.html:16
+#: part/bom.py:171 part/serializers.py:803
+#: templates/email/low_stock_notification.html:16
msgid "Total Stock"
msgstr ""
@@ -6011,7 +6024,8 @@ msgstr ""
msgid "Default location for parts in this category"
msgstr ""
-#: part/models.py:106 stock/models.py:165 templates/js/translated/stock.js:2736
+#: part/models.py:106 stock/models.py:165 templates/js/translated/part.js:2810
+#: templates/js/translated/stock.js:2736
#: templates/js/translated/table_filters.js:239
#: templates/js/translated/table_filters.js:283
msgid "Structural"
@@ -6419,7 +6433,7 @@ msgstr ""
msgid "Test with this name already exists for this part"
msgstr ""
-#: part/models.py:3464 templates/js/translated/part.js:2870
+#: part/models.py:3464 templates/js/translated/part.js:2879
msgid "Test Name"
msgstr ""
@@ -6447,7 +6461,7 @@ msgstr ""
msgid "Is this test enabled?"
msgstr ""
-#: part/models.py:3489 templates/js/translated/part.js:2899
+#: part/models.py:3489 templates/js/translated/part.js:2908
#: templates/js/translated/table_filters.js:477
msgid "Required"
msgstr ""
@@ -6456,7 +6470,7 @@ msgstr ""
msgid "Is this test required to pass?"
msgstr ""
-#: part/models.py:3495 templates/js/translated/part.js:2907
+#: part/models.py:3495 templates/js/translated/part.js:2916
msgid "Requires Value"
msgstr ""
@@ -6464,7 +6478,7 @@ msgstr ""
msgid "Does this test require a value when adding a test result?"
msgstr ""
-#: part/models.py:3501 templates/js/translated/part.js:2914
+#: part/models.py:3501 templates/js/translated/part.js:2923
msgid "Requires Attachment"
msgstr ""
@@ -6686,311 +6700,323 @@ msgstr ""
msgid "Duplicate relationship already exists"
msgstr ""
-#: part/serializers.py:128 part/templates/part/category.html:122
-#: part/templates/part/category.html:207
+#: part/serializers.py:114 part/serializers.py:134
+#: part/templates/part/category.html:122 part/templates/part/category.html:207
#: part/templates/part/category_sidebar.html:7
msgid "Subcategories"
msgstr ""
-#: part/serializers.py:172
+#: part/serializers.py:178
msgid "Results"
msgstr ""
-#: part/serializers.py:173
+#: part/serializers.py:179
msgid "Number of results recorded against this template"
msgstr ""
-#: part/serializers.py:197 part/serializers.py:215 stock/serializers.py:384
+#: part/serializers.py:203 part/serializers.py:221 stock/serializers.py:384
msgid "Purchase currency of this stock item"
msgstr ""
-#: part/serializers.py:260
+#: part/serializers.py:266
msgid "Number of parts using this template"
msgstr ""
-#: part/serializers.py:379
+#: part/serializers.py:387
msgid "No parts selected"
msgstr ""
-#: part/serializers.py:389
+#: part/serializers.py:397
msgid "Select category"
msgstr ""
-#: part/serializers.py:419
+#: part/serializers.py:427
msgid "Original Part"
msgstr ""
-#: part/serializers.py:420
+#: part/serializers.py:428
msgid "Select original part to duplicate"
msgstr ""
-#: part/serializers.py:425
+#: part/serializers.py:433
msgid "Copy Image"
msgstr ""
-#: part/serializers.py:426
+#: part/serializers.py:434
msgid "Copy image from original part"
msgstr ""
-#: part/serializers.py:432 part/templates/part/detail.html:277
+#: part/serializers.py:440 part/templates/part/detail.html:277
msgid "Copy BOM"
msgstr ""
-#: part/serializers.py:433
+#: part/serializers.py:441
msgid "Copy bill of materials from original part"
msgstr ""
-#: part/serializers.py:439
+#: part/serializers.py:447
msgid "Copy Parameters"
msgstr ""
-#: part/serializers.py:440
+#: part/serializers.py:448
msgid "Copy parameter data from original part"
msgstr ""
-#: part/serializers.py:446
+#: part/serializers.py:454
msgid "Copy Notes"
msgstr ""
-#: part/serializers.py:447
+#: part/serializers.py:455
msgid "Copy notes from original part"
msgstr ""
-#: part/serializers.py:460
+#: part/serializers.py:468
msgid "Initial Stock Quantity"
msgstr ""
-#: part/serializers.py:462
+#: part/serializers.py:470
msgid "Specify initial stock quantity for this Part. If quantity is zero, no stock is added."
msgstr ""
-#: part/serializers.py:469
+#: part/serializers.py:477
msgid "Initial Stock Location"
msgstr ""
-#: part/serializers.py:470
+#: part/serializers.py:478
msgid "Specify initial stock location for this Part"
msgstr ""
-#: part/serializers.py:482
+#: part/serializers.py:490
msgid "Select supplier (or leave blank to skip)"
msgstr ""
-#: part/serializers.py:498
+#: part/serializers.py:506
msgid "Select manufacturer (or leave blank to skip)"
msgstr ""
-#: part/serializers.py:508
+#: part/serializers.py:516
msgid "Manufacturer part number"
msgstr ""
-#: part/serializers.py:515
+#: part/serializers.py:523
msgid "Selected company is not a valid supplier"
msgstr ""
-#: part/serializers.py:524
+#: part/serializers.py:532
msgid "Selected company is not a valid manufacturer"
msgstr ""
-#: part/serializers.py:535
+#: part/serializers.py:543
msgid "Manufacturer part matching this MPN already exists"
msgstr ""
-#: part/serializers.py:542
+#: part/serializers.py:550
msgid "Supplier part matching this SKU already exists"
msgstr ""
-#: part/serializers.py:815 part/templates/part/copy_part.html:9
+#: part/serializers.py:804
+msgid "External Stock"
+msgstr ""
+
+#: part/serializers.py:806
+msgid "Unallocated Stock"
+msgstr ""
+
+#: part/serializers.py:808
+msgid "Variant Stock"
+msgstr ""
+
+#: part/serializers.py:833 part/templates/part/copy_part.html:9
#: templates/js/translated/part.js:471
msgid "Duplicate Part"
msgstr ""
-#: part/serializers.py:816
+#: part/serializers.py:834
msgid "Copy initial data from another Part"
msgstr ""
-#: part/serializers.py:822 templates/js/translated/part.js:102
+#: part/serializers.py:840 templates/js/translated/part.js:102
msgid "Initial Stock"
msgstr ""
-#: part/serializers.py:823
+#: part/serializers.py:841
msgid "Create Part with initial stock quantity"
msgstr ""
-#: part/serializers.py:829
+#: part/serializers.py:847
msgid "Supplier Information"
msgstr ""
-#: part/serializers.py:830
+#: part/serializers.py:848
msgid "Add initial supplier information for this part"
msgstr ""
-#: part/serializers.py:838
+#: part/serializers.py:856
msgid "Copy Category Parameters"
msgstr ""
-#: part/serializers.py:839
+#: part/serializers.py:857
msgid "Copy parameter templates from selected part category"
msgstr ""
-#: part/serializers.py:844
+#: part/serializers.py:862
msgid "Existing Image"
msgstr ""
-#: part/serializers.py:845
+#: part/serializers.py:863
msgid "Filename of an existing part image"
msgstr ""
-#: part/serializers.py:862
+#: part/serializers.py:880
msgid "Image file does not exist"
msgstr ""
-#: part/serializers.py:1068
+#: part/serializers.py:1086
msgid "Limit stocktake report to a particular part, and any variant parts"
msgstr ""
-#: part/serializers.py:1078
+#: part/serializers.py:1096
msgid "Limit stocktake report to a particular part category, and any child categories"
msgstr ""
-#: part/serializers.py:1088
+#: part/serializers.py:1106
msgid "Limit stocktake report to a particular stock location, and any child locations"
msgstr ""
-#: part/serializers.py:1094
+#: part/serializers.py:1112
msgid "Exclude External Stock"
msgstr ""
-#: part/serializers.py:1095
+#: part/serializers.py:1113
msgid "Exclude stock items in external locations"
msgstr ""
-#: part/serializers.py:1100
+#: part/serializers.py:1118
msgid "Generate Report"
msgstr ""
-#: part/serializers.py:1101
+#: part/serializers.py:1119
msgid "Generate report file containing calculated stocktake data"
msgstr ""
-#: part/serializers.py:1106
+#: part/serializers.py:1124
msgid "Update Parts"
msgstr ""
-#: part/serializers.py:1107
+#: part/serializers.py:1125
msgid "Update specified parts with calculated stocktake data"
msgstr ""
-#: part/serializers.py:1115
+#: part/serializers.py:1133
msgid "Stocktake functionality is not enabled"
msgstr ""
-#: part/serializers.py:1221
+#: part/serializers.py:1239
msgid "Override calculated value for minimum price"
msgstr ""
-#: part/serializers.py:1228
+#: part/serializers.py:1246
msgid "Minimum price currency"
msgstr ""
-#: part/serializers.py:1236
+#: part/serializers.py:1254
msgid "Override calculated value for maximum price"
msgstr ""
-#: part/serializers.py:1243
+#: part/serializers.py:1261
msgid "Maximum price currency"
msgstr ""
-#: part/serializers.py:1272
+#: part/serializers.py:1290
msgid "Update"
msgstr ""
-#: part/serializers.py:1273
+#: part/serializers.py:1291
msgid "Update pricing for this part"
msgstr ""
-#: part/serializers.py:1296
+#: part/serializers.py:1314
#, python-brace-format
msgid "Could not convert from provided currencies to {default_currency}"
msgstr ""
-#: part/serializers.py:1303
+#: part/serializers.py:1321
msgid "Minimum price must not be greater than maximum price"
msgstr ""
-#: part/serializers.py:1306
+#: part/serializers.py:1324
msgid "Maximum price must not be less than minimum price"
msgstr ""
-#: part/serializers.py:1632
+#: part/serializers.py:1660
msgid "Select part to copy BOM from"
msgstr ""
-#: part/serializers.py:1640
+#: part/serializers.py:1668
msgid "Remove Existing Data"
msgstr ""
-#: part/serializers.py:1641
+#: part/serializers.py:1669
msgid "Remove existing BOM items before copying"
msgstr ""
-#: part/serializers.py:1646
+#: part/serializers.py:1674
msgid "Include Inherited"
msgstr ""
-#: part/serializers.py:1647
+#: part/serializers.py:1675
msgid "Include BOM items which are inherited from templated parts"
msgstr ""
-#: part/serializers.py:1652
+#: part/serializers.py:1680
msgid "Skip Invalid Rows"
msgstr ""
-#: part/serializers.py:1653
+#: part/serializers.py:1681
msgid "Enable this option to skip invalid rows"
msgstr ""
-#: part/serializers.py:1658
+#: part/serializers.py:1686
msgid "Copy Substitute Parts"
msgstr ""
-#: part/serializers.py:1659
+#: part/serializers.py:1687
msgid "Copy substitute parts when duplicate BOM items"
msgstr ""
-#: part/serializers.py:1693
+#: part/serializers.py:1721
msgid "Clear Existing BOM"
msgstr ""
-#: part/serializers.py:1694
+#: part/serializers.py:1722
msgid "Delete existing BOM items before uploading"
msgstr ""
-#: part/serializers.py:1724
+#: part/serializers.py:1752
msgid "No part column specified"
msgstr ""
-#: part/serializers.py:1768
+#: part/serializers.py:1796
msgid "Multiple matching parts found"
msgstr ""
-#: part/serializers.py:1771
+#: part/serializers.py:1799
msgid "No matching part found"
msgstr ""
-#: part/serializers.py:1774
+#: part/serializers.py:1802
msgid "Part is not designated as a component"
msgstr ""
-#: part/serializers.py:1783
+#: part/serializers.py:1811
msgid "Quantity not provided"
msgstr ""
-#: part/serializers.py:1791
+#: part/serializers.py:1819
msgid "Invalid quantity"
msgstr ""
-#: part/serializers.py:1812
+#: part/serializers.py:1840
msgid "At least one BOM item is required"
msgstr ""
@@ -7222,7 +7248,7 @@ msgid "Validate BOM"
msgstr ""
#: part/templates/part/detail.html:283 part/templates/part/detail.html:284
-#: templates/js/translated/bom.js:1314 templates/js/translated/bom.js:1315
+#: templates/js/translated/bom.js:1320 templates/js/translated/bom.js:1321
msgid "Add BOM Item"
msgstr ""
@@ -7406,7 +7432,7 @@ msgstr ""
msgid "Allocated to Sales Orders"
msgstr ""
-#: part/templates/part/part_base.html:235 templates/js/translated/bom.js:1213
+#: part/templates/part/part_base.html:235 templates/js/translated/bom.js:1219
msgid "Can Build"
msgstr ""
@@ -8785,7 +8811,7 @@ msgstr ""
msgid "Where is this stock item located?"
msgstr ""
-#: stock/models.py:786 stock/serializers.py:1318
+#: stock/models.py:786 stock/serializers.py:1324
msgid "Packaging this stock item is stored in"
msgstr ""
@@ -8797,7 +8823,7 @@ msgstr ""
msgid "Serial number for this item"
msgstr ""
-#: stock/models.py:830 stock/serializers.py:1301
+#: stock/models.py:830 stock/serializers.py:1307
msgid "Batch code for this stock item"
msgstr ""
@@ -8906,7 +8932,7 @@ msgstr ""
msgid "Serialized stock cannot be merged"
msgstr ""
-#: stock/models.py:1639 stock/serializers.py:1207
+#: stock/models.py:1639 stock/serializers.py:1213
msgid "Duplicate stock items"
msgstr ""
@@ -8987,7 +9013,7 @@ msgstr ""
msgid "Enter serial numbers for new items"
msgstr ""
-#: stock/serializers.py:473 stock/serializers.py:1164 stock/serializers.py:1420
+#: stock/serializers.py:473 stock/serializers.py:1170 stock/serializers.py:1426
msgid "Destination stock location"
msgstr ""
@@ -9060,77 +9086,78 @@ msgstr ""
msgid "No stock items selected"
msgstr ""
-#: stock/serializers.py:863 stock/templates/stock/location.html:165
+#: stock/serializers.py:863 stock/serializers.py:926
+#: stock/templates/stock/location.html:165
#: stock/templates/stock/location.html:213
#: stock/templates/stock/location_sidebar.html:5
msgid "Sublocations"
msgstr ""
-#: stock/serializers.py:1036
+#: stock/serializers.py:1042
msgid "Part must be salable"
msgstr ""
-#: stock/serializers.py:1040
+#: stock/serializers.py:1046
msgid "Item is allocated to a sales order"
msgstr ""
-#: stock/serializers.py:1044
+#: stock/serializers.py:1050
msgid "Item is allocated to a build order"
msgstr ""
-#: stock/serializers.py:1068
+#: stock/serializers.py:1074
msgid "Customer to assign stock items"
msgstr ""
-#: stock/serializers.py:1074
+#: stock/serializers.py:1080
msgid "Selected company is not a customer"
msgstr ""
-#: stock/serializers.py:1082
+#: stock/serializers.py:1088
msgid "Stock assignment notes"
msgstr ""
-#: stock/serializers.py:1092 stock/serializers.py:1346
+#: stock/serializers.py:1098 stock/serializers.py:1352
msgid "A list of stock items must be provided"
msgstr ""
-#: stock/serializers.py:1171
+#: stock/serializers.py:1177
msgid "Stock merging notes"
msgstr ""
-#: stock/serializers.py:1176
+#: stock/serializers.py:1182
msgid "Allow mismatched suppliers"
msgstr ""
-#: stock/serializers.py:1177
+#: stock/serializers.py:1183
msgid "Allow stock items with different supplier parts to be merged"
msgstr ""
-#: stock/serializers.py:1182
+#: stock/serializers.py:1188
msgid "Allow mismatched status"
msgstr ""
-#: stock/serializers.py:1183
+#: stock/serializers.py:1189
msgid "Allow stock items with different status codes to be merged"
msgstr ""
-#: stock/serializers.py:1193
+#: stock/serializers.py:1199
msgid "At least two stock items must be provided"
msgstr ""
-#: stock/serializers.py:1260
+#: stock/serializers.py:1266
msgid "No Change"
msgstr ""
-#: stock/serializers.py:1289
+#: stock/serializers.py:1295
msgid "StockItem primary key value"
msgstr ""
-#: stock/serializers.py:1308
+#: stock/serializers.py:1314
msgid "Stock item status code"
msgstr ""
-#: stock/serializers.py:1336
+#: stock/serializers.py:1342
msgid "Stock transaction notes"
msgstr ""
@@ -10663,7 +10690,7 @@ msgid "The following parts are low on required stock"
msgstr ""
#: templates/email/build_order_required_stock.html:18
-#: templates/js/translated/bom.js:1668 templates/js/translated/build.js:2557
+#: templates/js/translated/bom.js:1674 templates/js/translated/build.js:2557
msgid "Required Quantity"
msgstr ""
@@ -10677,7 +10704,7 @@ msgid "Click on the following link to view this part"
msgstr ""
#: templates/email/low_stock_notification.html:18
-#: templates/js/translated/part.js:3209
+#: templates/js/translated/part.js:3218
msgid "Minimum Quantity"
msgstr ""
@@ -11052,62 +11079,66 @@ msgstr ""
msgid "No pricing available"
msgstr ""
-#: templates/js/translated/bom.js:1182 templates/js/translated/build.js:2596
+#: templates/js/translated/bom.js:1184 templates/js/translated/build.js:2622
+msgid "External stock"
+msgstr ""
+
+#: templates/js/translated/bom.js:1188 templates/js/translated/build.js:2596
#: templates/js/translated/sales_order.js:1910
msgid "No Stock Available"
msgstr ""
-#: templates/js/translated/bom.js:1187 templates/js/translated/build.js:2600
+#: templates/js/translated/bom.js:1193 templates/js/translated/build.js:2600
msgid "Includes variant and substitute stock"
msgstr ""
-#: templates/js/translated/bom.js:1189 templates/js/translated/build.js:2602
+#: templates/js/translated/bom.js:1195 templates/js/translated/build.js:2602
#: templates/js/translated/part.js:1256
#: templates/js/translated/sales_order.js:1907
msgid "Includes variant stock"
msgstr ""
-#: templates/js/translated/bom.js:1191 templates/js/translated/build.js:2604
+#: templates/js/translated/bom.js:1197 templates/js/translated/build.js:2604
msgid "Includes substitute stock"
msgstr ""
-#: templates/js/translated/bom.js:1219 templates/js/translated/build.js:2587
+#: templates/js/translated/bom.js:1225 templates/js/translated/build.js:2587
msgid "Consumable item"
msgstr ""
-#: templates/js/translated/bom.js:1279
+#: templates/js/translated/bom.js:1285
msgid "Validate BOM Item"
msgstr ""
-#: templates/js/translated/bom.js:1281
+#: templates/js/translated/bom.js:1287
msgid "This line has been validated"
msgstr ""
-#: templates/js/translated/bom.js:1283
+#: templates/js/translated/bom.js:1289
msgid "Edit substitute parts"
msgstr ""
-#: templates/js/translated/bom.js:1285 templates/js/translated/bom.js:1480
+#: templates/js/translated/bom.js:1291 templates/js/translated/bom.js:1486
msgid "Edit BOM Item"
msgstr ""
-#: templates/js/translated/bom.js:1287
+#: templates/js/translated/bom.js:1293
msgid "Delete BOM Item"
msgstr ""
-#: templates/js/translated/bom.js:1307
+#: templates/js/translated/bom.js:1313
msgid "View BOM"
msgstr ""
-#: templates/js/translated/bom.js:1391
+#: templates/js/translated/bom.js:1397
msgid "No BOM items found"
msgstr ""
-#: templates/js/translated/bom.js:1651 templates/js/translated/build.js:2486
+#: templates/js/translated/bom.js:1657 templates/js/translated/build.js:2486
msgid "Required Part"
msgstr ""
-#: templates/js/translated/bom.js:1677
+#: templates/js/translated/bom.js:1683
msgid "Inherited from parent BOM"
msgstr ""
@@ -11450,29 +11481,29 @@ msgstr ""
msgid "Sufficient stock available"
msgstr ""
-#: templates/js/translated/build.js:2643
+#: templates/js/translated/build.js:2647
msgid "Consumable Item"
msgstr ""
-#: templates/js/translated/build.js:2648
+#: templates/js/translated/build.js:2652
msgid "Tracked item"
msgstr ""
-#: templates/js/translated/build.js:2655
+#: templates/js/translated/build.js:2659
#: templates/js/translated/sales_order.js:2016
msgid "Build stock"
msgstr ""
-#: templates/js/translated/build.js:2660 templates/js/translated/stock.js:1829
+#: templates/js/translated/build.js:2664 templates/js/translated/stock.js:1829
msgid "Order stock"
msgstr ""
-#: templates/js/translated/build.js:2664
+#: templates/js/translated/build.js:2668
#: templates/js/translated/sales_order.js:2010
msgid "Allocate stock"
msgstr ""
-#: templates/js/translated/build.js:2668
+#: templates/js/translated/build.js:2672
msgid "Remove stock allocation"
msgstr ""
@@ -12314,64 +12345,64 @@ msgstr ""
msgid "Subscribed category"
msgstr ""
-#: templates/js/translated/part.js:2855
+#: templates/js/translated/part.js:2864
msgid "No test templates matching query"
msgstr ""
-#: templates/js/translated/part.js:2877 templates/js/translated/search.js:342
+#: templates/js/translated/part.js:2886 templates/js/translated/search.js:342
msgid "results"
msgstr ""
-#: templates/js/translated/part.js:2927 templates/js/translated/stock.js:1446
+#: templates/js/translated/part.js:2936 templates/js/translated/stock.js:1446
msgid "Edit test result"
msgstr ""
-#: templates/js/translated/part.js:2928 templates/js/translated/stock.js:1447
+#: templates/js/translated/part.js:2937 templates/js/translated/stock.js:1447
#: templates/js/translated/stock.js:1692
msgid "Delete test result"
msgstr ""
-#: templates/js/translated/part.js:2932
+#: templates/js/translated/part.js:2941
msgid "This test is defined for a parent part"
msgstr ""
-#: templates/js/translated/part.js:2948
+#: templates/js/translated/part.js:2957
msgid "Edit Test Result Template"
msgstr ""
-#: templates/js/translated/part.js:2962
+#: templates/js/translated/part.js:2971
msgid "Delete Test Result Template"
msgstr ""
-#: templates/js/translated/part.js:3041 templates/js/translated/part.js:3042
+#: templates/js/translated/part.js:3050 templates/js/translated/part.js:3051
msgid "No date specified"
msgstr ""
-#: templates/js/translated/part.js:3044
+#: templates/js/translated/part.js:3053
msgid "Specified date is in the past"
msgstr ""
-#: templates/js/translated/part.js:3050
+#: templates/js/translated/part.js:3059
msgid "Speculative"
msgstr ""
-#: templates/js/translated/part.js:3100
+#: templates/js/translated/part.js:3109
msgid "No scheduling information available for this part"
msgstr ""
-#: templates/js/translated/part.js:3106
+#: templates/js/translated/part.js:3115
msgid "Error fetching scheduling information for this part"
msgstr ""
-#: templates/js/translated/part.js:3202
+#: templates/js/translated/part.js:3211
msgid "Scheduled Stock Quantities"
msgstr ""
-#: templates/js/translated/part.js:3218
+#: templates/js/translated/part.js:3227
msgid "Maximum Quantity"
msgstr ""
-#: templates/js/translated/part.js:3263
+#: templates/js/translated/part.js:3272
msgid "Minimum Stock Level"
msgstr ""
diff --git a/InvenTree/locale/es/LC_MESSAGES/django.po b/InvenTree/locale/es/LC_MESSAGES/django.po
index 8484881342..e2251ee9b2 100644
--- a/InvenTree/locale/es/LC_MESSAGES/django.po
+++ b/InvenTree/locale/es/LC_MESSAGES/django.po
@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: inventree\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2024-02-28 04:05+0000\n"
-"PO-Revision-Date: 2024-02-28 07:23\n"
+"POT-Creation-Date: 2024-03-02 07:22+0000\n"
+"PO-Revision-Date: 2024-03-07 10:33\n"
"Last-Translator: \n"
"Language-Team: Spanish, Mexico\n"
"Language: es_MX\n"
@@ -66,9 +66,9 @@ msgstr "Ingrese la fecha"
#: report/templates/report/inventree_build_order_base.html:172
#: stock/admin.py:226 stock/models.py:2335 stock/models.py:2451
#: stock/serializers.py:479 stock/serializers.py:632 stock/serializers.py:728
-#: stock/serializers.py:778 stock/serializers.py:1081 stock/serializers.py:1170
-#: stock/serializers.py:1335 stock/templates/stock/stock_sidebar.html:25
-#: templates/js/translated/barcode.js:143 templates/js/translated/bom.js:1259
+#: stock/serializers.py:778 stock/serializers.py:1087 stock/serializers.py:1176
+#: stock/serializers.py:1341 stock/templates/stock/stock_sidebar.html:25
+#: templates/js/translated/barcode.js:143 templates/js/translated/bom.js:1265
#: templates/js/translated/company.js:1674 templates/js/translated/order.js:347
#: templates/js/translated/part.js:1080
#: templates/js/translated/purchase_order.js:2201
@@ -297,7 +297,7 @@ msgstr "Ruso"
#: InvenTree/locales.py:39
msgid "Slovak"
-msgstr ""
+msgstr "Eslovaco"
#: InvenTree/locales.py:40
msgid "Slovenian"
@@ -523,7 +523,7 @@ msgstr "Nombre"
#: templates/js/translated/order.js:298 templates/js/translated/part.js:1238
#: templates/js/translated/part.js:1483 templates/js/translated/part.js:1621
#: templates/js/translated/part.js:1958 templates/js/translated/part.js:2355
-#: templates/js/translated/part.js:2785 templates/js/translated/part.js:2887
+#: templates/js/translated/part.js:2785 templates/js/translated/part.js:2896
#: templates/js/translated/plugin.js:80
#: templates/js/translated/purchase_order.js:1707
#: templates/js/translated/purchase_order.js:1850
@@ -606,7 +606,7 @@ msgstr "Solo los superusuarios pueden crear nuevos usuarios"
#: InvenTree/serializers.py:467
msgid "Your account has been created."
-msgstr ""
+msgstr "Su cuenta ha sido creada."
#: InvenTree/serializers.py:469
msgid "Please use the password reset function to login"
@@ -614,7 +614,7 @@ msgstr ""
#: InvenTree/serializers.py:476
msgid "Welcome to InvenTree"
-msgstr ""
+msgstr "Bienvenido a InvenTree"
#: InvenTree/serializers.py:537
msgid "Filename"
@@ -678,7 +678,7 @@ msgstr "URL de imagen remota"
msgid "Downloading images from remote URL is not enabled"
msgstr "La descarga de imágenes desde la URL remota no está habilitada"
-#: InvenTree/status.py:66 part/serializers.py:1120
+#: InvenTree/status.py:66 part/serializers.py:1138
msgid "Background worker check failed"
msgstr "Falló la comprobación en segundo plano del worker"
@@ -960,7 +960,7 @@ msgid "Tracked"
msgstr "Rastreado"
#: build/api.py:285 part/admin.py:144 templates/js/translated/build.js:1741
-#: templates/js/translated/build.js:2626
+#: templates/js/translated/build.js:2630
#: templates/js/translated/sales_order.js:1929
#: templates/js/translated/table_filters.js:571
msgid "Allocated"
@@ -1044,11 +1044,11 @@ msgstr "Orden de Construcción o Armado a la que se asigna"
#: build/models.py:199 build/templates/build/build_base.html:97
#: build/templates/build/detail.html:29 company/models.py:1044
#: order/models.py:1389 order/models.py:1532 order/models.py:1533
-#: part/api.py:1528 part/models.py:389 part/models.py:3003 part/models.py:3147
-#: part/models.py:3291 part/models.py:3314 part/models.py:3335
-#: part/models.py:3357 part/models.py:3458 part/models.py:3754
-#: part/models.py:3885 part/models.py:3978 part/models.py:4339
-#: part/serializers.py:1066 part/serializers.py:1631
+#: part/api.py:1528 part/api.py:1820 part/models.py:389 part/models.py:3003
+#: part/models.py:3147 part/models.py:3291 part/models.py:3314
+#: part/models.py:3335 part/models.py:3357 part/models.py:3458
+#: part/models.py:3754 part/models.py:3885 part/models.py:3978
+#: part/models.py:4339 part/serializers.py:1084 part/serializers.py:1659
#: part/templates/part/part_app_base.html:8
#: part/templates/part/part_pricing.html:12
#: part/templates/part/upload_bom.html:52
@@ -1147,7 +1147,7 @@ msgid "Build status code"
msgstr "Código de estado de construcción"
#: build/models.py:264 build/serializers.py:280 order/serializers.py:549
-#: stock/models.py:826 stock/serializers.py:1300
+#: stock/models.py:826 stock/serializers.py:1306
#: templates/js/translated/purchase_order.js:1129
msgid "Batch Code"
msgstr "Numero de lote"
@@ -1242,48 +1242,48 @@ msgstr "Código del proyecto"
msgid "Project code for this build order"
msgstr "Código de proyecto para esta orden de ensamble"
-#: build/models.py:559
+#: build/models.py:575
#, python-brace-format
msgid "Build order {build} has been completed"
msgstr "El pedido {build} ha sido procesado"
-#: build/models.py:565
+#: build/models.py:581
msgid "A build order has been completed"
msgstr "Pedido #[order] ha sido procesado"
-#: build/models.py:783 build/models.py:858
+#: build/models.py:799 build/models.py:874
msgid "No build output specified"
msgstr "No se ha especificado salida de construcción"
-#: build/models.py:786
+#: build/models.py:802
msgid "Build output is already completed"
msgstr "La construcción de la salida ya está completa"
-#: build/models.py:789
+#: build/models.py:805
msgid "Build output does not match Build Order"
msgstr "La salida de la construcción no coincide con el orden de construcción"
-#: build/models.py:862 build/serializers.py:223 build/serializers.py:262
+#: build/models.py:878 build/serializers.py:223 build/serializers.py:262
#: build/serializers.py:831 order/models.py:526 order/serializers.py:401
-#: order/serializers.py:544 part/serializers.py:1423 part/serializers.py:1789
+#: order/serializers.py:544 part/serializers.py:1442 part/serializers.py:1817
#: stock/models.py:665 stock/models.py:1477 stock/serializers.py:450
msgid "Quantity must be greater than zero"
msgstr "La cantidad debe ser mayor que cero"
-#: build/models.py:867 build/serializers.py:228
+#: build/models.py:883 build/serializers.py:228
msgid "Quantity cannot be greater than the output quantity"
msgstr "La cantidad no puede ser mayor que la cantidad de salida"
-#: build/models.py:924 build/serializers.py:533
+#: build/models.py:940 build/serializers.py:533
#, python-brace-format
msgid "Build output {serial} has not passed all required tests"
msgstr ""
-#: build/models.py:1286
+#: build/models.py:1302
msgid "Build object"
msgstr "Ensamblar equipo"
-#: build/models.py:1300 build/models.py:1558 build/serializers.py:210
+#: build/models.py:1316 build/models.py:1574 build/serializers.py:210
#: build/serializers.py:247 build/templates/build/build_base.html:102
#: build/templates/build/detail.html:34 common/models.py:2432
#: order/models.py:1247 order/models.py:1902 order/serializers.py:1306
@@ -1310,7 +1310,7 @@ msgstr "Ensamblar equipo"
#: templates/js/translated/company.js:1808
#: templates/js/translated/model_renderers.js:230
#: templates/js/translated/order.js:304 templates/js/translated/part.js:961
-#: templates/js/translated/part.js:1811 templates/js/translated/part.js:3332
+#: templates/js/translated/part.js:1811 templates/js/translated/part.js:3341
#: templates/js/translated/pricing.js:381
#: templates/js/translated/pricing.js:474
#: templates/js/translated/pricing.js:522
@@ -1330,38 +1330,38 @@ msgstr "Ensamblar equipo"
msgid "Quantity"
msgstr "Cantidad"
-#: build/models.py:1301
+#: build/models.py:1317
msgid "Required quantity for build order"
msgstr "Cantidad requerida para orden de ensamble"
-#: build/models.py:1381
+#: build/models.py:1397
msgid "Build item must specify a build output, as master part is marked as trackable"
msgstr "Item de construcción o armado debe especificar un resultado o salida, ya que la parte maestra está marcada como rastreable"
-#: build/models.py:1390
+#: build/models.py:1406
#, python-brace-format
msgid "Allocated quantity ({q}) must not exceed available stock quantity ({a})"
msgstr "Cantidad asignada ({q}) no debe exceder la cantidad disponible de stock ({a})"
-#: build/models.py:1400 order/models.py:1853
+#: build/models.py:1416 order/models.py:1853
msgid "Stock item is over-allocated"
msgstr "Artículo de stock sobreasignado"
-#: build/models.py:1406 order/models.py:1856
+#: build/models.py:1422 order/models.py:1856
msgid "Allocation quantity must be greater than zero"
msgstr "Cantidad asignada debe ser mayor que cero"
-#: build/models.py:1412
+#: build/models.py:1428
msgid "Quantity must be 1 for serialized stock"
msgstr "La cantidad debe ser 1 para el stock serializado"
-#: build/models.py:1473
+#: build/models.py:1489
msgid "Selected stock item does not match BOM line"
msgstr "El artículo de almacén selelccionado no coincide con la línea BOM"
-#: build/models.py:1545 build/serializers.py:811 order/serializers.py:1150
-#: order/serializers.py:1171 stock/serializers.py:544 stock/serializers.py:1019
-#: stock/serializers.py:1131 stock/templates/stock/item_base.html:10
+#: build/models.py:1561 build/serializers.py:811 order/serializers.py:1150
+#: order/serializers.py:1171 stock/serializers.py:544 stock/serializers.py:1025
+#: stock/serializers.py:1137 stock/templates/stock/item_base.html:10
#: stock/templates/stock/item_base.html:23
#: stock/templates/stock/item_base.html:194
#: templates/js/translated/build.js:1742
@@ -1376,19 +1376,19 @@ msgstr "El artículo de almacén selelccionado no coincide con la línea BOM"
msgid "Stock Item"
msgstr "Artículo de stock"
-#: build/models.py:1546
+#: build/models.py:1562
msgid "Source stock item"
msgstr "Producto original de stock"
-#: build/models.py:1559
+#: build/models.py:1575
msgid "Stock quantity to allocate to build"
msgstr "Cantidad de stock a asignar para construir"
-#: build/models.py:1567
+#: build/models.py:1583
msgid "Install into"
msgstr "Instalar en"
-#: build/models.py:1568
+#: build/models.py:1584
msgid "Destination stock item"
msgstr "Artículo de stock de destino"
@@ -1452,9 +1452,9 @@ msgid "A list of build outputs must be provided"
msgstr "Debe proporcionarse una lista de salidas de construcción"
#: build/serializers.py:426 build/serializers.py:498 order/serializers.py:533
-#: order/serializers.py:641 order/serializers.py:1646 part/serializers.py:1086
+#: order/serializers.py:641 order/serializers.py:1646 part/serializers.py:1104
#: stock/serializers.py:472 stock/serializers.py:627 stock/serializers.py:723
-#: stock/serializers.py:1163 stock/serializers.py:1419
+#: stock/serializers.py:1169 stock/serializers.py:1425
#: stock/templates/stock/item_base.html:394
#: templates/js/translated/barcode.js:547
#: templates/js/translated/barcode.js:795 templates/js/translated/build.js:999
@@ -1494,7 +1494,7 @@ msgstr "Ubicación para las salidas de construcción completadas"
#: build/serializers.py:505 build/templates/build/build_base.html:151
#: build/templates/build/detail.html:62 order/models.py:910
#: order/models.py:2005 order/serializers.py:565 stock/admin.py:165
-#: stock/serializers.py:774 stock/serializers.py:1307
+#: stock/serializers.py:774 stock/serializers.py:1313
#: stock/templates/stock/item_base.html:427
#: templates/js/translated/barcode.js:252 templates/js/translated/build.js:2189
#: templates/js/translated/purchase_order.js:1308
@@ -1602,7 +1602,7 @@ msgstr "Crear partida"
msgid "bom_item.part must point to the same part as the build order"
msgstr "bom_item.part debe apuntar a la misma parte que la orden de construcción"
-#: build/serializers.py:817 stock/serializers.py:1032
+#: build/serializers.py:817 stock/serializers.py:1038
msgid "Item must be in stock"
msgstr "El artículo debe estar en stock"
@@ -1659,44 +1659,45 @@ msgstr "Elementos opcionales"
msgid "Allocate optional BOM items to build order"
msgstr "Asignar artículos de la BOM opcionales para construir la orden"
-#: build/serializers.py:1096 part/models.py:3895 part/models.py:4331
+#: build/serializers.py:1097 part/models.py:3895 part/models.py:4331
#: stock/api.py:745
msgid "BOM Item"
msgstr "Item de Lista de Materiales"
-#: build/serializers.py:1105 templates/js/translated/index.js:130
+#: build/serializers.py:1106 templates/js/translated/index.js:130
msgid "Allocated Stock"
-msgstr ""
+msgstr "Stock Asignado"
-#: build/serializers.py:1110 part/admin.py:132 part/bom.py:173
-#: part/serializers.py:1441 part/templates/part/part_base.html:210
-#: templates/js/translated/bom.js:1202 templates/js/translated/build.js:2614
-#: templates/js/translated/part.js:709 templates/js/translated/part.js:2148
+#: build/serializers.py:1111 part/admin.py:132 part/bom.py:173
+#: part/serializers.py:798 part/serializers.py:1460
+#: part/templates/part/part_base.html:210 templates/js/translated/bom.js:1208
+#: templates/js/translated/build.js:2614 templates/js/translated/part.js:709
+#: templates/js/translated/part.js:2148
#: templates/js/translated/table_filters.js:170
msgid "On Order"
msgstr "En pedido"
-#: build/serializers.py:1115 part/serializers.py:1443
+#: build/serializers.py:1116 part/serializers.py:1462
#: templates/js/translated/build.js:2618
#: templates/js/translated/table_filters.js:360
msgid "In Production"
-msgstr ""
+msgstr "En producción"
-#: build/serializers.py:1120 part/bom.py:172 part/serializers.py:1454
+#: build/serializers.py:1121 part/bom.py:172 part/serializers.py:1473
#: part/templates/part/part_base.html:192
#: templates/js/translated/sales_order.js:1893
msgid "Available Stock"
msgstr "Stock Disponible"
-#: build/tasks.py:149
+#: build/tasks.py:171
msgid "Stock required for build order"
msgstr "Stock requerido para la orden de construcción"
-#: build/tasks.py:166
+#: build/tasks.py:188
msgid "Overdue Build Order"
msgstr "Orden de construcción atrasada"
-#: build/tasks.py:171
+#: build/tasks.py:193
#, python-brace-format
msgid "Build order {bo} is now overdue"
msgstr "El pedido de construcción {bo} está atrasado"
@@ -1880,11 +1881,11 @@ msgstr "Prioridad"
#: build/templates/build/build_base.html:273
msgid "Delete Build Order"
-msgstr ""
+msgstr "Eliminar Orden de Trabajo"
#: build/templates/build/build_base.html:283
msgid "Build Order QR Code"
-msgstr ""
+msgstr "Código QR de la Orden de Trabajo"
#: build/templates/build/build_base.html:295
msgid "Link Barcode to Build Order"
@@ -1990,27 +1991,31 @@ msgstr "Pedir partes necesarias"
msgid "Order Parts"
msgstr "Partes del pedido"
-#: build/templates/build/detail.html:210
+#: build/templates/build/detail.html:205
+msgid "Available stock has been filtered based on specified source location for this build order"
+msgstr ""
+
+#: build/templates/build/detail.html:215
msgid "Incomplete Build Outputs"
msgstr "Salidas de Trabajo incompletas"
-#: build/templates/build/detail.html:214
+#: build/templates/build/detail.html:219
msgid "Create new build output"
msgstr "Crear nueva salida de trabajo"
-#: build/templates/build/detail.html:215
+#: build/templates/build/detail.html:220
msgid "New Build Output"
msgstr "Nueva Salida de Trabajo"
-#: build/templates/build/detail.html:232 build/templates/build/sidebar.html:15
+#: build/templates/build/detail.html:237 build/templates/build/sidebar.html:15
msgid "Consumed Stock"
msgstr "Existencias consumidas"
-#: build/templates/build/detail.html:244
+#: build/templates/build/detail.html:249
msgid "Completed Build Outputs"
msgstr "Salidas de Trabajo Completadas"
-#: build/templates/build/detail.html:256 build/templates/build/sidebar.html:19
+#: build/templates/build/detail.html:261 build/templates/build/sidebar.html:19
#: company/templates/company/detail.html:229
#: company/templates/company/manufacturer_part.html:141
#: company/templates/company/manufacturer_part_sidebar.html:9
@@ -2026,15 +2031,15 @@ msgstr "Salidas de Trabajo Completadas"
msgid "Attachments"
msgstr "Adjuntos"
-#: build/templates/build/detail.html:271
+#: build/templates/build/detail.html:276
msgid "Build Notes"
msgstr "Notas del Trabajo"
-#: build/templates/build/detail.html:426
+#: build/templates/build/detail.html:434
msgid "Allocation Complete"
-msgstr ""
+msgstr "Asignación Completa"
-#: build/templates/build/detail.html:427
+#: build/templates/build/detail.html:435
msgid "All lines have been fully allocated"
msgstr ""
@@ -2436,7 +2441,7 @@ msgid "Parts are templates by default"
msgstr "Las partes son plantillas por defecto"
#: common/models.py:1456 part/admin.py:91 part/admin.py:431 part/models.py:1015
-#: templates/js/translated/bom.js:1633
+#: templates/js/translated/bom.js:1639
#: templates/js/translated/table_filters.js:330
#: templates/js/translated/table_filters.js:721
msgid "Assembly"
@@ -3485,7 +3490,7 @@ msgstr ""
#: common/models.py:2389
msgid "Last used printing machines"
-msgstr ""
+msgstr "Últimas impresoras usadas"
#: common/models.py:2390
msgid "Save the last used printing machines for a user"
@@ -3495,7 +3500,7 @@ msgstr ""
msgid "Price break quantity"
msgstr "Cantidad de salto de precio"
-#: common/models.py:2440 company/serializers.py:484 order/admin.py:42
+#: common/models.py:2440 company/serializers.py:486 order/admin.py:42
#: order/models.py:1321 order/models.py:2226
#: templates/js/translated/company.js:1813 templates/js/translated/part.js:1885
#: templates/js/translated/pricing.js:621
@@ -3697,63 +3702,63 @@ msgstr "Error generado por el complemento"
#: common/serializers.py:333
msgid "Is Running"
-msgstr ""
+msgstr "Está en ejecución"
#: common/serializers.py:339
msgid "Pending Tasks"
-msgstr ""
+msgstr "Tareas pendientes"
#: common/serializers.py:345
msgid "Scheduled Tasks"
-msgstr ""
+msgstr "Tareas Programadas"
#: common/serializers.py:351
msgid "Failed Tasks"
-msgstr ""
+msgstr "Tareas fallidas"
#: common/serializers.py:366
msgid "Task ID"
-msgstr ""
+msgstr "Identificación de Tarea"
#: common/serializers.py:366
msgid "Unique task ID"
-msgstr ""
+msgstr "Identificación de tarea única"
#: common/serializers.py:368
msgid "Lock"
-msgstr ""
+msgstr "Bloquear"
#: common/serializers.py:368
msgid "Lock time"
-msgstr ""
+msgstr "Bloquear hora"
#: common/serializers.py:370
msgid "Task name"
-msgstr ""
+msgstr "Nombre de la tarea"
#: common/serializers.py:372
msgid "Function"
-msgstr ""
+msgstr "Función"
#: common/serializers.py:372
msgid "Function name"
-msgstr ""
+msgstr "Nombre de la Función"
#: common/serializers.py:374
msgid "Arguments"
-msgstr ""
+msgstr "Argumentos"
#: common/serializers.py:374
msgid "Task arguments"
-msgstr ""
+msgstr "Argumentos de la tarea"
#: common/serializers.py:377
msgid "Keyword Arguments"
-msgstr ""
+msgstr "Argumentos de palabra clave"
#: common/serializers.py:377
msgid "Task keyword arguments"
-msgstr ""
+msgstr "Argumentos de palabra clave de tarea"
#: common/views.py:84 order/templates/order/order_wizard/po_upload.html:51
#: order/templates/order/purchase_order_detail.html:24 order/views.py:118
@@ -3972,7 +3977,7 @@ msgstr "Seleccionar parte"
#: company/models.py:495 company/templates/company/company_base.html:76
#: company/templates/company/manufacturer_part.html:90
-#: company/templates/company/supplier_part.html:145 part/serializers.py:497
+#: company/templates/company/supplier_part.html:145 part/serializers.py:505
#: stock/templates/stock/item_base.html:207
#: templates/js/translated/company.js:506
#: templates/js/translated/company.js:1108
@@ -3987,7 +3992,7 @@ msgid "Select manufacturer"
msgstr "Seleccionar fabricante"
#: company/models.py:502 company/templates/company/manufacturer_part.html:101
-#: company/templates/company/supplier_part.html:153 part/serializers.py:507
+#: company/templates/company/supplier_part.html:153 part/serializers.py:515
#: templates/js/translated/company.js:351
#: templates/js/translated/company.js:1107
#: templates/js/translated/company.js:1302
@@ -4059,7 +4064,7 @@ msgstr "La parte vinculada del fabricante debe hacer referencia a la misma parte
#: company/models.py:795 company/templates/company/company_base.html:81
#: company/templates/company/supplier_part.html:129 order/models.py:453
#: order/templates/order/order_base.html:136 part/bom.py:272 part/bom.py:310
-#: part/serializers.py:481 plugin/builtin/suppliers/digikey.py:25
+#: part/serializers.py:489 plugin/builtin/suppliers/digikey.py:25
#: plugin/builtin/suppliers/lcsc.py:26 plugin/builtin/suppliers/mouser.py:24
#: plugin/builtin/suppliers/tme.py:26 stock/templates/stock/item_base.html:224
#: templates/email/overdue_purchase_order.html:16
@@ -4076,7 +4081,7 @@ msgstr "Proveedor"
msgid "Select supplier"
msgstr "Seleccionar proveedor"
-#: company/models.py:802 part/serializers.py:492
+#: company/models.py:802 part/serializers.py:500
msgid "Supplier stock keeping unit"
msgstr "Unidad de mantenimiento de stock de proveedores"
@@ -4112,7 +4117,7 @@ msgid "Minimum charge (e.g. stocking fee)"
msgstr "Cargo mínimo (p. ej., cuota de almacenamiento)"
#: company/models.py:851 company/templates/company/supplier_part.html:160
-#: stock/admin.py:224 stock/models.py:785 stock/serializers.py:1317
+#: stock/admin.py:224 stock/models.py:785 stock/serializers.py:1323
#: stock/templates/stock/item_base.html:240
#: templates/js/translated/company.js:1636
#: templates/js/translated/stock.js:2387
@@ -4157,7 +4162,7 @@ msgstr "Disponibilidad actualizada"
msgid "Date of last update of availability data"
msgstr "Fecha de última actualización de los datos de disponibilidad"
-#: company/serializers.py:153
+#: company/serializers.py:155
msgid "Default currency used for this supplier"
msgstr "Moneda predeterminada utilizada para este proveedor"
@@ -4218,7 +4223,7 @@ msgstr "Borrar imagen"
#: company/templates/company/company_base.html:86 order/models.py:898
#: order/models.py:1993 order/templates/order/return_order_base.html:131
#: order/templates/order/sales_order_base.html:144 stock/models.py:807
-#: stock/models.py:808 stock/serializers.py:1067
+#: stock/models.py:808 stock/serializers.py:1073
#: stock/templates/stock/item_base.html:405
#: templates/email/overdue_sales_order.html:16
#: templates/js/translated/company.js:502
@@ -4247,11 +4252,11 @@ msgstr "Teléfono"
#: company/templates/company/company_base.html:205
#: part/templates/part/part_base.html:528
msgid "Remove Image"
-msgstr ""
+msgstr "Eliminar imagen"
#: company/templates/company/company_base.html:206
msgid "Remove associated image from this company"
-msgstr ""
+msgstr "Eliminar imagen asociada a esta empresa"
#: company/templates/company/company_base.html:208
#: part/templates/part/part_base.html:531
@@ -4263,12 +4268,12 @@ msgstr "Eliminar"
#: company/templates/company/company_base.html:237
#: part/templates/part/part_base.html:560
msgid "Upload Image"
-msgstr ""
+msgstr "Subir Imagen"
#: company/templates/company/company_base.html:252
#: part/templates/part/part_base.html:614
msgid "Download Image"
-msgstr ""
+msgstr "Descargar imagen"
#: company/templates/company/detail.html:15
#: company/templates/company/manufacturer_part_sidebar.html:7
@@ -4429,8 +4434,9 @@ msgstr "No hay información del fabricante disponible"
#: company/templates/company/manufacturer_part.html:119
#: company/templates/company/supplier_part.html:15 company/views.py:31
-#: part/admin.py:122 part/templates/part/part_sidebar.html:33
-#: templates/InvenTree/search.html:190 templates/navbar.html:48
+#: part/admin.py:122 part/serializers.py:802
+#: part/templates/part/part_sidebar.html:33 templates/InvenTree/search.html:190
+#: templates/navbar.html:48
msgid "Suppliers"
msgstr "Proveedores"
@@ -4451,7 +4457,7 @@ msgstr "Nuevo parámetro"
#: company/templates/company/manufacturer_part.html:206
#: templates/js/translated/part.js:1422
msgid "Add Parameter"
-msgstr ""
+msgstr "Añadir parámetro"
#: company/templates/company/sidebar.html:6
msgid "Manufactured Parts"
@@ -4528,7 +4534,7 @@ msgid "No supplier information available"
msgstr "No hay información de proveedor disponible"
#: company/templates/company/supplier_part.html:139 part/bom.py:279
-#: part/bom.py:311 part/serializers.py:491
+#: part/bom.py:311 part/serializers.py:499
#: templates/js/translated/company.js:349 templates/js/translated/part.js:1786
#: templates/js/translated/pricing.js:510
#: templates/js/translated/purchase_order.js:1851
@@ -4567,7 +4573,7 @@ msgstr "Agregar descuento de precio"
#: company/templates/company/supplier_part.html:276
msgid "Supplier Part QR Code"
-msgstr ""
+msgstr "Código QR de parte del Proveedor"
#: company/templates/company/supplier_part.html:287
msgid "Link Barcode to Supplier Part"
@@ -4577,10 +4583,12 @@ msgstr ""
msgid "Update Part Availability"
msgstr ""
-#: company/templates/company/supplier_part_sidebar.html:5 part/stocktake.py:223
+#: company/templates/company/supplier_part_sidebar.html:5
+#: part/serializers.py:801 part/stocktake.py:223
#: part/templates/part/category.html:183
#: part/templates/part/category_sidebar.html:17 stock/admin.py:69
-#: stock/serializers.py:760 stock/templates/stock/location.html:170
+#: stock/serializers.py:760 stock/serializers.py:924
+#: stock/templates/stock/location.html:170
#: stock/templates/stock/location.html:184
#: stock/templates/stock/location.html:196
#: stock/templates/stock/location_sidebar.html:7
@@ -4640,7 +4648,7 @@ msgid "Label template file"
msgstr "Archivo de plantilla de etiqueta"
#: label/models.py:143 part/models.py:3484 report/models.py:322
-#: templates/js/translated/part.js:2891
+#: templates/js/translated/part.js:2900
#: templates/js/translated/table_filters.js:481
msgid "Enabled"
msgstr "Habilitado"
@@ -4699,7 +4707,7 @@ msgstr "Código QR"
#: machine/machine_types/label_printer.py:217
msgid "Copies"
-msgstr ""
+msgstr "Copias"
#: machine/machine_types/label_printer.py:218
msgid "Number of copies to print for each label"
@@ -4707,7 +4715,7 @@ msgstr ""
#: machine/machine_types/label_printer.py:233
msgid "Connected"
-msgstr ""
+msgstr "Conectado"
#: machine/machine_types/label_printer.py:234 order/api.py:1461
#: templates/js/translated/sales_order.js:1042
@@ -4716,27 +4724,27 @@ msgstr "Desconocido"
#: machine/machine_types/label_printer.py:235
msgid "Printing"
-msgstr ""
+msgstr "Impresión"
#: machine/machine_types/label_printer.py:236
msgid "No media"
-msgstr ""
+msgstr "Sin archivos multimedia"
#: machine/machine_types/label_printer.py:237
msgid "Disconnected"
-msgstr ""
+msgstr "Desconectado"
#: machine/machine_types/label_printer.py:244
msgid "Label Printer"
-msgstr ""
+msgstr "Impresora de Etiquetas"
#: machine/machine_types/label_printer.py:245
msgid "Directly print labels for various items."
-msgstr ""
+msgstr "Imprime directamente etiquetas para varios artículos."
#: machine/machine_types/label_printer.py:251
msgid "Printer Location"
-msgstr ""
+msgstr "Ubicación de la Impresora"
#: machine/machine_types/label_printer.py:252
msgid "Scope the printer to a specific location"
@@ -4744,51 +4752,51 @@ msgstr ""
#: machine/models.py:25
msgid "Name of machine"
-msgstr ""
+msgstr "Nombre de la máquina"
#: machine/models.py:29
msgid "Machine Type"
-msgstr ""
+msgstr "Tipo de Máquina"
#: machine/models.py:29
msgid "Type of machine"
-msgstr ""
+msgstr "Tipo de máquina"
#: machine/models.py:34 machine/models.py:146
msgid "Driver"
-msgstr ""
+msgstr "Controlador"
#: machine/models.py:35
msgid "Driver used for the machine"
-msgstr ""
+msgstr "Controlador usado para la máquina"
#: machine/models.py:39
msgid "Machines can be disabled"
-msgstr ""
+msgstr "Las máquinas pueden ser desactivadas"
#: machine/models.py:95
msgid "Driver available"
-msgstr ""
+msgstr "Controlador disponible"
#: machine/models.py:100
msgid "No errors"
-msgstr ""
+msgstr "Sin errores"
#: machine/models.py:105
msgid "Initialized"
-msgstr ""
+msgstr "Inicializado"
#: machine/models.py:110
msgid "Errors"
-msgstr ""
+msgstr "Errores"
#: machine/models.py:117
msgid "Machine status"
-msgstr ""
+msgstr "Estado de máquina"
#: machine/models.py:145
msgid "Machine"
-msgstr ""
+msgstr "Máquina"
#: machine/models.py:151
msgid "Machine Config"
@@ -5733,7 +5741,7 @@ msgid "Pending Shipments"
msgstr "Envíos pendientes"
#: order/templates/order/sales_order_detail.html:71
-#: templates/js/translated/bom.js:1271 templates/js/translated/filters.js:296
+#: templates/js/translated/bom.js:1277 templates/js/translated/filters.js:296
msgid "Actions"
msgstr "Acciones"
@@ -5861,10 +5869,10 @@ msgstr "Nombre del padre"
msgid "Category Path"
msgstr "Ruta de Categoría"
-#: part/admin.py:323 part/models.py:390 part/serializers.py:259
-#: part/serializers.py:373 part/templates/part/cat_link.html:3
-#: part/templates/part/category.html:23 part/templates/part/category.html:141
-#: part/templates/part/category.html:161
+#: part/admin.py:323 part/models.py:390 part/serializers.py:112
+#: part/serializers.py:265 part/serializers.py:381
+#: part/templates/part/cat_link.html:3 part/templates/part/category.html:23
+#: part/templates/part/category.html:141 part/templates/part/category.html:161
#: part/templates/part/category_sidebar.html:9
#: templates/InvenTree/index.html:36 templates/InvenTree/search.html:84
#: templates/InvenTree/settings/sidebar.html:47
@@ -5889,13 +5897,13 @@ msgstr "IPN del padre"
msgid "Part IPN"
msgstr "IPN de la parte"
-#: part/admin.py:421 part/serializers.py:1220
+#: part/admin.py:421 part/serializers.py:1238
#: templates/js/translated/pricing.js:358
#: templates/js/translated/pricing.js:1024
msgid "Minimum Price"
msgstr "Precio mínimo"
-#: part/admin.py:426 part/serializers.py:1235
+#: part/admin.py:426 part/serializers.py:1253
#: templates/js/translated/pricing.js:353
#: templates/js/translated/pricing.js:1032
msgid "Maximum Price"
@@ -5974,7 +5982,7 @@ msgid "This option must be selected"
msgstr "Esta opción debe ser seleccionada"
#: part/api.py:1541 part/models.py:895 part/models.py:3385 part/models.py:3831
-#: part/serializers.py:388 part/serializers.py:1076
+#: part/serializers.py:396 part/serializers.py:1094
#: part/templates/part/part_base.html:260 stock/api.py:733
#: templates/InvenTree/settings/settings_staff_js.html:300
#: templates/js/translated/notification.js:60
@@ -5982,12 +5990,17 @@ msgstr "Esta opción debe ser seleccionada"
msgid "Category"
msgstr "Categoría"
+#: part/api.py:1828
+msgid "Uses"
+msgstr ""
+
#: part/bom.py:170 part/models.py:100 part/models.py:938
#: part/templates/part/category.html:116 part/templates/part/part_base.html:367
msgid "Default Location"
msgstr "Ubicación Predeterminada"
-#: part/bom.py:171 templates/email/low_stock_notification.html:16
+#: part/bom.py:171 part/serializers.py:803
+#: templates/email/low_stock_notification.html:16
msgid "Total Stock"
msgstr "Inventario Total"
@@ -6010,7 +6023,8 @@ msgstr "Categorías de parte"
msgid "Default location for parts in this category"
msgstr "Ubicación predeterminada para partes de esta categoría"
-#: part/models.py:106 stock/models.py:165 templates/js/translated/stock.js:2736
+#: part/models.py:106 stock/models.py:165 templates/js/translated/part.js:2810
+#: templates/js/translated/stock.js:2736
#: templates/js/translated/table_filters.js:239
#: templates/js/translated/table_filters.js:283
msgid "Structural"
@@ -6418,7 +6432,7 @@ msgstr "Las plantillas de prueba sólo pueden ser creadas para partes rastreable
msgid "Test with this name already exists for this part"
msgstr "Ya existe una prueba con este nombre para esta parte"
-#: part/models.py:3464 templates/js/translated/part.js:2870
+#: part/models.py:3464 templates/js/translated/part.js:2879
msgid "Test Name"
msgstr "Nombre de prueba"
@@ -6446,7 +6460,7 @@ msgstr "Introduce la descripción para esta prueba"
msgid "Is this test enabled?"
msgstr ""
-#: part/models.py:3489 templates/js/translated/part.js:2899
+#: part/models.py:3489 templates/js/translated/part.js:2908
#: templates/js/translated/table_filters.js:477
msgid "Required"
msgstr "Requerido"
@@ -6455,7 +6469,7 @@ msgstr "Requerido"
msgid "Is this test required to pass?"
msgstr "¿Es necesario pasar esta prueba?"
-#: part/models.py:3495 templates/js/translated/part.js:2907
+#: part/models.py:3495 templates/js/translated/part.js:2916
msgid "Requires Value"
msgstr "Requiere valor"
@@ -6463,7 +6477,7 @@ msgstr "Requiere valor"
msgid "Does this test require a value when adding a test result?"
msgstr "¿Esta prueba requiere un valor al agregar un resultado de la prueba?"
-#: part/models.py:3501 templates/js/translated/part.js:2914
+#: part/models.py:3501 templates/js/translated/part.js:2923
msgid "Requires Attachment"
msgstr "Adjunto obligatorio"
@@ -6685,311 +6699,323 @@ msgstr ""
msgid "Duplicate relationship already exists"
msgstr ""
-#: part/serializers.py:128 part/templates/part/category.html:122
-#: part/templates/part/category.html:207
+#: part/serializers.py:114 part/serializers.py:134
+#: part/templates/part/category.html:122 part/templates/part/category.html:207
#: part/templates/part/category_sidebar.html:7
msgid "Subcategories"
msgstr "Subcategorías"
-#: part/serializers.py:172
+#: part/serializers.py:178
msgid "Results"
msgstr ""
-#: part/serializers.py:173
+#: part/serializers.py:179
msgid "Number of results recorded against this template"
msgstr ""
-#: part/serializers.py:197 part/serializers.py:215 stock/serializers.py:384
+#: part/serializers.py:203 part/serializers.py:221 stock/serializers.py:384
msgid "Purchase currency of this stock item"
msgstr "Moneda de compra de ítem de stock"
-#: part/serializers.py:260
+#: part/serializers.py:266
msgid "Number of parts using this template"
msgstr ""
-#: part/serializers.py:379
+#: part/serializers.py:387
msgid "No parts selected"
msgstr ""
-#: part/serializers.py:389
+#: part/serializers.py:397
msgid "Select category"
msgstr ""
-#: part/serializers.py:419
+#: part/serializers.py:427
msgid "Original Part"
msgstr "Parte original"
-#: part/serializers.py:420
+#: part/serializers.py:428
msgid "Select original part to duplicate"
msgstr "Seleccione la parte original a duplicar"
-#: part/serializers.py:425
+#: part/serializers.py:433
msgid "Copy Image"
msgstr "Copiar Imagen"
-#: part/serializers.py:426
+#: part/serializers.py:434
msgid "Copy image from original part"
msgstr "Copiar imagen desde la parte original"
-#: part/serializers.py:432 part/templates/part/detail.html:277
+#: part/serializers.py:440 part/templates/part/detail.html:277
msgid "Copy BOM"
msgstr "Copiar BOM"
-#: part/serializers.py:433
+#: part/serializers.py:441
msgid "Copy bill of materials from original part"
msgstr "Copiar la factura de materiales de la parte original"
-#: part/serializers.py:439
+#: part/serializers.py:447
msgid "Copy Parameters"
msgstr "Copiar Parámetros"
-#: part/serializers.py:440
+#: part/serializers.py:448
msgid "Copy parameter data from original part"
msgstr "Copiar datos del parámetro de la parte original"
-#: part/serializers.py:446
+#: part/serializers.py:454
msgid "Copy Notes"
msgstr "Copiar Notas"
-#: part/serializers.py:447
+#: part/serializers.py:455
msgid "Copy notes from original part"
msgstr ""
-#: part/serializers.py:460
+#: part/serializers.py:468
msgid "Initial Stock Quantity"
msgstr "Cantidad Inicial de Stock"
-#: part/serializers.py:462
+#: part/serializers.py:470
msgid "Specify initial stock quantity for this Part. If quantity is zero, no stock is added."
msgstr ""
-#: part/serializers.py:469
+#: part/serializers.py:477
msgid "Initial Stock Location"
msgstr ""
-#: part/serializers.py:470
+#: part/serializers.py:478
msgid "Specify initial stock location for this Part"
msgstr ""
-#: part/serializers.py:482
+#: part/serializers.py:490
msgid "Select supplier (or leave blank to skip)"
msgstr "Seleccione proveedor (o déjelo en blanco para saltar)"
-#: part/serializers.py:498
+#: part/serializers.py:506
msgid "Select manufacturer (or leave blank to skip)"
msgstr "Seleccionar fabricante (o dejar en blanco para saltar)"
-#: part/serializers.py:508
+#: part/serializers.py:516
msgid "Manufacturer part number"
msgstr "Número de parte del fabricante"
-#: part/serializers.py:515
+#: part/serializers.py:523
msgid "Selected company is not a valid supplier"
msgstr "La empresa seleccionada no es un proveedor válido"
-#: part/serializers.py:524
+#: part/serializers.py:532
msgid "Selected company is not a valid manufacturer"
msgstr "La empresa seleccionada no es un fabricante válido"
-#: part/serializers.py:535
+#: part/serializers.py:543
msgid "Manufacturer part matching this MPN already exists"
msgstr ""
-#: part/serializers.py:542
+#: part/serializers.py:550
msgid "Supplier part matching this SKU already exists"
msgstr ""
-#: part/serializers.py:815 part/templates/part/copy_part.html:9
+#: part/serializers.py:804
+msgid "External Stock"
+msgstr ""
+
+#: part/serializers.py:806
+msgid "Unallocated Stock"
+msgstr ""
+
+#: part/serializers.py:808
+msgid "Variant Stock"
+msgstr ""
+
+#: part/serializers.py:833 part/templates/part/copy_part.html:9
#: templates/js/translated/part.js:471
msgid "Duplicate Part"
msgstr "Duplicar Parte"
-#: part/serializers.py:816
+#: part/serializers.py:834
msgid "Copy initial data from another Part"
msgstr ""
-#: part/serializers.py:822 templates/js/translated/part.js:102
+#: part/serializers.py:840 templates/js/translated/part.js:102
msgid "Initial Stock"
msgstr "Stock Inicial"
-#: part/serializers.py:823
+#: part/serializers.py:841
msgid "Create Part with initial stock quantity"
msgstr "Crear Parte con cantidad inicial de stock"
-#: part/serializers.py:829
+#: part/serializers.py:847
msgid "Supplier Information"
msgstr "Información del proveedor"
-#: part/serializers.py:830
+#: part/serializers.py:848
msgid "Add initial supplier information for this part"
msgstr "Añadir información inicial del proveedor para esta parte"
-#: part/serializers.py:838
+#: part/serializers.py:856
msgid "Copy Category Parameters"
msgstr "Copiar Parámetros de Categoría"
-#: part/serializers.py:839
+#: part/serializers.py:857
msgid "Copy parameter templates from selected part category"
msgstr "Copiar plantillas de parámetro de la categoría de partes seleccionada"
-#: part/serializers.py:844
+#: part/serializers.py:862
msgid "Existing Image"
msgstr "Imagen Existente"
-#: part/serializers.py:845
+#: part/serializers.py:863
msgid "Filename of an existing part image"
msgstr ""
-#: part/serializers.py:862
+#: part/serializers.py:880
msgid "Image file does not exist"
msgstr "El archivo de imagen no existe"
-#: part/serializers.py:1068
+#: part/serializers.py:1086
msgid "Limit stocktake report to a particular part, and any variant parts"
msgstr ""
-#: part/serializers.py:1078
+#: part/serializers.py:1096
msgid "Limit stocktake report to a particular part category, and any child categories"
msgstr ""
-#: part/serializers.py:1088
+#: part/serializers.py:1106
msgid "Limit stocktake report to a particular stock location, and any child locations"
msgstr ""
-#: part/serializers.py:1094
+#: part/serializers.py:1112
msgid "Exclude External Stock"
msgstr ""
-#: part/serializers.py:1095
+#: part/serializers.py:1113
msgid "Exclude stock items in external locations"
msgstr ""
-#: part/serializers.py:1100
+#: part/serializers.py:1118
msgid "Generate Report"
msgstr "Generar informe"
-#: part/serializers.py:1101
+#: part/serializers.py:1119
msgid "Generate report file containing calculated stocktake data"
msgstr ""
-#: part/serializers.py:1106
+#: part/serializers.py:1124
msgid "Update Parts"
msgstr "Actualizar partes"
-#: part/serializers.py:1107
+#: part/serializers.py:1125
msgid "Update specified parts with calculated stocktake data"
msgstr ""
-#: part/serializers.py:1115
+#: part/serializers.py:1133
msgid "Stocktake functionality is not enabled"
msgstr ""
-#: part/serializers.py:1221
+#: part/serializers.py:1239
msgid "Override calculated value for minimum price"
msgstr "Anular el valor calculado para precio mínimo"
-#: part/serializers.py:1228
+#: part/serializers.py:1246
msgid "Minimum price currency"
msgstr "Precio mínimo de moneda"
-#: part/serializers.py:1236
+#: part/serializers.py:1254
msgid "Override calculated value for maximum price"
msgstr ""
-#: part/serializers.py:1243
+#: part/serializers.py:1261
msgid "Maximum price currency"
msgstr "Precio máximo de moneda"
-#: part/serializers.py:1272
+#: part/serializers.py:1290
msgid "Update"
msgstr "Actualizar"
-#: part/serializers.py:1273
+#: part/serializers.py:1291
msgid "Update pricing for this part"
msgstr ""
-#: part/serializers.py:1296
+#: part/serializers.py:1314
#, python-brace-format
msgid "Could not convert from provided currencies to {default_currency}"
msgstr ""
-#: part/serializers.py:1303
+#: part/serializers.py:1321
msgid "Minimum price must not be greater than maximum price"
msgstr "El precio mínimo no debe ser mayor que el precio máximo"
-#: part/serializers.py:1306
+#: part/serializers.py:1324
msgid "Maximum price must not be less than minimum price"
msgstr "El precio máximo no debe ser inferior al precio mínimo"
-#: part/serializers.py:1632
+#: part/serializers.py:1660
msgid "Select part to copy BOM from"
msgstr "Seleccionar parte de la que copiar BOM"
-#: part/serializers.py:1640
+#: part/serializers.py:1668
msgid "Remove Existing Data"
msgstr "Eliminar Datos Existentes"
-#: part/serializers.py:1641
+#: part/serializers.py:1669
msgid "Remove existing BOM items before copying"
msgstr "Eliminar artículos BOM existentes antes de copiar"
-#: part/serializers.py:1646
+#: part/serializers.py:1674
msgid "Include Inherited"
msgstr "Incluye Heredado"
-#: part/serializers.py:1647
+#: part/serializers.py:1675
msgid "Include BOM items which are inherited from templated parts"
msgstr "Incluye artículos BOM que son heredados de partes con plantillas"
-#: part/serializers.py:1652
+#: part/serializers.py:1680
msgid "Skip Invalid Rows"
msgstr "Omitir filas no válidas"
-#: part/serializers.py:1653
+#: part/serializers.py:1681
msgid "Enable this option to skip invalid rows"
msgstr "Activar esta opción para omitir filas inválidas"
-#: part/serializers.py:1658
+#: part/serializers.py:1686
msgid "Copy Substitute Parts"
msgstr "Copiar partes sustitutas"
-#: part/serializers.py:1659
+#: part/serializers.py:1687
msgid "Copy substitute parts when duplicate BOM items"
msgstr ""
-#: part/serializers.py:1693
+#: part/serializers.py:1721
msgid "Clear Existing BOM"
msgstr "Limpiar BOM Existente"
-#: part/serializers.py:1694
+#: part/serializers.py:1722
msgid "Delete existing BOM items before uploading"
msgstr ""
-#: part/serializers.py:1724
+#: part/serializers.py:1752
msgid "No part column specified"
msgstr ""
-#: part/serializers.py:1768
+#: part/serializers.py:1796
msgid "Multiple matching parts found"
msgstr "Varios resultados encontrados"
-#: part/serializers.py:1771
+#: part/serializers.py:1799
msgid "No matching part found"
msgstr "No se encontraron partes coincidentes"
-#: part/serializers.py:1774
+#: part/serializers.py:1802
msgid "Part is not designated as a component"
msgstr "La parte no está designada como componente"
-#: part/serializers.py:1783
+#: part/serializers.py:1811
msgid "Quantity not provided"
msgstr "Cantidad no proporcionada"
-#: part/serializers.py:1791
+#: part/serializers.py:1819
msgid "Invalid quantity"
msgstr "Cantidad no válida"
-#: part/serializers.py:1812
+#: part/serializers.py:1840
msgid "At least one BOM item is required"
msgstr "Se requiere al menos un artículo BOM"
@@ -7221,7 +7247,7 @@ msgid "Validate BOM"
msgstr "Validar BOM"
#: part/templates/part/detail.html:283 part/templates/part/detail.html:284
-#: templates/js/translated/bom.js:1314 templates/js/translated/bom.js:1315
+#: templates/js/translated/bom.js:1320 templates/js/translated/bom.js:1321
msgid "Add BOM Item"
msgstr "Añadir artículo al BOM"
@@ -7405,7 +7431,7 @@ msgstr ""
msgid "Allocated to Sales Orders"
msgstr ""
-#: part/templates/part/part_base.html:235 templates/js/translated/bom.js:1213
+#: part/templates/part/part_base.html:235 templates/js/translated/bom.js:1219
msgid "Can Build"
msgstr "Puede construir"
@@ -7435,23 +7461,23 @@ msgstr ""
#: part/templates/part/part_base.html:461
msgid "Link Barcode to Part"
-msgstr ""
+msgstr "Vincular código de barras a parte"
#: part/templates/part/part_base.html:512
msgid "Calculate"
-msgstr ""
+msgstr "Calcular"
#: part/templates/part/part_base.html:529
msgid "Remove associated image from this part"
-msgstr ""
+msgstr "Eliminar imagen asociada de esta parte"
#: part/templates/part/part_base.html:580
msgid "No matching images found"
-msgstr ""
+msgstr "No se encontraron imágenes coincidentes"
#: part/templates/part/part_base.html:676
msgid "Hide Part Details"
-msgstr ""
+msgstr "Ocultar Detalles de la Parte"
#: part/templates/part/part_pricing.html:22 part/templates/part/prices.html:76
#: part/templates/part/prices.html:227 templates/js/translated/pricing.js:485
@@ -8784,7 +8810,7 @@ msgstr "Seleccione una parte del proveedor correspondiente para este artículo d
msgid "Where is this stock item located?"
msgstr "¿Dónde se encuentra este artículo de stock?"
-#: stock/models.py:786 stock/serializers.py:1318
+#: stock/models.py:786 stock/serializers.py:1324
msgid "Packaging this stock item is stored in"
msgstr "Empaquetar este artículo de stock se almacena en"
@@ -8796,7 +8822,7 @@ msgstr "¿Está este artículo instalado en otro artículo?"
msgid "Serial number for this item"
msgstr "Número de serie para este artículo"
-#: stock/models.py:830 stock/serializers.py:1301
+#: stock/models.py:830 stock/serializers.py:1307
msgid "Batch code for this stock item"
msgstr "Código de lote para este artículo de stock"
@@ -8905,7 +8931,7 @@ msgstr "El artículo de stock está en producción"
msgid "Serialized stock cannot be merged"
msgstr "Stock serializado no puede ser combinado"
-#: stock/models.py:1639 stock/serializers.py:1207
+#: stock/models.py:1639 stock/serializers.py:1213
msgid "Duplicate stock items"
msgstr "Artículos de Stock Duplicados"
@@ -8986,7 +9012,7 @@ msgstr "La cantidad no debe exceder la cantidad disponible de stock ({q})"
msgid "Enter serial numbers for new items"
msgstr "Introduzca números de serie para nuevos artículos"
-#: stock/serializers.py:473 stock/serializers.py:1164 stock/serializers.py:1420
+#: stock/serializers.py:473 stock/serializers.py:1170 stock/serializers.py:1426
msgid "Destination stock location"
msgstr "Ubicación de stock de destino"
@@ -9059,77 +9085,78 @@ msgstr ""
msgid "No stock items selected"
msgstr ""
-#: stock/serializers.py:863 stock/templates/stock/location.html:165
+#: stock/serializers.py:863 stock/serializers.py:926
+#: stock/templates/stock/location.html:165
#: stock/templates/stock/location.html:213
#: stock/templates/stock/location_sidebar.html:5
msgid "Sublocations"
msgstr "Sub-ubicación"
-#: stock/serializers.py:1036
+#: stock/serializers.py:1042
msgid "Part must be salable"
msgstr "La parte debe ser vendible"
-#: stock/serializers.py:1040
+#: stock/serializers.py:1046
msgid "Item is allocated to a sales order"
msgstr "El artículo está asignado a una orden de venta"
-#: stock/serializers.py:1044
+#: stock/serializers.py:1050
msgid "Item is allocated to a build order"
msgstr "El artículo está asignado a una orden de creación"
-#: stock/serializers.py:1068
+#: stock/serializers.py:1074
msgid "Customer to assign stock items"
msgstr "Cliente para asignar artículos de stock"
-#: stock/serializers.py:1074
+#: stock/serializers.py:1080
msgid "Selected company is not a customer"
msgstr "La empresa seleccionada no es un cliente"
-#: stock/serializers.py:1082
+#: stock/serializers.py:1088
msgid "Stock assignment notes"
msgstr "Notas de asignación de stock"
-#: stock/serializers.py:1092 stock/serializers.py:1346
+#: stock/serializers.py:1098 stock/serializers.py:1352
msgid "A list of stock items must be provided"
msgstr "Debe proporcionarse una lista de artículos de stock"
-#: stock/serializers.py:1171
+#: stock/serializers.py:1177
msgid "Stock merging notes"
msgstr "Notas de fusión de stock"
-#: stock/serializers.py:1176
+#: stock/serializers.py:1182
msgid "Allow mismatched suppliers"
msgstr "Permitir proveedores no coincidentes"
-#: stock/serializers.py:1177
+#: stock/serializers.py:1183
msgid "Allow stock items with different supplier parts to be merged"
msgstr "Permitir fusionar artículos de stock con diferentes partes de proveedor"
-#: stock/serializers.py:1182
+#: stock/serializers.py:1188
msgid "Allow mismatched status"
msgstr "Permitir estado no coincidente"
-#: stock/serializers.py:1183
+#: stock/serializers.py:1189
msgid "Allow stock items with different status codes to be merged"
msgstr "Permitir fusionar artículos de stock con diferentes códigos de estado"
-#: stock/serializers.py:1193
+#: stock/serializers.py:1199
msgid "At least two stock items must be provided"
msgstr "Debe proporcionar al menos dos artículos de stock"
-#: stock/serializers.py:1260
+#: stock/serializers.py:1266
msgid "No Change"
msgstr ""
-#: stock/serializers.py:1289
+#: stock/serializers.py:1295
msgid "StockItem primary key value"
msgstr "Valor de clave primaria de Stock"
-#: stock/serializers.py:1308
+#: stock/serializers.py:1314
msgid "Stock item status code"
msgstr ""
-#: stock/serializers.py:1336
+#: stock/serializers.py:1342
msgid "Stock transaction notes"
msgstr "Notas de transacción de stock"
@@ -10662,7 +10689,7 @@ msgid "The following parts are low on required stock"
msgstr "Las siguientes partes están bajas en stock requerido"
#: templates/email/build_order_required_stock.html:18
-#: templates/js/translated/bom.js:1668 templates/js/translated/build.js:2557
+#: templates/js/translated/bom.js:1674 templates/js/translated/build.js:2557
msgid "Required Quantity"
msgstr "Cantidad requerida"
@@ -10676,7 +10703,7 @@ msgid "Click on the following link to view this part"
msgstr "Haga clic en el siguiente enlace para ver esta parte"
#: templates/email/low_stock_notification.html:18
-#: templates/js/translated/part.js:3209
+#: templates/js/translated/part.js:3218
msgid "Minimum Quantity"
msgstr "Cantidad Mínima"
@@ -11051,62 +11078,66 @@ msgstr ""
msgid "No pricing available"
msgstr ""
-#: templates/js/translated/bom.js:1182 templates/js/translated/build.js:2596
+#: templates/js/translated/bom.js:1184 templates/js/translated/build.js:2622
+msgid "External stock"
+msgstr ""
+
+#: templates/js/translated/bom.js:1188 templates/js/translated/build.js:2596
#: templates/js/translated/sales_order.js:1910
msgid "No Stock Available"
msgstr ""
-#: templates/js/translated/bom.js:1187 templates/js/translated/build.js:2600
+#: templates/js/translated/bom.js:1193 templates/js/translated/build.js:2600
msgid "Includes variant and substitute stock"
msgstr ""
-#: templates/js/translated/bom.js:1189 templates/js/translated/build.js:2602
+#: templates/js/translated/bom.js:1195 templates/js/translated/build.js:2602
#: templates/js/translated/part.js:1256
#: templates/js/translated/sales_order.js:1907
msgid "Includes variant stock"
msgstr ""
-#: templates/js/translated/bom.js:1191 templates/js/translated/build.js:2604
+#: templates/js/translated/bom.js:1197 templates/js/translated/build.js:2604
msgid "Includes substitute stock"
msgstr ""
-#: templates/js/translated/bom.js:1219 templates/js/translated/build.js:2587
+#: templates/js/translated/bom.js:1225 templates/js/translated/build.js:2587
msgid "Consumable item"
msgstr ""
-#: templates/js/translated/bom.js:1279
+#: templates/js/translated/bom.js:1285
msgid "Validate BOM Item"
msgstr ""
-#: templates/js/translated/bom.js:1281
+#: templates/js/translated/bom.js:1287
msgid "This line has been validated"
msgstr ""
-#: templates/js/translated/bom.js:1283
+#: templates/js/translated/bom.js:1289
msgid "Edit substitute parts"
msgstr ""
-#: templates/js/translated/bom.js:1285 templates/js/translated/bom.js:1480
+#: templates/js/translated/bom.js:1291 templates/js/translated/bom.js:1486
msgid "Edit BOM Item"
msgstr ""
-#: templates/js/translated/bom.js:1287
+#: templates/js/translated/bom.js:1293
msgid "Delete BOM Item"
msgstr ""
-#: templates/js/translated/bom.js:1307
+#: templates/js/translated/bom.js:1313
msgid "View BOM"
msgstr ""
-#: templates/js/translated/bom.js:1391
+#: templates/js/translated/bom.js:1397
msgid "No BOM items found"
msgstr ""
-#: templates/js/translated/bom.js:1651 templates/js/translated/build.js:2486
+#: templates/js/translated/bom.js:1657 templates/js/translated/build.js:2486
msgid "Required Part"
msgstr ""
-#: templates/js/translated/bom.js:1677
+#: templates/js/translated/bom.js:1683
msgid "Inherited from parent BOM"
msgstr ""
@@ -11391,7 +11422,7 @@ msgstr ""
#: templates/js/translated/part.js:2316 templates/js/translated/part.js:2742
#: templates/js/translated/stock.js:1946 templates/js/translated/stock.js:2674
msgid "Select"
-msgstr ""
+msgstr "Seleccionar"
#: templates/js/translated/build.js:2129
msgid "Build order is overdue"
@@ -11399,7 +11430,7 @@ msgstr ""
#: templates/js/translated/build.js:2175
msgid "Progress"
-msgstr ""
+msgstr "Progreso"
#: templates/js/translated/build.js:2211 templates/js/translated/stock.js:3006
msgid "No user information"
@@ -11449,29 +11480,29 @@ msgstr ""
msgid "Sufficient stock available"
msgstr ""
-#: templates/js/translated/build.js:2643
+#: templates/js/translated/build.js:2647
msgid "Consumable Item"
msgstr ""
-#: templates/js/translated/build.js:2648
+#: templates/js/translated/build.js:2652
msgid "Tracked item"
msgstr ""
-#: templates/js/translated/build.js:2655
+#: templates/js/translated/build.js:2659
#: templates/js/translated/sales_order.js:2016
msgid "Build stock"
msgstr ""
-#: templates/js/translated/build.js:2660 templates/js/translated/stock.js:1829
+#: templates/js/translated/build.js:2664 templates/js/translated/stock.js:1829
msgid "Order stock"
msgstr ""
-#: templates/js/translated/build.js:2664
+#: templates/js/translated/build.js:2668
#: templates/js/translated/sales_order.js:2010
msgid "Allocate stock"
msgstr ""
-#: templates/js/translated/build.js:2668
+#: templates/js/translated/build.js:2672
msgid "Remove stock allocation"
msgstr ""
@@ -11504,19 +11535,19 @@ msgstr ""
#: templates/js/translated/company.js:360
msgid "Delete Supplier Parts"
-msgstr ""
+msgstr "Eliminar Partes de Proveedor"
#: templates/js/translated/company.js:465
msgid "Add new Company"
-msgstr ""
+msgstr "Añadir nueva Empresa"
#: templates/js/translated/company.js:536
msgid "Parts Supplied"
-msgstr ""
+msgstr "Partes Suministradas"
#: templates/js/translated/company.js:545
msgid "Parts Manufactured"
-msgstr ""
+msgstr "Partes Fabricadas"
#: templates/js/translated/company.js:560
msgid "No company information found"
@@ -11524,7 +11555,7 @@ msgstr ""
#: templates/js/translated/company.js:609
msgid "Create New Contact"
-msgstr ""
+msgstr "Crear Nuevo Contacto"
#: templates/js/translated/company.js:625
#: templates/js/translated/company.js:748
@@ -11558,137 +11589,137 @@ msgstr ""
#: templates/js/translated/company.js:752
msgid "Delete Contact"
-msgstr ""
+msgstr "Eliminar Contacto"
#: templates/js/translated/company.js:849
msgid "Create New Address"
-msgstr ""
+msgstr "Crear Nueva Dirección"
#: templates/js/translated/company.js:864
#: templates/js/translated/company.js:1025
msgid "Edit Address"
-msgstr ""
+msgstr "Editar Dirección"
#: templates/js/translated/company.js:899
msgid "All selected addresses will be deleted"
-msgstr ""
+msgstr "Todos las direcciones seleccionadas serán eliminadas"
#: templates/js/translated/company.js:913
msgid "Delete Addresses"
-msgstr ""
+msgstr "Eliminar Direcciones"
#: templates/js/translated/company.js:940
msgid "No addresses found"
-msgstr ""
+msgstr "No se encontraron direcciones"
#: templates/js/translated/company.js:979
msgid "Postal city"
-msgstr ""
+msgstr "Ciudad postal"
#: templates/js/translated/company.js:985
msgid "State/province"
-msgstr ""
+msgstr "Estado/provincia"
#: templates/js/translated/company.js:997
msgid "Courier notes"
-msgstr ""
+msgstr "Notas del mensajero"
#: templates/js/translated/company.js:1003
msgid "Internal notes"
-msgstr ""
+msgstr "Notas internas"
#: templates/js/translated/company.js:1029
msgid "Delete Address"
-msgstr ""
+msgstr "Eliminar Dirección"
#: templates/js/translated/company.js:1102
msgid "All selected manufacturer parts will be deleted"
-msgstr ""
+msgstr "Se eliminarán todas las partes del fabricante seleccionadas"
#: templates/js/translated/company.js:1117
msgid "Delete Manufacturer Parts"
-msgstr ""
+msgstr "Eliminar Partes del Fabricante"
#: templates/js/translated/company.js:1151
msgid "All selected parameters will be deleted"
-msgstr ""
+msgstr "Todos los parámetros seleccionados serán eliminados"
#: templates/js/translated/company.js:1165
msgid "Delete Parameters"
-msgstr ""
+msgstr "Eliminar Parámetros"
#: templates/js/translated/company.js:1181
#: templates/js/translated/company.js:1469 templates/js/translated/part.js:2244
msgid "Order parts"
-msgstr ""
+msgstr "Ordenar Partes"
#: templates/js/translated/company.js:1198
msgid "Delete manufacturer parts"
-msgstr ""
+msgstr "Eliminar partes del fabricante"
#: templates/js/translated/company.js:1230
msgid "Manufacturer part actions"
-msgstr ""
+msgstr "Acciones para partes del fabricante"
#: templates/js/translated/company.js:1249
msgid "No manufacturer parts found"
-msgstr ""
+msgstr "No se encontraron partes del fabricante"
#: templates/js/translated/company.js:1269
#: templates/js/translated/company.js:1557 templates/js/translated/part.js:798
#: templates/js/translated/part.js:1210
msgid "Template part"
-msgstr ""
+msgstr "Plantilla de parte"
#: templates/js/translated/company.js:1273
#: templates/js/translated/company.js:1561 templates/js/translated/part.js:802
#: templates/js/translated/part.js:1214
msgid "Assembled part"
-msgstr ""
+msgstr "Parte ensamblada"
#: templates/js/translated/company.js:1393 templates/js/translated/part.js:1464
msgid "No parameters found"
-msgstr ""
+msgstr "No se encontraron parámetros"
#: templates/js/translated/company.js:1428 templates/js/translated/part.js:1527
msgid "Edit parameter"
-msgstr ""
+msgstr "Editar parámetro"
#: templates/js/translated/company.js:1429 templates/js/translated/part.js:1528
msgid "Delete parameter"
-msgstr ""
+msgstr "Eliminar parámetro"
#: templates/js/translated/company.js:1446 templates/js/translated/part.js:1433
msgid "Edit Parameter"
-msgstr ""
+msgstr "Editar Parámetro"
#: templates/js/translated/company.js:1455 templates/js/translated/part.js:1549
msgid "Delete Parameter"
-msgstr ""
+msgstr "Eliminar Parámetro"
#: templates/js/translated/company.js:1486
msgid "Delete supplier parts"
-msgstr ""
+msgstr "Eliminar piezas del proveedor"
#: templates/js/translated/company.js:1536
msgid "No supplier parts found"
-msgstr ""
+msgstr "No se encontraron partes de proveedor"
#: templates/js/translated/company.js:1654
msgid "Base Units"
-msgstr ""
+msgstr "Unidades base"
#: templates/js/translated/company.js:1684
msgid "Availability"
-msgstr ""
+msgstr "Disponibilidad"
#: templates/js/translated/company.js:1715
msgid "Edit supplier part"
-msgstr ""
+msgstr "Editar parte del proveedor"
#: templates/js/translated/company.js:1716
msgid "Delete supplier part"
-msgstr ""
+msgstr "Eliminar parte del proveedor"
#: templates/js/translated/company.js:1769
#: templates/js/translated/pricing.js:694
@@ -11706,7 +11737,7 @@ msgstr ""
#: templates/js/translated/company.js:1823
msgid "Last updated"
-msgstr ""
+msgstr "Última actualización"
#: templates/js/translated/company.js:1830
msgid "Edit price break"
@@ -11719,53 +11750,53 @@ msgstr ""
#: templates/js/translated/filters.js:186
#: templates/js/translated/filters.js:672
msgid "true"
-msgstr ""
+msgstr "verdadero"
#: templates/js/translated/filters.js:190
#: templates/js/translated/filters.js:673
msgid "false"
-msgstr ""
+msgstr "falso"
#: templates/js/translated/filters.js:214
msgid "Select filter"
-msgstr ""
+msgstr "Seleccionar filtro"
#: templates/js/translated/filters.js:437
msgid "Print Labels"
-msgstr ""
+msgstr "Imprimir Etiquetas"
#: templates/js/translated/filters.js:441
msgid "Print Reports"
-msgstr ""
+msgstr "Imprimir reportes"
#: templates/js/translated/filters.js:453
msgid "Download table data"
-msgstr ""
+msgstr "Descargar tabla de datos"
#: templates/js/translated/filters.js:460
msgid "Reload table data"
-msgstr ""
+msgstr "Recargar tabla de datos"
#: templates/js/translated/filters.js:469
msgid "Add new filter"
-msgstr ""
+msgstr "Añadir un nuevo filtro"
#: templates/js/translated/filters.js:477
msgid "Clear all filters"
-msgstr ""
+msgstr "Limpiar todos los filtros"
#: templates/js/translated/filters.js:582
msgid "Create filter"
-msgstr ""
+msgstr "Crear filtro"
#: templates/js/translated/forms.js:378 templates/js/translated/forms.js:393
#: templates/js/translated/forms.js:407 templates/js/translated/forms.js:421
msgid "Action Prohibited"
-msgstr ""
+msgstr "Acción Prohibida"
#: templates/js/translated/forms.js:380
msgid "Create operation not allowed"
-msgstr ""
+msgstr "Operación de creación no permitida"
#: templates/js/translated/forms.js:395
msgid "Update operation not allowed"
@@ -11991,48 +12022,48 @@ msgstr ""
#: templates/js/translated/order.js:255
msgid "Edit Line"
-msgstr ""
+msgstr "Editar Línea"
#: templates/js/translated/order.js:268
msgid "Delete Line"
-msgstr ""
+msgstr "Eliminar Línea"
#: templates/js/translated/order.js:281
#: templates/js/translated/purchase_order.js:1991
msgid "No line items found"
-msgstr ""
+msgstr "No se encontraron artículos de línea"
#: templates/js/translated/order.js:369
msgid "Duplicate line"
-msgstr ""
+msgstr "Duplicar línea"
#: templates/js/translated/order.js:370
msgid "Edit line"
-msgstr ""
+msgstr "Editar línea"
#: templates/js/translated/order.js:374
msgid "Delete line"
-msgstr ""
+msgstr "Eliminar línea"
#: templates/js/translated/part.js:90
msgid "Part Attributes"
-msgstr ""
+msgstr "Atributos de Parte"
#: templates/js/translated/part.js:94
msgid "Part Creation Options"
-msgstr ""
+msgstr "Opciones de Creación de Parte"
#: templates/js/translated/part.js:98
msgid "Part Duplication Options"
-msgstr ""
+msgstr "Opciones de Duplicación de Parte"
#: templates/js/translated/part.js:121
msgid "Add Part Category"
-msgstr ""
+msgstr "Añadir Categoría de Parte"
#: templates/js/translated/part.js:308
msgid "Parent part category"
-msgstr ""
+msgstr "Categoría principal de parte"
#: templates/js/translated/part.js:332 templates/js/translated/stock.js:175
msgid "Icon (optional) - Explore all available icons on"
@@ -12040,59 +12071,59 @@ msgstr ""
#: templates/js/translated/part.js:352
msgid "Create Part Category"
-msgstr ""
+msgstr "Crear Categoría de Parte"
#: templates/js/translated/part.js:355
msgid "Create new category after this one"
-msgstr ""
+msgstr "Crear nueva categoría después de esta"
#: templates/js/translated/part.js:356
msgid "Part category created"
-msgstr ""
+msgstr "Categoría de parte creada"
#: templates/js/translated/part.js:370
msgid "Edit Part Category"
-msgstr ""
+msgstr "Editar Categoría de Parte"
#: templates/js/translated/part.js:383
msgid "Are you sure you want to delete this part category?"
-msgstr ""
+msgstr "¿Estás seguro de que deseas eliminar esta categoría?"
#: templates/js/translated/part.js:388
msgid "Move to parent category"
-msgstr ""
+msgstr "Mover a la categoría principal"
#: templates/js/translated/part.js:397
msgid "Delete Part Category"
-msgstr ""
+msgstr "Eliminar Categoría de Parte"
#: templates/js/translated/part.js:401
msgid "Action for parts in this category"
-msgstr ""
+msgstr "Acción para partes en esta categoría"
#: templates/js/translated/part.js:406
msgid "Action for child categories"
-msgstr ""
+msgstr "Acción para categorías secundarias"
#: templates/js/translated/part.js:430
msgid "Create Part"
-msgstr ""
+msgstr "Crear Parte"
#: templates/js/translated/part.js:432
msgid "Create another part after this one"
-msgstr ""
+msgstr "Crear otra parte después de esta"
#: templates/js/translated/part.js:433
msgid "Part created successfully"
-msgstr ""
+msgstr "Parte creada exitosamente"
#: templates/js/translated/part.js:461
msgid "Edit Part"
-msgstr ""
+msgstr "Editar Parte"
#: templates/js/translated/part.js:463
msgid "Part edited"
-msgstr ""
+msgstr "Parte editada"
#: templates/js/translated/part.js:474
msgid "Create Part Variant"
@@ -12161,11 +12192,11 @@ msgstr ""
#: templates/js/translated/part.js:685
#: templates/js/translated/table_filters.js:747
msgid "Low stock"
-msgstr ""
+msgstr "Stock bajo"
#: templates/js/translated/part.js:688
msgid "No stock available"
-msgstr ""
+msgstr "No hay stock disponible"
#: templates/js/translated/part.js:748
msgid "Demand"
@@ -12282,95 +12313,95 @@ msgstr ""
#: templates/js/translated/part.js:2288
msgid "parts"
-msgstr ""
+msgstr "partes"
#: templates/js/translated/part.js:2384
msgid "No category"
-msgstr ""
+msgstr "Sin categoría"
#: templates/js/translated/part.js:2531 templates/js/translated/part.js:2661
#: templates/js/translated/stock.js:2633
msgid "Display as list"
-msgstr ""
+msgstr "Mostrar como lista"
#: templates/js/translated/part.js:2547
msgid "Display as grid"
-msgstr ""
+msgstr "Mostrar como cuadrícula"
#: templates/js/translated/part.js:2645
msgid "No subcategories found"
-msgstr ""
+msgstr "No se encontraron subcategorías"
#: templates/js/translated/part.js:2681 templates/js/translated/stock.js:2653
msgid "Display as tree"
-msgstr ""
+msgstr "Mostrar como árbol"
#: templates/js/translated/part.js:2761
msgid "Load Subcategories"
-msgstr ""
+msgstr "Cargar subcategorías"
#: templates/js/translated/part.js:2777
msgid "Subscribed category"
-msgstr ""
+msgstr "Categoría suscrita"
-#: templates/js/translated/part.js:2855
+#: templates/js/translated/part.js:2864
msgid "No test templates matching query"
-msgstr ""
+msgstr "No hay plantillas de prueba que coincidan con la consulta"
-#: templates/js/translated/part.js:2877 templates/js/translated/search.js:342
+#: templates/js/translated/part.js:2886 templates/js/translated/search.js:342
msgid "results"
-msgstr ""
+msgstr "resultados"
-#: templates/js/translated/part.js:2927 templates/js/translated/stock.js:1446
+#: templates/js/translated/part.js:2936 templates/js/translated/stock.js:1446
msgid "Edit test result"
-msgstr ""
+msgstr "Editar resultado de prueba"
-#: templates/js/translated/part.js:2928 templates/js/translated/stock.js:1447
+#: templates/js/translated/part.js:2937 templates/js/translated/stock.js:1447
#: templates/js/translated/stock.js:1692
msgid "Delete test result"
-msgstr ""
+msgstr "Eliminar resultado de prueba"
-#: templates/js/translated/part.js:2932
+#: templates/js/translated/part.js:2941
msgid "This test is defined for a parent part"
-msgstr ""
+msgstr "Esta prueba está definida para una parte principal"
-#: templates/js/translated/part.js:2948
+#: templates/js/translated/part.js:2957
msgid "Edit Test Result Template"
-msgstr ""
+msgstr "Editar plantilla de resultado de prueba"
-#: templates/js/translated/part.js:2962
+#: templates/js/translated/part.js:2971
msgid "Delete Test Result Template"
-msgstr ""
+msgstr "Eliminar plantilla de resultados de prueba"
-#: templates/js/translated/part.js:3041 templates/js/translated/part.js:3042
+#: templates/js/translated/part.js:3050 templates/js/translated/part.js:3051
msgid "No date specified"
-msgstr ""
+msgstr "Sin fecha especificada"
-#: templates/js/translated/part.js:3044
+#: templates/js/translated/part.js:3053
msgid "Specified date is in the past"
-msgstr ""
+msgstr "Fecha especificada es en el pasado"
-#: templates/js/translated/part.js:3050
+#: templates/js/translated/part.js:3059
msgid "Speculative"
-msgstr ""
+msgstr "Especulativo"
-#: templates/js/translated/part.js:3100
+#: templates/js/translated/part.js:3109
msgid "No scheduling information available for this part"
-msgstr ""
+msgstr "No hay información de planificación disponible para esta parte"
-#: templates/js/translated/part.js:3106
+#: templates/js/translated/part.js:3115
msgid "Error fetching scheduling information for this part"
msgstr ""
-#: templates/js/translated/part.js:3202
+#: templates/js/translated/part.js:3211
msgid "Scheduled Stock Quantities"
-msgstr ""
+msgstr "Cantidad de Stock Programadas"
-#: templates/js/translated/part.js:3218
+#: templates/js/translated/part.js:3227
msgid "Maximum Quantity"
-msgstr ""
+msgstr "Cantidad Máxima"
-#: templates/js/translated/part.js:3263
+#: templates/js/translated/part.js:3272
msgid "Minimum Stock Level"
msgstr ""
@@ -12392,35 +12423,35 @@ msgstr ""
#: templates/js/translated/plugin.js:117 templates/js/translated/plugin.js:186
msgid "Disable Plugin"
-msgstr ""
+msgstr "Desactivar Plugin"
#: templates/js/translated/plugin.js:119 templates/js/translated/plugin.js:186
msgid "Enable Plugin"
-msgstr ""
+msgstr "Activar Plugin"
#: templates/js/translated/plugin.js:158
msgid "The Plugin was installed"
-msgstr ""
+msgstr "El plugin fue instalado"
#: templates/js/translated/plugin.js:177
msgid "Are you sure you want to enable this plugin?"
-msgstr ""
+msgstr "¿Estás seguro de que deseas activar este plugin?"
#: templates/js/translated/plugin.js:181
msgid "Are you sure you want to disable this plugin?"
-msgstr ""
+msgstr "¿Estás seguro de que deseas desactivar este plugin?"
#: templates/js/translated/plugin.js:189
msgid "Enable"
-msgstr ""
+msgstr "Activar"
#: templates/js/translated/plugin.js:189
msgid "Disable"
-msgstr ""
+msgstr "Desactivar"
#: templates/js/translated/plugin.js:203
msgid "Plugin updated"
-msgstr ""
+msgstr "Plugin actualizado"
#: templates/js/translated/pricing.js:159
msgid "Error fetching currency data"
@@ -13127,7 +13158,7 @@ msgstr ""
#: templates/js/translated/stock.js:1025
msgid "Move"
-msgstr ""
+msgstr "Mover"
#: templates/js/translated/stock.js:1031
msgid "Count Stock"
diff --git a/InvenTree/locale/es_MX/LC_MESSAGES/django.po b/InvenTree/locale/es_MX/LC_MESSAGES/django.po
index a6f744f447..7d787a6234 100644
--- a/InvenTree/locale/es_MX/LC_MESSAGES/django.po
+++ b/InvenTree/locale/es_MX/LC_MESSAGES/django.po
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2024-02-28 06:44+0000\n"
+"POT-Creation-Date: 2024-03-05 00:41+0000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME \n"
"Language-Team: LANGUAGE \n"
@@ -67,9 +67,9 @@ msgstr ""
#: report/templates/report/inventree_build_order_base.html:172
#: stock/admin.py:226 stock/models.py:2335 stock/models.py:2451
#: stock/serializers.py:479 stock/serializers.py:632 stock/serializers.py:728
-#: stock/serializers.py:778 stock/serializers.py:1081 stock/serializers.py:1170
-#: stock/serializers.py:1335 stock/templates/stock/stock_sidebar.html:25
-#: templates/js/translated/barcode.js:143 templates/js/translated/bom.js:1259
+#: stock/serializers.py:778 stock/serializers.py:1087 stock/serializers.py:1176
+#: stock/serializers.py:1341 stock/templates/stock/stock_sidebar.html:25
+#: templates/js/translated/barcode.js:143 templates/js/translated/bom.js:1265
#: templates/js/translated/company.js:1674 templates/js/translated/order.js:347
#: templates/js/translated/part.js:1080
#: templates/js/translated/purchase_order.js:2201
@@ -524,7 +524,7 @@ msgstr ""
#: templates/js/translated/order.js:298 templates/js/translated/part.js:1238
#: templates/js/translated/part.js:1483 templates/js/translated/part.js:1621
#: templates/js/translated/part.js:1958 templates/js/translated/part.js:2355
-#: templates/js/translated/part.js:2785 templates/js/translated/part.js:2887
+#: templates/js/translated/part.js:2785 templates/js/translated/part.js:2896
#: templates/js/translated/plugin.js:80
#: templates/js/translated/purchase_order.js:1707
#: templates/js/translated/purchase_order.js:1850
@@ -679,7 +679,7 @@ msgstr ""
msgid "Downloading images from remote URL is not enabled"
msgstr ""
-#: InvenTree/status.py:66 part/serializers.py:1120
+#: InvenTree/status.py:66 part/serializers.py:1138
msgid "Background worker check failed"
msgstr ""
@@ -961,7 +961,7 @@ msgid "Tracked"
msgstr ""
#: build/api.py:285 part/admin.py:144 templates/js/translated/build.js:1741
-#: templates/js/translated/build.js:2626
+#: templates/js/translated/build.js:2630
#: templates/js/translated/sales_order.js:1929
#: templates/js/translated/table_filters.js:571
msgid "Allocated"
@@ -1045,11 +1045,11 @@ msgstr ""
#: build/models.py:199 build/templates/build/build_base.html:97
#: build/templates/build/detail.html:29 company/models.py:1044
#: order/models.py:1389 order/models.py:1532 order/models.py:1533
-#: part/api.py:1528 part/models.py:389 part/models.py:3003 part/models.py:3147
-#: part/models.py:3291 part/models.py:3314 part/models.py:3335
-#: part/models.py:3357 part/models.py:3458 part/models.py:3754
-#: part/models.py:3885 part/models.py:3978 part/models.py:4339
-#: part/serializers.py:1066 part/serializers.py:1631
+#: part/api.py:1528 part/api.py:1820 part/models.py:389 part/models.py:3003
+#: part/models.py:3147 part/models.py:3291 part/models.py:3314
+#: part/models.py:3335 part/models.py:3357 part/models.py:3458
+#: part/models.py:3754 part/models.py:3885 part/models.py:3978
+#: part/models.py:4339 part/serializers.py:1084 part/serializers.py:1659
#: part/templates/part/part_app_base.html:8
#: part/templates/part/part_pricing.html:12
#: part/templates/part/upload_bom.html:52
@@ -1148,7 +1148,7 @@ msgid "Build status code"
msgstr ""
#: build/models.py:264 build/serializers.py:280 order/serializers.py:549
-#: stock/models.py:826 stock/serializers.py:1300
+#: stock/models.py:826 stock/serializers.py:1306
#: templates/js/translated/purchase_order.js:1129
msgid "Batch Code"
msgstr ""
@@ -1243,48 +1243,48 @@ msgstr ""
msgid "Project code for this build order"
msgstr ""
-#: build/models.py:559
+#: build/models.py:575
#, python-brace-format
msgid "Build order {build} has been completed"
msgstr ""
-#: build/models.py:565
+#: build/models.py:581
msgid "A build order has been completed"
msgstr ""
-#: build/models.py:783 build/models.py:858
+#: build/models.py:799 build/models.py:874
msgid "No build output specified"
msgstr ""
-#: build/models.py:786
+#: build/models.py:802
msgid "Build output is already completed"
msgstr ""
-#: build/models.py:789
+#: build/models.py:805
msgid "Build output does not match Build Order"
msgstr ""
-#: build/models.py:862 build/serializers.py:223 build/serializers.py:262
+#: build/models.py:878 build/serializers.py:223 build/serializers.py:262
#: build/serializers.py:831 order/models.py:526 order/serializers.py:401
-#: order/serializers.py:544 part/serializers.py:1423 part/serializers.py:1789
+#: order/serializers.py:544 part/serializers.py:1442 part/serializers.py:1817
#: stock/models.py:665 stock/models.py:1477 stock/serializers.py:450
msgid "Quantity must be greater than zero"
msgstr ""
-#: build/models.py:867 build/serializers.py:228
+#: build/models.py:883 build/serializers.py:228
msgid "Quantity cannot be greater than the output quantity"
msgstr ""
-#: build/models.py:924 build/serializers.py:533
+#: build/models.py:940 build/serializers.py:533
#, python-brace-format
msgid "Build output {serial} has not passed all required tests"
msgstr ""
-#: build/models.py:1286
+#: build/models.py:1302
msgid "Build object"
msgstr ""
-#: build/models.py:1300 build/models.py:1558 build/serializers.py:210
+#: build/models.py:1316 build/models.py:1574 build/serializers.py:210
#: build/serializers.py:247 build/templates/build/build_base.html:102
#: build/templates/build/detail.html:34 common/models.py:2432
#: order/models.py:1247 order/models.py:1902 order/serializers.py:1306
@@ -1311,7 +1311,7 @@ msgstr ""
#: templates/js/translated/company.js:1808
#: templates/js/translated/model_renderers.js:230
#: templates/js/translated/order.js:304 templates/js/translated/part.js:961
-#: templates/js/translated/part.js:1811 templates/js/translated/part.js:3332
+#: templates/js/translated/part.js:1811 templates/js/translated/part.js:3341
#: templates/js/translated/pricing.js:381
#: templates/js/translated/pricing.js:474
#: templates/js/translated/pricing.js:522
@@ -1331,38 +1331,38 @@ msgstr ""
msgid "Quantity"
msgstr ""
-#: build/models.py:1301
+#: build/models.py:1317
msgid "Required quantity for build order"
msgstr ""
-#: build/models.py:1381
+#: build/models.py:1397
msgid "Build item must specify a build output, as master part is marked as trackable"
msgstr ""
-#: build/models.py:1390
+#: build/models.py:1406
#, python-brace-format
msgid "Allocated quantity ({q}) must not exceed available stock quantity ({a})"
msgstr ""
-#: build/models.py:1400 order/models.py:1853
+#: build/models.py:1416 order/models.py:1853
msgid "Stock item is over-allocated"
msgstr ""
-#: build/models.py:1406 order/models.py:1856
+#: build/models.py:1422 order/models.py:1856
msgid "Allocation quantity must be greater than zero"
msgstr ""
-#: build/models.py:1412
+#: build/models.py:1428
msgid "Quantity must be 1 for serialized stock"
msgstr ""
-#: build/models.py:1473
+#: build/models.py:1489
msgid "Selected stock item does not match BOM line"
msgstr ""
-#: build/models.py:1545 build/serializers.py:811 order/serializers.py:1150
-#: order/serializers.py:1171 stock/serializers.py:544 stock/serializers.py:1019
-#: stock/serializers.py:1131 stock/templates/stock/item_base.html:10
+#: build/models.py:1561 build/serializers.py:811 order/serializers.py:1150
+#: order/serializers.py:1171 stock/serializers.py:544 stock/serializers.py:1025
+#: stock/serializers.py:1137 stock/templates/stock/item_base.html:10
#: stock/templates/stock/item_base.html:23
#: stock/templates/stock/item_base.html:194
#: templates/js/translated/build.js:1742
@@ -1377,19 +1377,19 @@ msgstr ""
msgid "Stock Item"
msgstr ""
-#: build/models.py:1546
+#: build/models.py:1562
msgid "Source stock item"
msgstr ""
-#: build/models.py:1559
+#: build/models.py:1575
msgid "Stock quantity to allocate to build"
msgstr ""
-#: build/models.py:1567
+#: build/models.py:1583
msgid "Install into"
msgstr ""
-#: build/models.py:1568
+#: build/models.py:1584
msgid "Destination stock item"
msgstr ""
@@ -1453,9 +1453,9 @@ msgid "A list of build outputs must be provided"
msgstr ""
#: build/serializers.py:426 build/serializers.py:498 order/serializers.py:533
-#: order/serializers.py:641 order/serializers.py:1646 part/serializers.py:1086
+#: order/serializers.py:641 order/serializers.py:1646 part/serializers.py:1104
#: stock/serializers.py:472 stock/serializers.py:627 stock/serializers.py:723
-#: stock/serializers.py:1163 stock/serializers.py:1419
+#: stock/serializers.py:1169 stock/serializers.py:1425
#: stock/templates/stock/item_base.html:394
#: templates/js/translated/barcode.js:547
#: templates/js/translated/barcode.js:795 templates/js/translated/build.js:999
@@ -1495,7 +1495,7 @@ msgstr ""
#: build/serializers.py:505 build/templates/build/build_base.html:151
#: build/templates/build/detail.html:62 order/models.py:910
#: order/models.py:2005 order/serializers.py:565 stock/admin.py:165
-#: stock/serializers.py:774 stock/serializers.py:1307
+#: stock/serializers.py:774 stock/serializers.py:1313
#: stock/templates/stock/item_base.html:427
#: templates/js/translated/barcode.js:252 templates/js/translated/build.js:2189
#: templates/js/translated/purchase_order.js:1308
@@ -1603,7 +1603,7 @@ msgstr ""
msgid "bom_item.part must point to the same part as the build order"
msgstr ""
-#: build/serializers.py:817 stock/serializers.py:1032
+#: build/serializers.py:817 stock/serializers.py:1038
msgid "Item must be in stock"
msgstr ""
@@ -1660,44 +1660,45 @@ msgstr ""
msgid "Allocate optional BOM items to build order"
msgstr ""
-#: build/serializers.py:1096 part/models.py:3895 part/models.py:4331
+#: build/serializers.py:1097 part/models.py:3895 part/models.py:4331
#: stock/api.py:745
msgid "BOM Item"
msgstr ""
-#: build/serializers.py:1105 templates/js/translated/index.js:130
+#: build/serializers.py:1106 templates/js/translated/index.js:130
msgid "Allocated Stock"
msgstr ""
-#: build/serializers.py:1110 part/admin.py:132 part/bom.py:173
-#: part/serializers.py:1441 part/templates/part/part_base.html:210
-#: templates/js/translated/bom.js:1202 templates/js/translated/build.js:2614
-#: templates/js/translated/part.js:709 templates/js/translated/part.js:2148
+#: build/serializers.py:1111 part/admin.py:132 part/bom.py:173
+#: part/serializers.py:798 part/serializers.py:1460
+#: part/templates/part/part_base.html:210 templates/js/translated/bom.js:1208
+#: templates/js/translated/build.js:2614 templates/js/translated/part.js:709
+#: templates/js/translated/part.js:2148
#: templates/js/translated/table_filters.js:170
msgid "On Order"
msgstr ""
-#: build/serializers.py:1115 part/serializers.py:1443
+#: build/serializers.py:1116 part/serializers.py:1462
#: templates/js/translated/build.js:2618
#: templates/js/translated/table_filters.js:360
msgid "In Production"
msgstr ""
-#: build/serializers.py:1120 part/bom.py:172 part/serializers.py:1454
+#: build/serializers.py:1121 part/bom.py:172 part/serializers.py:1473
#: part/templates/part/part_base.html:192
#: templates/js/translated/sales_order.js:1893
msgid "Available Stock"
msgstr ""
-#: build/tasks.py:149
+#: build/tasks.py:171
msgid "Stock required for build order"
msgstr ""
-#: build/tasks.py:166
+#: build/tasks.py:188
msgid "Overdue Build Order"
msgstr ""
-#: build/tasks.py:171
+#: build/tasks.py:193
#, python-brace-format
msgid "Build order {bo} is now overdue"
msgstr ""
@@ -1991,27 +1992,31 @@ msgstr ""
msgid "Order Parts"
msgstr ""
-#: build/templates/build/detail.html:210
-msgid "Incomplete Build Outputs"
-msgstr ""
-
-#: build/templates/build/detail.html:214
-msgid "Create new build output"
+#: build/templates/build/detail.html:205
+msgid "Available stock has been filtered based on specified source location for this build order"
msgstr ""
#: build/templates/build/detail.html:215
+msgid "Incomplete Build Outputs"
+msgstr ""
+
+#: build/templates/build/detail.html:219
+msgid "Create new build output"
+msgstr ""
+
+#: build/templates/build/detail.html:220
msgid "New Build Output"
msgstr ""
-#: build/templates/build/detail.html:232 build/templates/build/sidebar.html:15
+#: build/templates/build/detail.html:237 build/templates/build/sidebar.html:15
msgid "Consumed Stock"
msgstr ""
-#: build/templates/build/detail.html:244
+#: build/templates/build/detail.html:249
msgid "Completed Build Outputs"
msgstr ""
-#: build/templates/build/detail.html:256 build/templates/build/sidebar.html:19
+#: build/templates/build/detail.html:261 build/templates/build/sidebar.html:19
#: company/templates/company/detail.html:229
#: company/templates/company/manufacturer_part.html:141
#: company/templates/company/manufacturer_part_sidebar.html:9
@@ -2027,15 +2032,15 @@ msgstr ""
msgid "Attachments"
msgstr ""
-#: build/templates/build/detail.html:271
+#: build/templates/build/detail.html:276
msgid "Build Notes"
msgstr ""
-#: build/templates/build/detail.html:426
+#: build/templates/build/detail.html:434
msgid "Allocation Complete"
msgstr ""
-#: build/templates/build/detail.html:427
+#: build/templates/build/detail.html:435
msgid "All lines have been fully allocated"
msgstr ""
@@ -2437,7 +2442,7 @@ msgid "Parts are templates by default"
msgstr ""
#: common/models.py:1456 part/admin.py:91 part/admin.py:431 part/models.py:1015
-#: templates/js/translated/bom.js:1633
+#: templates/js/translated/bom.js:1639
#: templates/js/translated/table_filters.js:330
#: templates/js/translated/table_filters.js:721
msgid "Assembly"
@@ -3496,7 +3501,7 @@ msgstr ""
msgid "Price break quantity"
msgstr ""
-#: common/models.py:2440 company/serializers.py:484 order/admin.py:42
+#: common/models.py:2440 company/serializers.py:486 order/admin.py:42
#: order/models.py:1321 order/models.py:2226
#: templates/js/translated/company.js:1813 templates/js/translated/part.js:1885
#: templates/js/translated/pricing.js:621
@@ -3973,7 +3978,7 @@ msgstr ""
#: company/models.py:495 company/templates/company/company_base.html:76
#: company/templates/company/manufacturer_part.html:90
-#: company/templates/company/supplier_part.html:145 part/serializers.py:497
+#: company/templates/company/supplier_part.html:145 part/serializers.py:505
#: stock/templates/stock/item_base.html:207
#: templates/js/translated/company.js:506
#: templates/js/translated/company.js:1108
@@ -3988,7 +3993,7 @@ msgid "Select manufacturer"
msgstr ""
#: company/models.py:502 company/templates/company/manufacturer_part.html:101
-#: company/templates/company/supplier_part.html:153 part/serializers.py:507
+#: company/templates/company/supplier_part.html:153 part/serializers.py:515
#: templates/js/translated/company.js:351
#: templates/js/translated/company.js:1107
#: templates/js/translated/company.js:1302
@@ -4060,7 +4065,7 @@ msgstr ""
#: company/models.py:795 company/templates/company/company_base.html:81
#: company/templates/company/supplier_part.html:129 order/models.py:453
#: order/templates/order/order_base.html:136 part/bom.py:272 part/bom.py:310
-#: part/serializers.py:481 plugin/builtin/suppliers/digikey.py:25
+#: part/serializers.py:489 plugin/builtin/suppliers/digikey.py:25
#: plugin/builtin/suppliers/lcsc.py:26 plugin/builtin/suppliers/mouser.py:24
#: plugin/builtin/suppliers/tme.py:26 stock/templates/stock/item_base.html:224
#: templates/email/overdue_purchase_order.html:16
@@ -4077,7 +4082,7 @@ msgstr ""
msgid "Select supplier"
msgstr ""
-#: company/models.py:802 part/serializers.py:492
+#: company/models.py:802 part/serializers.py:500
msgid "Supplier stock keeping unit"
msgstr ""
@@ -4113,7 +4118,7 @@ msgid "Minimum charge (e.g. stocking fee)"
msgstr ""
#: company/models.py:851 company/templates/company/supplier_part.html:160
-#: stock/admin.py:224 stock/models.py:785 stock/serializers.py:1317
+#: stock/admin.py:224 stock/models.py:785 stock/serializers.py:1323
#: stock/templates/stock/item_base.html:240
#: templates/js/translated/company.js:1636
#: templates/js/translated/stock.js:2387
@@ -4158,7 +4163,7 @@ msgstr ""
msgid "Date of last update of availability data"
msgstr ""
-#: company/serializers.py:153
+#: company/serializers.py:155
msgid "Default currency used for this supplier"
msgstr ""
@@ -4219,7 +4224,7 @@ msgstr ""
#: company/templates/company/company_base.html:86 order/models.py:898
#: order/models.py:1993 order/templates/order/return_order_base.html:131
#: order/templates/order/sales_order_base.html:144 stock/models.py:807
-#: stock/models.py:808 stock/serializers.py:1067
+#: stock/models.py:808 stock/serializers.py:1073
#: stock/templates/stock/item_base.html:405
#: templates/email/overdue_sales_order.html:16
#: templates/js/translated/company.js:502
@@ -4430,8 +4435,9 @@ msgstr ""
#: company/templates/company/manufacturer_part.html:119
#: company/templates/company/supplier_part.html:15 company/views.py:31
-#: part/admin.py:122 part/templates/part/part_sidebar.html:33
-#: templates/InvenTree/search.html:190 templates/navbar.html:48
+#: part/admin.py:122 part/serializers.py:802
+#: part/templates/part/part_sidebar.html:33 templates/InvenTree/search.html:190
+#: templates/navbar.html:48
msgid "Suppliers"
msgstr ""
@@ -4529,7 +4535,7 @@ msgid "No supplier information available"
msgstr ""
#: company/templates/company/supplier_part.html:139 part/bom.py:279
-#: part/bom.py:311 part/serializers.py:491
+#: part/bom.py:311 part/serializers.py:499
#: templates/js/translated/company.js:349 templates/js/translated/part.js:1786
#: templates/js/translated/pricing.js:510
#: templates/js/translated/purchase_order.js:1851
@@ -4578,10 +4584,12 @@ msgstr ""
msgid "Update Part Availability"
msgstr ""
-#: company/templates/company/supplier_part_sidebar.html:5 part/stocktake.py:223
+#: company/templates/company/supplier_part_sidebar.html:5
+#: part/serializers.py:801 part/stocktake.py:223
#: part/templates/part/category.html:183
#: part/templates/part/category_sidebar.html:17 stock/admin.py:69
-#: stock/serializers.py:760 stock/templates/stock/location.html:170
+#: stock/serializers.py:760 stock/serializers.py:924
+#: stock/templates/stock/location.html:170
#: stock/templates/stock/location.html:184
#: stock/templates/stock/location.html:196
#: stock/templates/stock/location_sidebar.html:7
@@ -4641,7 +4649,7 @@ msgid "Label template file"
msgstr ""
#: label/models.py:143 part/models.py:3484 report/models.py:322
-#: templates/js/translated/part.js:2891
+#: templates/js/translated/part.js:2900
#: templates/js/translated/table_filters.js:481
msgid "Enabled"
msgstr ""
@@ -5734,7 +5742,7 @@ msgid "Pending Shipments"
msgstr ""
#: order/templates/order/sales_order_detail.html:71
-#: templates/js/translated/bom.js:1271 templates/js/translated/filters.js:296
+#: templates/js/translated/bom.js:1277 templates/js/translated/filters.js:296
msgid "Actions"
msgstr ""
@@ -5862,10 +5870,10 @@ msgstr ""
msgid "Category Path"
msgstr ""
-#: part/admin.py:323 part/models.py:390 part/serializers.py:259
-#: part/serializers.py:373 part/templates/part/cat_link.html:3
-#: part/templates/part/category.html:23 part/templates/part/category.html:141
-#: part/templates/part/category.html:161
+#: part/admin.py:323 part/models.py:390 part/serializers.py:112
+#: part/serializers.py:265 part/serializers.py:381
+#: part/templates/part/cat_link.html:3 part/templates/part/category.html:23
+#: part/templates/part/category.html:141 part/templates/part/category.html:161
#: part/templates/part/category_sidebar.html:9
#: templates/InvenTree/index.html:36 templates/InvenTree/search.html:84
#: templates/InvenTree/settings/sidebar.html:47
@@ -5890,13 +5898,13 @@ msgstr ""
msgid "Part IPN"
msgstr ""
-#: part/admin.py:421 part/serializers.py:1220
+#: part/admin.py:421 part/serializers.py:1238
#: templates/js/translated/pricing.js:358
#: templates/js/translated/pricing.js:1024
msgid "Minimum Price"
msgstr ""
-#: part/admin.py:426 part/serializers.py:1235
+#: part/admin.py:426 part/serializers.py:1253
#: templates/js/translated/pricing.js:353
#: templates/js/translated/pricing.js:1032
msgid "Maximum Price"
@@ -5975,7 +5983,7 @@ msgid "This option must be selected"
msgstr ""
#: part/api.py:1541 part/models.py:895 part/models.py:3385 part/models.py:3831
-#: part/serializers.py:388 part/serializers.py:1076
+#: part/serializers.py:396 part/serializers.py:1094
#: part/templates/part/part_base.html:260 stock/api.py:733
#: templates/InvenTree/settings/settings_staff_js.html:300
#: templates/js/translated/notification.js:60
@@ -5983,12 +5991,17 @@ msgstr ""
msgid "Category"
msgstr ""
+#: part/api.py:1828
+msgid "Uses"
+msgstr ""
+
#: part/bom.py:170 part/models.py:100 part/models.py:938
#: part/templates/part/category.html:116 part/templates/part/part_base.html:367
msgid "Default Location"
msgstr ""
-#: part/bom.py:171 templates/email/low_stock_notification.html:16
+#: part/bom.py:171 part/serializers.py:803
+#: templates/email/low_stock_notification.html:16
msgid "Total Stock"
msgstr ""
@@ -6011,7 +6024,8 @@ msgstr ""
msgid "Default location for parts in this category"
msgstr ""
-#: part/models.py:106 stock/models.py:165 templates/js/translated/stock.js:2736
+#: part/models.py:106 stock/models.py:165 templates/js/translated/part.js:2810
+#: templates/js/translated/stock.js:2736
#: templates/js/translated/table_filters.js:239
#: templates/js/translated/table_filters.js:283
msgid "Structural"
@@ -6419,7 +6433,7 @@ msgstr ""
msgid "Test with this name already exists for this part"
msgstr ""
-#: part/models.py:3464 templates/js/translated/part.js:2870
+#: part/models.py:3464 templates/js/translated/part.js:2879
msgid "Test Name"
msgstr ""
@@ -6447,7 +6461,7 @@ msgstr ""
msgid "Is this test enabled?"
msgstr ""
-#: part/models.py:3489 templates/js/translated/part.js:2899
+#: part/models.py:3489 templates/js/translated/part.js:2908
#: templates/js/translated/table_filters.js:477
msgid "Required"
msgstr ""
@@ -6456,7 +6470,7 @@ msgstr ""
msgid "Is this test required to pass?"
msgstr ""
-#: part/models.py:3495 templates/js/translated/part.js:2907
+#: part/models.py:3495 templates/js/translated/part.js:2916
msgid "Requires Value"
msgstr ""
@@ -6464,7 +6478,7 @@ msgstr ""
msgid "Does this test require a value when adding a test result?"
msgstr ""
-#: part/models.py:3501 templates/js/translated/part.js:2914
+#: part/models.py:3501 templates/js/translated/part.js:2923
msgid "Requires Attachment"
msgstr ""
@@ -6686,311 +6700,323 @@ msgstr ""
msgid "Duplicate relationship already exists"
msgstr ""
-#: part/serializers.py:128 part/templates/part/category.html:122
-#: part/templates/part/category.html:207
+#: part/serializers.py:114 part/serializers.py:134
+#: part/templates/part/category.html:122 part/templates/part/category.html:207
#: part/templates/part/category_sidebar.html:7
msgid "Subcategories"
msgstr ""
-#: part/serializers.py:172
+#: part/serializers.py:178
msgid "Results"
msgstr ""
-#: part/serializers.py:173
+#: part/serializers.py:179
msgid "Number of results recorded against this template"
msgstr ""
-#: part/serializers.py:197 part/serializers.py:215 stock/serializers.py:384
+#: part/serializers.py:203 part/serializers.py:221 stock/serializers.py:384
msgid "Purchase currency of this stock item"
msgstr ""
-#: part/serializers.py:260
+#: part/serializers.py:266
msgid "Number of parts using this template"
msgstr ""
-#: part/serializers.py:379
+#: part/serializers.py:387
msgid "No parts selected"
msgstr ""
-#: part/serializers.py:389
+#: part/serializers.py:397
msgid "Select category"
msgstr ""
-#: part/serializers.py:419
+#: part/serializers.py:427
msgid "Original Part"
msgstr ""
-#: part/serializers.py:420
+#: part/serializers.py:428
msgid "Select original part to duplicate"
msgstr ""
-#: part/serializers.py:425
+#: part/serializers.py:433
msgid "Copy Image"
msgstr ""
-#: part/serializers.py:426
+#: part/serializers.py:434
msgid "Copy image from original part"
msgstr ""
-#: part/serializers.py:432 part/templates/part/detail.html:277
+#: part/serializers.py:440 part/templates/part/detail.html:277
msgid "Copy BOM"
msgstr ""
-#: part/serializers.py:433
+#: part/serializers.py:441
msgid "Copy bill of materials from original part"
msgstr ""
-#: part/serializers.py:439
+#: part/serializers.py:447
msgid "Copy Parameters"
msgstr ""
-#: part/serializers.py:440
+#: part/serializers.py:448
msgid "Copy parameter data from original part"
msgstr ""
-#: part/serializers.py:446
+#: part/serializers.py:454
msgid "Copy Notes"
msgstr ""
-#: part/serializers.py:447
+#: part/serializers.py:455
msgid "Copy notes from original part"
msgstr ""
-#: part/serializers.py:460
+#: part/serializers.py:468
msgid "Initial Stock Quantity"
msgstr ""
-#: part/serializers.py:462
+#: part/serializers.py:470
msgid "Specify initial stock quantity for this Part. If quantity is zero, no stock is added."
msgstr ""
-#: part/serializers.py:469
+#: part/serializers.py:477
msgid "Initial Stock Location"
msgstr ""
-#: part/serializers.py:470
+#: part/serializers.py:478
msgid "Specify initial stock location for this Part"
msgstr ""
-#: part/serializers.py:482
+#: part/serializers.py:490
msgid "Select supplier (or leave blank to skip)"
msgstr ""
-#: part/serializers.py:498
+#: part/serializers.py:506
msgid "Select manufacturer (or leave blank to skip)"
msgstr ""
-#: part/serializers.py:508
+#: part/serializers.py:516
msgid "Manufacturer part number"
msgstr ""
-#: part/serializers.py:515
+#: part/serializers.py:523
msgid "Selected company is not a valid supplier"
msgstr ""
-#: part/serializers.py:524
+#: part/serializers.py:532
msgid "Selected company is not a valid manufacturer"
msgstr ""
-#: part/serializers.py:535
+#: part/serializers.py:543
msgid "Manufacturer part matching this MPN already exists"
msgstr ""
-#: part/serializers.py:542
+#: part/serializers.py:550
msgid "Supplier part matching this SKU already exists"
msgstr ""
-#: part/serializers.py:815 part/templates/part/copy_part.html:9
+#: part/serializers.py:804
+msgid "External Stock"
+msgstr ""
+
+#: part/serializers.py:806
+msgid "Unallocated Stock"
+msgstr ""
+
+#: part/serializers.py:808
+msgid "Variant Stock"
+msgstr ""
+
+#: part/serializers.py:833 part/templates/part/copy_part.html:9
#: templates/js/translated/part.js:471
msgid "Duplicate Part"
msgstr ""
-#: part/serializers.py:816
+#: part/serializers.py:834
msgid "Copy initial data from another Part"
msgstr ""
-#: part/serializers.py:822 templates/js/translated/part.js:102
+#: part/serializers.py:840 templates/js/translated/part.js:102
msgid "Initial Stock"
msgstr ""
-#: part/serializers.py:823
+#: part/serializers.py:841
msgid "Create Part with initial stock quantity"
msgstr ""
-#: part/serializers.py:829
+#: part/serializers.py:847
msgid "Supplier Information"
msgstr ""
-#: part/serializers.py:830
+#: part/serializers.py:848
msgid "Add initial supplier information for this part"
msgstr ""
-#: part/serializers.py:838
+#: part/serializers.py:856
msgid "Copy Category Parameters"
msgstr ""
-#: part/serializers.py:839
+#: part/serializers.py:857
msgid "Copy parameter templates from selected part category"
msgstr ""
-#: part/serializers.py:844
+#: part/serializers.py:862
msgid "Existing Image"
msgstr ""
-#: part/serializers.py:845
+#: part/serializers.py:863
msgid "Filename of an existing part image"
msgstr ""
-#: part/serializers.py:862
+#: part/serializers.py:880
msgid "Image file does not exist"
msgstr ""
-#: part/serializers.py:1068
+#: part/serializers.py:1086
msgid "Limit stocktake report to a particular part, and any variant parts"
msgstr ""
-#: part/serializers.py:1078
+#: part/serializers.py:1096
msgid "Limit stocktake report to a particular part category, and any child categories"
msgstr ""
-#: part/serializers.py:1088
+#: part/serializers.py:1106
msgid "Limit stocktake report to a particular stock location, and any child locations"
msgstr ""
-#: part/serializers.py:1094
+#: part/serializers.py:1112
msgid "Exclude External Stock"
msgstr ""
-#: part/serializers.py:1095
+#: part/serializers.py:1113
msgid "Exclude stock items in external locations"
msgstr ""
-#: part/serializers.py:1100
+#: part/serializers.py:1118
msgid "Generate Report"
msgstr ""
-#: part/serializers.py:1101
+#: part/serializers.py:1119
msgid "Generate report file containing calculated stocktake data"
msgstr ""
-#: part/serializers.py:1106
+#: part/serializers.py:1124
msgid "Update Parts"
msgstr ""
-#: part/serializers.py:1107
+#: part/serializers.py:1125
msgid "Update specified parts with calculated stocktake data"
msgstr ""
-#: part/serializers.py:1115
+#: part/serializers.py:1133
msgid "Stocktake functionality is not enabled"
msgstr ""
-#: part/serializers.py:1221
+#: part/serializers.py:1239
msgid "Override calculated value for minimum price"
msgstr ""
-#: part/serializers.py:1228
+#: part/serializers.py:1246
msgid "Minimum price currency"
msgstr ""
-#: part/serializers.py:1236
+#: part/serializers.py:1254
msgid "Override calculated value for maximum price"
msgstr ""
-#: part/serializers.py:1243
+#: part/serializers.py:1261
msgid "Maximum price currency"
msgstr ""
-#: part/serializers.py:1272
+#: part/serializers.py:1290
msgid "Update"
msgstr ""
-#: part/serializers.py:1273
+#: part/serializers.py:1291
msgid "Update pricing for this part"
msgstr ""
-#: part/serializers.py:1296
+#: part/serializers.py:1314
#, python-brace-format
msgid "Could not convert from provided currencies to {default_currency}"
msgstr ""
-#: part/serializers.py:1303
+#: part/serializers.py:1321
msgid "Minimum price must not be greater than maximum price"
msgstr ""
-#: part/serializers.py:1306
+#: part/serializers.py:1324
msgid "Maximum price must not be less than minimum price"
msgstr ""
-#: part/serializers.py:1632
+#: part/serializers.py:1660
msgid "Select part to copy BOM from"
msgstr ""
-#: part/serializers.py:1640
+#: part/serializers.py:1668
msgid "Remove Existing Data"
msgstr ""
-#: part/serializers.py:1641
+#: part/serializers.py:1669
msgid "Remove existing BOM items before copying"
msgstr ""
-#: part/serializers.py:1646
+#: part/serializers.py:1674
msgid "Include Inherited"
msgstr ""
-#: part/serializers.py:1647
+#: part/serializers.py:1675
msgid "Include BOM items which are inherited from templated parts"
msgstr ""
-#: part/serializers.py:1652
+#: part/serializers.py:1680
msgid "Skip Invalid Rows"
msgstr ""
-#: part/serializers.py:1653
+#: part/serializers.py:1681
msgid "Enable this option to skip invalid rows"
msgstr ""
-#: part/serializers.py:1658
+#: part/serializers.py:1686
msgid "Copy Substitute Parts"
msgstr ""
-#: part/serializers.py:1659
+#: part/serializers.py:1687
msgid "Copy substitute parts when duplicate BOM items"
msgstr ""
-#: part/serializers.py:1693
+#: part/serializers.py:1721
msgid "Clear Existing BOM"
msgstr ""
-#: part/serializers.py:1694
+#: part/serializers.py:1722
msgid "Delete existing BOM items before uploading"
msgstr ""
-#: part/serializers.py:1724
+#: part/serializers.py:1752
msgid "No part column specified"
msgstr ""
-#: part/serializers.py:1768
+#: part/serializers.py:1796
msgid "Multiple matching parts found"
msgstr ""
-#: part/serializers.py:1771
+#: part/serializers.py:1799
msgid "No matching part found"
msgstr ""
-#: part/serializers.py:1774
+#: part/serializers.py:1802
msgid "Part is not designated as a component"
msgstr ""
-#: part/serializers.py:1783
+#: part/serializers.py:1811
msgid "Quantity not provided"
msgstr ""
-#: part/serializers.py:1791
+#: part/serializers.py:1819
msgid "Invalid quantity"
msgstr ""
-#: part/serializers.py:1812
+#: part/serializers.py:1840
msgid "At least one BOM item is required"
msgstr ""
@@ -7222,7 +7248,7 @@ msgid "Validate BOM"
msgstr ""
#: part/templates/part/detail.html:283 part/templates/part/detail.html:284
-#: templates/js/translated/bom.js:1314 templates/js/translated/bom.js:1315
+#: templates/js/translated/bom.js:1320 templates/js/translated/bom.js:1321
msgid "Add BOM Item"
msgstr ""
@@ -7406,7 +7432,7 @@ msgstr ""
msgid "Allocated to Sales Orders"
msgstr ""
-#: part/templates/part/part_base.html:235 templates/js/translated/bom.js:1213
+#: part/templates/part/part_base.html:235 templates/js/translated/bom.js:1219
msgid "Can Build"
msgstr ""
@@ -8785,7 +8811,7 @@ msgstr ""
msgid "Where is this stock item located?"
msgstr ""
-#: stock/models.py:786 stock/serializers.py:1318
+#: stock/models.py:786 stock/serializers.py:1324
msgid "Packaging this stock item is stored in"
msgstr ""
@@ -8797,7 +8823,7 @@ msgstr ""
msgid "Serial number for this item"
msgstr ""
-#: stock/models.py:830 stock/serializers.py:1301
+#: stock/models.py:830 stock/serializers.py:1307
msgid "Batch code for this stock item"
msgstr ""
@@ -8906,7 +8932,7 @@ msgstr ""
msgid "Serialized stock cannot be merged"
msgstr ""
-#: stock/models.py:1639 stock/serializers.py:1207
+#: stock/models.py:1639 stock/serializers.py:1213
msgid "Duplicate stock items"
msgstr ""
@@ -8987,7 +9013,7 @@ msgstr ""
msgid "Enter serial numbers for new items"
msgstr ""
-#: stock/serializers.py:473 stock/serializers.py:1164 stock/serializers.py:1420
+#: stock/serializers.py:473 stock/serializers.py:1170 stock/serializers.py:1426
msgid "Destination stock location"
msgstr ""
@@ -9060,77 +9086,78 @@ msgstr ""
msgid "No stock items selected"
msgstr ""
-#: stock/serializers.py:863 stock/templates/stock/location.html:165
+#: stock/serializers.py:863 stock/serializers.py:926
+#: stock/templates/stock/location.html:165
#: stock/templates/stock/location.html:213
#: stock/templates/stock/location_sidebar.html:5
msgid "Sublocations"
msgstr ""
-#: stock/serializers.py:1036
+#: stock/serializers.py:1042
msgid "Part must be salable"
msgstr ""
-#: stock/serializers.py:1040
+#: stock/serializers.py:1046
msgid "Item is allocated to a sales order"
msgstr ""
-#: stock/serializers.py:1044
+#: stock/serializers.py:1050
msgid "Item is allocated to a build order"
msgstr ""
-#: stock/serializers.py:1068
+#: stock/serializers.py:1074
msgid "Customer to assign stock items"
msgstr ""
-#: stock/serializers.py:1074
+#: stock/serializers.py:1080
msgid "Selected company is not a customer"
msgstr ""
-#: stock/serializers.py:1082
+#: stock/serializers.py:1088
msgid "Stock assignment notes"
msgstr ""
-#: stock/serializers.py:1092 stock/serializers.py:1346
+#: stock/serializers.py:1098 stock/serializers.py:1352
msgid "A list of stock items must be provided"
msgstr ""
-#: stock/serializers.py:1171
+#: stock/serializers.py:1177
msgid "Stock merging notes"
msgstr ""
-#: stock/serializers.py:1176
+#: stock/serializers.py:1182
msgid "Allow mismatched suppliers"
msgstr ""
-#: stock/serializers.py:1177
+#: stock/serializers.py:1183
msgid "Allow stock items with different supplier parts to be merged"
msgstr ""
-#: stock/serializers.py:1182
+#: stock/serializers.py:1188
msgid "Allow mismatched status"
msgstr ""
-#: stock/serializers.py:1183
+#: stock/serializers.py:1189
msgid "Allow stock items with different status codes to be merged"
msgstr ""
-#: stock/serializers.py:1193
+#: stock/serializers.py:1199
msgid "At least two stock items must be provided"
msgstr ""
-#: stock/serializers.py:1260
+#: stock/serializers.py:1266
msgid "No Change"
msgstr ""
-#: stock/serializers.py:1289
+#: stock/serializers.py:1295
msgid "StockItem primary key value"
msgstr ""
-#: stock/serializers.py:1308
+#: stock/serializers.py:1314
msgid "Stock item status code"
msgstr ""
-#: stock/serializers.py:1336
+#: stock/serializers.py:1342
msgid "Stock transaction notes"
msgstr ""
@@ -10663,7 +10690,7 @@ msgid "The following parts are low on required stock"
msgstr ""
#: templates/email/build_order_required_stock.html:18
-#: templates/js/translated/bom.js:1668 templates/js/translated/build.js:2557
+#: templates/js/translated/bom.js:1674 templates/js/translated/build.js:2557
msgid "Required Quantity"
msgstr ""
@@ -10677,7 +10704,7 @@ msgid "Click on the following link to view this part"
msgstr ""
#: templates/email/low_stock_notification.html:18
-#: templates/js/translated/part.js:3209
+#: templates/js/translated/part.js:3218
msgid "Minimum Quantity"
msgstr ""
@@ -11052,62 +11079,66 @@ msgstr ""
msgid "No pricing available"
msgstr ""
-#: templates/js/translated/bom.js:1182 templates/js/translated/build.js:2596
+#: templates/js/translated/bom.js:1184 templates/js/translated/build.js:2622
+msgid "External stock"
+msgstr ""
+
+#: templates/js/translated/bom.js:1188 templates/js/translated/build.js:2596
#: templates/js/translated/sales_order.js:1910
msgid "No Stock Available"
msgstr ""
-#: templates/js/translated/bom.js:1187 templates/js/translated/build.js:2600
+#: templates/js/translated/bom.js:1193 templates/js/translated/build.js:2600
msgid "Includes variant and substitute stock"
msgstr ""
-#: templates/js/translated/bom.js:1189 templates/js/translated/build.js:2602
+#: templates/js/translated/bom.js:1195 templates/js/translated/build.js:2602
#: templates/js/translated/part.js:1256
#: templates/js/translated/sales_order.js:1907
msgid "Includes variant stock"
msgstr ""
-#: templates/js/translated/bom.js:1191 templates/js/translated/build.js:2604
+#: templates/js/translated/bom.js:1197 templates/js/translated/build.js:2604
msgid "Includes substitute stock"
msgstr ""
-#: templates/js/translated/bom.js:1219 templates/js/translated/build.js:2587
+#: templates/js/translated/bom.js:1225 templates/js/translated/build.js:2587
msgid "Consumable item"
msgstr ""
-#: templates/js/translated/bom.js:1279
+#: templates/js/translated/bom.js:1285
msgid "Validate BOM Item"
msgstr ""
-#: templates/js/translated/bom.js:1281
+#: templates/js/translated/bom.js:1287
msgid "This line has been validated"
msgstr ""
-#: templates/js/translated/bom.js:1283
+#: templates/js/translated/bom.js:1289
msgid "Edit substitute parts"
msgstr ""
-#: templates/js/translated/bom.js:1285 templates/js/translated/bom.js:1480
+#: templates/js/translated/bom.js:1291 templates/js/translated/bom.js:1486
msgid "Edit BOM Item"
msgstr ""
-#: templates/js/translated/bom.js:1287
+#: templates/js/translated/bom.js:1293
msgid "Delete BOM Item"
msgstr ""
-#: templates/js/translated/bom.js:1307
+#: templates/js/translated/bom.js:1313
msgid "View BOM"
msgstr ""
-#: templates/js/translated/bom.js:1391
+#: templates/js/translated/bom.js:1397
msgid "No BOM items found"
msgstr ""
-#: templates/js/translated/bom.js:1651 templates/js/translated/build.js:2486
+#: templates/js/translated/bom.js:1657 templates/js/translated/build.js:2486
msgid "Required Part"
msgstr ""
-#: templates/js/translated/bom.js:1677
+#: templates/js/translated/bom.js:1683
msgid "Inherited from parent BOM"
msgstr ""
@@ -11450,29 +11481,29 @@ msgstr ""
msgid "Sufficient stock available"
msgstr ""
-#: templates/js/translated/build.js:2643
+#: templates/js/translated/build.js:2647
msgid "Consumable Item"
msgstr ""
-#: templates/js/translated/build.js:2648
+#: templates/js/translated/build.js:2652
msgid "Tracked item"
msgstr ""
-#: templates/js/translated/build.js:2655
+#: templates/js/translated/build.js:2659
#: templates/js/translated/sales_order.js:2016
msgid "Build stock"
msgstr ""
-#: templates/js/translated/build.js:2660 templates/js/translated/stock.js:1829
+#: templates/js/translated/build.js:2664 templates/js/translated/stock.js:1829
msgid "Order stock"
msgstr ""
-#: templates/js/translated/build.js:2664
+#: templates/js/translated/build.js:2668
#: templates/js/translated/sales_order.js:2010
msgid "Allocate stock"
msgstr ""
-#: templates/js/translated/build.js:2668
+#: templates/js/translated/build.js:2672
msgid "Remove stock allocation"
msgstr ""
@@ -12314,64 +12345,64 @@ msgstr ""
msgid "Subscribed category"
msgstr ""
-#: templates/js/translated/part.js:2855
+#: templates/js/translated/part.js:2864
msgid "No test templates matching query"
msgstr ""
-#: templates/js/translated/part.js:2877 templates/js/translated/search.js:342
+#: templates/js/translated/part.js:2886 templates/js/translated/search.js:342
msgid "results"
msgstr ""
-#: templates/js/translated/part.js:2927 templates/js/translated/stock.js:1446
+#: templates/js/translated/part.js:2936 templates/js/translated/stock.js:1446
msgid "Edit test result"
msgstr ""
-#: templates/js/translated/part.js:2928 templates/js/translated/stock.js:1447
+#: templates/js/translated/part.js:2937 templates/js/translated/stock.js:1447
#: templates/js/translated/stock.js:1692
msgid "Delete test result"
msgstr ""
-#: templates/js/translated/part.js:2932
+#: templates/js/translated/part.js:2941
msgid "This test is defined for a parent part"
msgstr ""
-#: templates/js/translated/part.js:2948
+#: templates/js/translated/part.js:2957
msgid "Edit Test Result Template"
msgstr ""
-#: templates/js/translated/part.js:2962
+#: templates/js/translated/part.js:2971
msgid "Delete Test Result Template"
msgstr ""
-#: templates/js/translated/part.js:3041 templates/js/translated/part.js:3042
+#: templates/js/translated/part.js:3050 templates/js/translated/part.js:3051
msgid "No date specified"
msgstr ""
-#: templates/js/translated/part.js:3044
+#: templates/js/translated/part.js:3053
msgid "Specified date is in the past"
msgstr ""
-#: templates/js/translated/part.js:3050
+#: templates/js/translated/part.js:3059
msgid "Speculative"
msgstr ""
-#: templates/js/translated/part.js:3100
+#: templates/js/translated/part.js:3109
msgid "No scheduling information available for this part"
msgstr ""
-#: templates/js/translated/part.js:3106
+#: templates/js/translated/part.js:3115
msgid "Error fetching scheduling information for this part"
msgstr ""
-#: templates/js/translated/part.js:3202
+#: templates/js/translated/part.js:3211
msgid "Scheduled Stock Quantities"
msgstr ""
-#: templates/js/translated/part.js:3218
+#: templates/js/translated/part.js:3227
msgid "Maximum Quantity"
msgstr ""
-#: templates/js/translated/part.js:3263
+#: templates/js/translated/part.js:3272
msgid "Minimum Stock Level"
msgstr ""
diff --git a/InvenTree/locale/fa/LC_MESSAGES/django.po b/InvenTree/locale/fa/LC_MESSAGES/django.po
index 8e5a5912d4..db05fa6d7c 100644
--- a/InvenTree/locale/fa/LC_MESSAGES/django.po
+++ b/InvenTree/locale/fa/LC_MESSAGES/django.po
@@ -2,7 +2,7 @@ msgid ""
msgstr ""
"Project-Id-Version: inventree\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2024-02-28 04:05+0000\n"
+"POT-Creation-Date: 2024-03-05 00:41+0000\n"
"PO-Revision-Date: 2024-02-28 07:23\n"
"Last-Translator: \n"
"Language-Team: Persian\n"
@@ -66,9 +66,9 @@ msgstr "تاریخ را وارد کنید"
#: report/templates/report/inventree_build_order_base.html:172
#: stock/admin.py:226 stock/models.py:2335 stock/models.py:2451
#: stock/serializers.py:479 stock/serializers.py:632 stock/serializers.py:728
-#: stock/serializers.py:778 stock/serializers.py:1081 stock/serializers.py:1170
-#: stock/serializers.py:1335 stock/templates/stock/stock_sidebar.html:25
-#: templates/js/translated/barcode.js:143 templates/js/translated/bom.js:1259
+#: stock/serializers.py:778 stock/serializers.py:1087 stock/serializers.py:1176
+#: stock/serializers.py:1341 stock/templates/stock/stock_sidebar.html:25
+#: templates/js/translated/barcode.js:143 templates/js/translated/bom.js:1265
#: templates/js/translated/company.js:1674 templates/js/translated/order.js:347
#: templates/js/translated/part.js:1080
#: templates/js/translated/purchase_order.js:2201
@@ -523,7 +523,7 @@ msgstr ""
#: templates/js/translated/order.js:298 templates/js/translated/part.js:1238
#: templates/js/translated/part.js:1483 templates/js/translated/part.js:1621
#: templates/js/translated/part.js:1958 templates/js/translated/part.js:2355
-#: templates/js/translated/part.js:2785 templates/js/translated/part.js:2887
+#: templates/js/translated/part.js:2785 templates/js/translated/part.js:2896
#: templates/js/translated/plugin.js:80
#: templates/js/translated/purchase_order.js:1707
#: templates/js/translated/purchase_order.js:1850
@@ -678,7 +678,7 @@ msgstr "آدرس فایل تصویری از راه دور"
msgid "Downloading images from remote URL is not enabled"
msgstr ""
-#: InvenTree/status.py:66 part/serializers.py:1120
+#: InvenTree/status.py:66 part/serializers.py:1138
msgid "Background worker check failed"
msgstr ""
@@ -960,7 +960,7 @@ msgid "Tracked"
msgstr ""
#: build/api.py:285 part/admin.py:144 templates/js/translated/build.js:1741
-#: templates/js/translated/build.js:2626
+#: templates/js/translated/build.js:2630
#: templates/js/translated/sales_order.js:1929
#: templates/js/translated/table_filters.js:571
msgid "Allocated"
@@ -1044,11 +1044,11 @@ msgstr ""
#: build/models.py:199 build/templates/build/build_base.html:97
#: build/templates/build/detail.html:29 company/models.py:1044
#: order/models.py:1389 order/models.py:1532 order/models.py:1533
-#: part/api.py:1528 part/models.py:389 part/models.py:3003 part/models.py:3147
-#: part/models.py:3291 part/models.py:3314 part/models.py:3335
-#: part/models.py:3357 part/models.py:3458 part/models.py:3754
-#: part/models.py:3885 part/models.py:3978 part/models.py:4339
-#: part/serializers.py:1066 part/serializers.py:1631
+#: part/api.py:1528 part/api.py:1820 part/models.py:389 part/models.py:3003
+#: part/models.py:3147 part/models.py:3291 part/models.py:3314
+#: part/models.py:3335 part/models.py:3357 part/models.py:3458
+#: part/models.py:3754 part/models.py:3885 part/models.py:3978
+#: part/models.py:4339 part/serializers.py:1084 part/serializers.py:1659
#: part/templates/part/part_app_base.html:8
#: part/templates/part/part_pricing.html:12
#: part/templates/part/upload_bom.html:52
@@ -1147,7 +1147,7 @@ msgid "Build status code"
msgstr ""
#: build/models.py:264 build/serializers.py:280 order/serializers.py:549
-#: stock/models.py:826 stock/serializers.py:1300
+#: stock/models.py:826 stock/serializers.py:1306
#: templates/js/translated/purchase_order.js:1129
msgid "Batch Code"
msgstr ""
@@ -1242,48 +1242,48 @@ msgstr ""
msgid "Project code for this build order"
msgstr ""
-#: build/models.py:559
+#: build/models.py:575
#, python-brace-format
msgid "Build order {build} has been completed"
msgstr ""
-#: build/models.py:565
+#: build/models.py:581
msgid "A build order has been completed"
msgstr ""
-#: build/models.py:783 build/models.py:858
+#: build/models.py:799 build/models.py:874
msgid "No build output specified"
msgstr ""
-#: build/models.py:786
+#: build/models.py:802
msgid "Build output is already completed"
msgstr ""
-#: build/models.py:789
+#: build/models.py:805
msgid "Build output does not match Build Order"
msgstr ""
-#: build/models.py:862 build/serializers.py:223 build/serializers.py:262
+#: build/models.py:878 build/serializers.py:223 build/serializers.py:262
#: build/serializers.py:831 order/models.py:526 order/serializers.py:401
-#: order/serializers.py:544 part/serializers.py:1423 part/serializers.py:1789
+#: order/serializers.py:544 part/serializers.py:1442 part/serializers.py:1817
#: stock/models.py:665 stock/models.py:1477 stock/serializers.py:450
msgid "Quantity must be greater than zero"
msgstr ""
-#: build/models.py:867 build/serializers.py:228
+#: build/models.py:883 build/serializers.py:228
msgid "Quantity cannot be greater than the output quantity"
msgstr ""
-#: build/models.py:924 build/serializers.py:533
+#: build/models.py:940 build/serializers.py:533
#, python-brace-format
msgid "Build output {serial} has not passed all required tests"
msgstr ""
-#: build/models.py:1286
+#: build/models.py:1302
msgid "Build object"
msgstr ""
-#: build/models.py:1300 build/models.py:1558 build/serializers.py:210
+#: build/models.py:1316 build/models.py:1574 build/serializers.py:210
#: build/serializers.py:247 build/templates/build/build_base.html:102
#: build/templates/build/detail.html:34 common/models.py:2432
#: order/models.py:1247 order/models.py:1902 order/serializers.py:1306
@@ -1310,7 +1310,7 @@ msgstr ""
#: templates/js/translated/company.js:1808
#: templates/js/translated/model_renderers.js:230
#: templates/js/translated/order.js:304 templates/js/translated/part.js:961
-#: templates/js/translated/part.js:1811 templates/js/translated/part.js:3332
+#: templates/js/translated/part.js:1811 templates/js/translated/part.js:3341
#: templates/js/translated/pricing.js:381
#: templates/js/translated/pricing.js:474
#: templates/js/translated/pricing.js:522
@@ -1330,38 +1330,38 @@ msgstr ""
msgid "Quantity"
msgstr ""
-#: build/models.py:1301
+#: build/models.py:1317
msgid "Required quantity for build order"
msgstr ""
-#: build/models.py:1381
+#: build/models.py:1397
msgid "Build item must specify a build output, as master part is marked as trackable"
msgstr ""
-#: build/models.py:1390
+#: build/models.py:1406
#, python-brace-format
msgid "Allocated quantity ({q}) must not exceed available stock quantity ({a})"
msgstr ""
-#: build/models.py:1400 order/models.py:1853
+#: build/models.py:1416 order/models.py:1853
msgid "Stock item is over-allocated"
msgstr ""
-#: build/models.py:1406 order/models.py:1856
+#: build/models.py:1422 order/models.py:1856
msgid "Allocation quantity must be greater than zero"
msgstr ""
-#: build/models.py:1412
+#: build/models.py:1428
msgid "Quantity must be 1 for serialized stock"
msgstr ""
-#: build/models.py:1473
+#: build/models.py:1489
msgid "Selected stock item does not match BOM line"
msgstr ""
-#: build/models.py:1545 build/serializers.py:811 order/serializers.py:1150
-#: order/serializers.py:1171 stock/serializers.py:544 stock/serializers.py:1019
-#: stock/serializers.py:1131 stock/templates/stock/item_base.html:10
+#: build/models.py:1561 build/serializers.py:811 order/serializers.py:1150
+#: order/serializers.py:1171 stock/serializers.py:544 stock/serializers.py:1025
+#: stock/serializers.py:1137 stock/templates/stock/item_base.html:10
#: stock/templates/stock/item_base.html:23
#: stock/templates/stock/item_base.html:194
#: templates/js/translated/build.js:1742
@@ -1376,19 +1376,19 @@ msgstr ""
msgid "Stock Item"
msgstr ""
-#: build/models.py:1546
+#: build/models.py:1562
msgid "Source stock item"
msgstr ""
-#: build/models.py:1559
+#: build/models.py:1575
msgid "Stock quantity to allocate to build"
msgstr ""
-#: build/models.py:1567
+#: build/models.py:1583
msgid "Install into"
msgstr ""
-#: build/models.py:1568
+#: build/models.py:1584
msgid "Destination stock item"
msgstr ""
@@ -1452,9 +1452,9 @@ msgid "A list of build outputs must be provided"
msgstr ""
#: build/serializers.py:426 build/serializers.py:498 order/serializers.py:533
-#: order/serializers.py:641 order/serializers.py:1646 part/serializers.py:1086
+#: order/serializers.py:641 order/serializers.py:1646 part/serializers.py:1104
#: stock/serializers.py:472 stock/serializers.py:627 stock/serializers.py:723
-#: stock/serializers.py:1163 stock/serializers.py:1419
+#: stock/serializers.py:1169 stock/serializers.py:1425
#: stock/templates/stock/item_base.html:394
#: templates/js/translated/barcode.js:547
#: templates/js/translated/barcode.js:795 templates/js/translated/build.js:999
@@ -1494,7 +1494,7 @@ msgstr ""
#: build/serializers.py:505 build/templates/build/build_base.html:151
#: build/templates/build/detail.html:62 order/models.py:910
#: order/models.py:2005 order/serializers.py:565 stock/admin.py:165
-#: stock/serializers.py:774 stock/serializers.py:1307
+#: stock/serializers.py:774 stock/serializers.py:1313
#: stock/templates/stock/item_base.html:427
#: templates/js/translated/barcode.js:252 templates/js/translated/build.js:2189
#: templates/js/translated/purchase_order.js:1308
@@ -1602,7 +1602,7 @@ msgstr ""
msgid "bom_item.part must point to the same part as the build order"
msgstr ""
-#: build/serializers.py:817 stock/serializers.py:1032
+#: build/serializers.py:817 stock/serializers.py:1038
msgid "Item must be in stock"
msgstr ""
@@ -1659,44 +1659,45 @@ msgstr ""
msgid "Allocate optional BOM items to build order"
msgstr ""
-#: build/serializers.py:1096 part/models.py:3895 part/models.py:4331
+#: build/serializers.py:1097 part/models.py:3895 part/models.py:4331
#: stock/api.py:745
msgid "BOM Item"
msgstr ""
-#: build/serializers.py:1105 templates/js/translated/index.js:130
+#: build/serializers.py:1106 templates/js/translated/index.js:130
msgid "Allocated Stock"
msgstr ""
-#: build/serializers.py:1110 part/admin.py:132 part/bom.py:173
-#: part/serializers.py:1441 part/templates/part/part_base.html:210
-#: templates/js/translated/bom.js:1202 templates/js/translated/build.js:2614
-#: templates/js/translated/part.js:709 templates/js/translated/part.js:2148
+#: build/serializers.py:1111 part/admin.py:132 part/bom.py:173
+#: part/serializers.py:798 part/serializers.py:1460
+#: part/templates/part/part_base.html:210 templates/js/translated/bom.js:1208
+#: templates/js/translated/build.js:2614 templates/js/translated/part.js:709
+#: templates/js/translated/part.js:2148
#: templates/js/translated/table_filters.js:170
msgid "On Order"
msgstr ""
-#: build/serializers.py:1115 part/serializers.py:1443
+#: build/serializers.py:1116 part/serializers.py:1462
#: templates/js/translated/build.js:2618
#: templates/js/translated/table_filters.js:360
msgid "In Production"
msgstr ""
-#: build/serializers.py:1120 part/bom.py:172 part/serializers.py:1454
+#: build/serializers.py:1121 part/bom.py:172 part/serializers.py:1473
#: part/templates/part/part_base.html:192
#: templates/js/translated/sales_order.js:1893
msgid "Available Stock"
msgstr ""
-#: build/tasks.py:149
+#: build/tasks.py:171
msgid "Stock required for build order"
msgstr ""
-#: build/tasks.py:166
+#: build/tasks.py:188
msgid "Overdue Build Order"
msgstr ""
-#: build/tasks.py:171
+#: build/tasks.py:193
#, python-brace-format
msgid "Build order {bo} is now overdue"
msgstr ""
@@ -1990,27 +1991,31 @@ msgstr ""
msgid "Order Parts"
msgstr ""
-#: build/templates/build/detail.html:210
-msgid "Incomplete Build Outputs"
-msgstr ""
-
-#: build/templates/build/detail.html:214
-msgid "Create new build output"
+#: build/templates/build/detail.html:205
+msgid "Available stock has been filtered based on specified source location for this build order"
msgstr ""
#: build/templates/build/detail.html:215
+msgid "Incomplete Build Outputs"
+msgstr ""
+
+#: build/templates/build/detail.html:219
+msgid "Create new build output"
+msgstr ""
+
+#: build/templates/build/detail.html:220
msgid "New Build Output"
msgstr ""
-#: build/templates/build/detail.html:232 build/templates/build/sidebar.html:15
+#: build/templates/build/detail.html:237 build/templates/build/sidebar.html:15
msgid "Consumed Stock"
msgstr ""
-#: build/templates/build/detail.html:244
+#: build/templates/build/detail.html:249
msgid "Completed Build Outputs"
msgstr ""
-#: build/templates/build/detail.html:256 build/templates/build/sidebar.html:19
+#: build/templates/build/detail.html:261 build/templates/build/sidebar.html:19
#: company/templates/company/detail.html:229
#: company/templates/company/manufacturer_part.html:141
#: company/templates/company/manufacturer_part_sidebar.html:9
@@ -2026,15 +2031,15 @@ msgstr ""
msgid "Attachments"
msgstr ""
-#: build/templates/build/detail.html:271
+#: build/templates/build/detail.html:276
msgid "Build Notes"
msgstr ""
-#: build/templates/build/detail.html:426
+#: build/templates/build/detail.html:434
msgid "Allocation Complete"
msgstr ""
-#: build/templates/build/detail.html:427
+#: build/templates/build/detail.html:435
msgid "All lines have been fully allocated"
msgstr ""
@@ -2436,7 +2441,7 @@ msgid "Parts are templates by default"
msgstr ""
#: common/models.py:1456 part/admin.py:91 part/admin.py:431 part/models.py:1015
-#: templates/js/translated/bom.js:1633
+#: templates/js/translated/bom.js:1639
#: templates/js/translated/table_filters.js:330
#: templates/js/translated/table_filters.js:721
msgid "Assembly"
@@ -3495,7 +3500,7 @@ msgstr ""
msgid "Price break quantity"
msgstr ""
-#: common/models.py:2440 company/serializers.py:484 order/admin.py:42
+#: common/models.py:2440 company/serializers.py:486 order/admin.py:42
#: order/models.py:1321 order/models.py:2226
#: templates/js/translated/company.js:1813 templates/js/translated/part.js:1885
#: templates/js/translated/pricing.js:621
@@ -3972,7 +3977,7 @@ msgstr ""
#: company/models.py:495 company/templates/company/company_base.html:76
#: company/templates/company/manufacturer_part.html:90
-#: company/templates/company/supplier_part.html:145 part/serializers.py:497
+#: company/templates/company/supplier_part.html:145 part/serializers.py:505
#: stock/templates/stock/item_base.html:207
#: templates/js/translated/company.js:506
#: templates/js/translated/company.js:1108
@@ -3987,7 +3992,7 @@ msgid "Select manufacturer"
msgstr ""
#: company/models.py:502 company/templates/company/manufacturer_part.html:101
-#: company/templates/company/supplier_part.html:153 part/serializers.py:507
+#: company/templates/company/supplier_part.html:153 part/serializers.py:515
#: templates/js/translated/company.js:351
#: templates/js/translated/company.js:1107
#: templates/js/translated/company.js:1302
@@ -4059,7 +4064,7 @@ msgstr ""
#: company/models.py:795 company/templates/company/company_base.html:81
#: company/templates/company/supplier_part.html:129 order/models.py:453
#: order/templates/order/order_base.html:136 part/bom.py:272 part/bom.py:310
-#: part/serializers.py:481 plugin/builtin/suppliers/digikey.py:25
+#: part/serializers.py:489 plugin/builtin/suppliers/digikey.py:25
#: plugin/builtin/suppliers/lcsc.py:26 plugin/builtin/suppliers/mouser.py:24
#: plugin/builtin/suppliers/tme.py:26 stock/templates/stock/item_base.html:224
#: templates/email/overdue_purchase_order.html:16
@@ -4076,7 +4081,7 @@ msgstr ""
msgid "Select supplier"
msgstr ""
-#: company/models.py:802 part/serializers.py:492
+#: company/models.py:802 part/serializers.py:500
msgid "Supplier stock keeping unit"
msgstr ""
@@ -4112,7 +4117,7 @@ msgid "Minimum charge (e.g. stocking fee)"
msgstr ""
#: company/models.py:851 company/templates/company/supplier_part.html:160
-#: stock/admin.py:224 stock/models.py:785 stock/serializers.py:1317
+#: stock/admin.py:224 stock/models.py:785 stock/serializers.py:1323
#: stock/templates/stock/item_base.html:240
#: templates/js/translated/company.js:1636
#: templates/js/translated/stock.js:2387
@@ -4157,7 +4162,7 @@ msgstr ""
msgid "Date of last update of availability data"
msgstr ""
-#: company/serializers.py:153
+#: company/serializers.py:155
msgid "Default currency used for this supplier"
msgstr ""
@@ -4218,7 +4223,7 @@ msgstr ""
#: company/templates/company/company_base.html:86 order/models.py:898
#: order/models.py:1993 order/templates/order/return_order_base.html:131
#: order/templates/order/sales_order_base.html:144 stock/models.py:807
-#: stock/models.py:808 stock/serializers.py:1067
+#: stock/models.py:808 stock/serializers.py:1073
#: stock/templates/stock/item_base.html:405
#: templates/email/overdue_sales_order.html:16
#: templates/js/translated/company.js:502
@@ -4429,8 +4434,9 @@ msgstr ""
#: company/templates/company/manufacturer_part.html:119
#: company/templates/company/supplier_part.html:15 company/views.py:31
-#: part/admin.py:122 part/templates/part/part_sidebar.html:33
-#: templates/InvenTree/search.html:190 templates/navbar.html:48
+#: part/admin.py:122 part/serializers.py:802
+#: part/templates/part/part_sidebar.html:33 templates/InvenTree/search.html:190
+#: templates/navbar.html:48
msgid "Suppliers"
msgstr ""
@@ -4528,7 +4534,7 @@ msgid "No supplier information available"
msgstr ""
#: company/templates/company/supplier_part.html:139 part/bom.py:279
-#: part/bom.py:311 part/serializers.py:491
+#: part/bom.py:311 part/serializers.py:499
#: templates/js/translated/company.js:349 templates/js/translated/part.js:1786
#: templates/js/translated/pricing.js:510
#: templates/js/translated/purchase_order.js:1851
@@ -4577,10 +4583,12 @@ msgstr ""
msgid "Update Part Availability"
msgstr ""
-#: company/templates/company/supplier_part_sidebar.html:5 part/stocktake.py:223
+#: company/templates/company/supplier_part_sidebar.html:5
+#: part/serializers.py:801 part/stocktake.py:223
#: part/templates/part/category.html:183
#: part/templates/part/category_sidebar.html:17 stock/admin.py:69
-#: stock/serializers.py:760 stock/templates/stock/location.html:170
+#: stock/serializers.py:760 stock/serializers.py:924
+#: stock/templates/stock/location.html:170
#: stock/templates/stock/location.html:184
#: stock/templates/stock/location.html:196
#: stock/templates/stock/location_sidebar.html:7
@@ -4640,7 +4648,7 @@ msgid "Label template file"
msgstr ""
#: label/models.py:143 part/models.py:3484 report/models.py:322
-#: templates/js/translated/part.js:2891
+#: templates/js/translated/part.js:2900
#: templates/js/translated/table_filters.js:481
msgid "Enabled"
msgstr ""
@@ -5733,7 +5741,7 @@ msgid "Pending Shipments"
msgstr ""
#: order/templates/order/sales_order_detail.html:71
-#: templates/js/translated/bom.js:1271 templates/js/translated/filters.js:296
+#: templates/js/translated/bom.js:1277 templates/js/translated/filters.js:296
msgid "Actions"
msgstr ""
@@ -5861,10 +5869,10 @@ msgstr ""
msgid "Category Path"
msgstr ""
-#: part/admin.py:323 part/models.py:390 part/serializers.py:259
-#: part/serializers.py:373 part/templates/part/cat_link.html:3
-#: part/templates/part/category.html:23 part/templates/part/category.html:141
-#: part/templates/part/category.html:161
+#: part/admin.py:323 part/models.py:390 part/serializers.py:112
+#: part/serializers.py:265 part/serializers.py:381
+#: part/templates/part/cat_link.html:3 part/templates/part/category.html:23
+#: part/templates/part/category.html:141 part/templates/part/category.html:161
#: part/templates/part/category_sidebar.html:9
#: templates/InvenTree/index.html:36 templates/InvenTree/search.html:84
#: templates/InvenTree/settings/sidebar.html:47
@@ -5889,13 +5897,13 @@ msgstr ""
msgid "Part IPN"
msgstr ""
-#: part/admin.py:421 part/serializers.py:1220
+#: part/admin.py:421 part/serializers.py:1238
#: templates/js/translated/pricing.js:358
#: templates/js/translated/pricing.js:1024
msgid "Minimum Price"
msgstr ""
-#: part/admin.py:426 part/serializers.py:1235
+#: part/admin.py:426 part/serializers.py:1253
#: templates/js/translated/pricing.js:353
#: templates/js/translated/pricing.js:1032
msgid "Maximum Price"
@@ -5974,7 +5982,7 @@ msgid "This option must be selected"
msgstr ""
#: part/api.py:1541 part/models.py:895 part/models.py:3385 part/models.py:3831
-#: part/serializers.py:388 part/serializers.py:1076
+#: part/serializers.py:396 part/serializers.py:1094
#: part/templates/part/part_base.html:260 stock/api.py:733
#: templates/InvenTree/settings/settings_staff_js.html:300
#: templates/js/translated/notification.js:60
@@ -5982,12 +5990,17 @@ msgstr ""
msgid "Category"
msgstr ""
+#: part/api.py:1828
+msgid "Uses"
+msgstr ""
+
#: part/bom.py:170 part/models.py:100 part/models.py:938
#: part/templates/part/category.html:116 part/templates/part/part_base.html:367
msgid "Default Location"
msgstr ""
-#: part/bom.py:171 templates/email/low_stock_notification.html:16
+#: part/bom.py:171 part/serializers.py:803
+#: templates/email/low_stock_notification.html:16
msgid "Total Stock"
msgstr ""
@@ -6010,7 +6023,8 @@ msgstr ""
msgid "Default location for parts in this category"
msgstr ""
-#: part/models.py:106 stock/models.py:165 templates/js/translated/stock.js:2736
+#: part/models.py:106 stock/models.py:165 templates/js/translated/part.js:2810
+#: templates/js/translated/stock.js:2736
#: templates/js/translated/table_filters.js:239
#: templates/js/translated/table_filters.js:283
msgid "Structural"
@@ -6418,7 +6432,7 @@ msgstr ""
msgid "Test with this name already exists for this part"
msgstr ""
-#: part/models.py:3464 templates/js/translated/part.js:2870
+#: part/models.py:3464 templates/js/translated/part.js:2879
msgid "Test Name"
msgstr ""
@@ -6446,7 +6460,7 @@ msgstr ""
msgid "Is this test enabled?"
msgstr ""
-#: part/models.py:3489 templates/js/translated/part.js:2899
+#: part/models.py:3489 templates/js/translated/part.js:2908
#: templates/js/translated/table_filters.js:477
msgid "Required"
msgstr ""
@@ -6455,7 +6469,7 @@ msgstr ""
msgid "Is this test required to pass?"
msgstr ""
-#: part/models.py:3495 templates/js/translated/part.js:2907
+#: part/models.py:3495 templates/js/translated/part.js:2916
msgid "Requires Value"
msgstr ""
@@ -6463,7 +6477,7 @@ msgstr ""
msgid "Does this test require a value when adding a test result?"
msgstr ""
-#: part/models.py:3501 templates/js/translated/part.js:2914
+#: part/models.py:3501 templates/js/translated/part.js:2923
msgid "Requires Attachment"
msgstr ""
@@ -6685,311 +6699,323 @@ msgstr ""
msgid "Duplicate relationship already exists"
msgstr ""
-#: part/serializers.py:128 part/templates/part/category.html:122
-#: part/templates/part/category.html:207
+#: part/serializers.py:114 part/serializers.py:134
+#: part/templates/part/category.html:122 part/templates/part/category.html:207
#: part/templates/part/category_sidebar.html:7
msgid "Subcategories"
msgstr ""
-#: part/serializers.py:172
+#: part/serializers.py:178
msgid "Results"
msgstr ""
-#: part/serializers.py:173
+#: part/serializers.py:179
msgid "Number of results recorded against this template"
msgstr ""
-#: part/serializers.py:197 part/serializers.py:215 stock/serializers.py:384
+#: part/serializers.py:203 part/serializers.py:221 stock/serializers.py:384
msgid "Purchase currency of this stock item"
msgstr ""
-#: part/serializers.py:260
+#: part/serializers.py:266
msgid "Number of parts using this template"
msgstr ""
-#: part/serializers.py:379
+#: part/serializers.py:387
msgid "No parts selected"
msgstr ""
-#: part/serializers.py:389
+#: part/serializers.py:397
msgid "Select category"
msgstr ""
-#: part/serializers.py:419
+#: part/serializers.py:427
msgid "Original Part"
msgstr ""
-#: part/serializers.py:420
+#: part/serializers.py:428
msgid "Select original part to duplicate"
msgstr ""
-#: part/serializers.py:425
+#: part/serializers.py:433
msgid "Copy Image"
msgstr ""
-#: part/serializers.py:426
+#: part/serializers.py:434
msgid "Copy image from original part"
msgstr ""
-#: part/serializers.py:432 part/templates/part/detail.html:277
+#: part/serializers.py:440 part/templates/part/detail.html:277
msgid "Copy BOM"
msgstr ""
-#: part/serializers.py:433
+#: part/serializers.py:441
msgid "Copy bill of materials from original part"
msgstr ""
-#: part/serializers.py:439
+#: part/serializers.py:447
msgid "Copy Parameters"
msgstr ""
-#: part/serializers.py:440
+#: part/serializers.py:448
msgid "Copy parameter data from original part"
msgstr ""
-#: part/serializers.py:446
+#: part/serializers.py:454
msgid "Copy Notes"
msgstr ""
-#: part/serializers.py:447
+#: part/serializers.py:455
msgid "Copy notes from original part"
msgstr ""
-#: part/serializers.py:460
+#: part/serializers.py:468
msgid "Initial Stock Quantity"
msgstr ""
-#: part/serializers.py:462
+#: part/serializers.py:470
msgid "Specify initial stock quantity for this Part. If quantity is zero, no stock is added."
msgstr ""
-#: part/serializers.py:469
+#: part/serializers.py:477
msgid "Initial Stock Location"
msgstr ""
-#: part/serializers.py:470
+#: part/serializers.py:478
msgid "Specify initial stock location for this Part"
msgstr ""
-#: part/serializers.py:482
+#: part/serializers.py:490
msgid "Select supplier (or leave blank to skip)"
msgstr ""
-#: part/serializers.py:498
+#: part/serializers.py:506
msgid "Select manufacturer (or leave blank to skip)"
msgstr ""
-#: part/serializers.py:508
+#: part/serializers.py:516
msgid "Manufacturer part number"
msgstr ""
-#: part/serializers.py:515
+#: part/serializers.py:523
msgid "Selected company is not a valid supplier"
msgstr ""
-#: part/serializers.py:524
+#: part/serializers.py:532
msgid "Selected company is not a valid manufacturer"
msgstr ""
-#: part/serializers.py:535
+#: part/serializers.py:543
msgid "Manufacturer part matching this MPN already exists"
msgstr ""
-#: part/serializers.py:542
+#: part/serializers.py:550
msgid "Supplier part matching this SKU already exists"
msgstr ""
-#: part/serializers.py:815 part/templates/part/copy_part.html:9
+#: part/serializers.py:804
+msgid "External Stock"
+msgstr ""
+
+#: part/serializers.py:806
+msgid "Unallocated Stock"
+msgstr ""
+
+#: part/serializers.py:808
+msgid "Variant Stock"
+msgstr ""
+
+#: part/serializers.py:833 part/templates/part/copy_part.html:9
#: templates/js/translated/part.js:471
msgid "Duplicate Part"
msgstr ""
-#: part/serializers.py:816
+#: part/serializers.py:834
msgid "Copy initial data from another Part"
msgstr ""
-#: part/serializers.py:822 templates/js/translated/part.js:102
+#: part/serializers.py:840 templates/js/translated/part.js:102
msgid "Initial Stock"
msgstr ""
-#: part/serializers.py:823
+#: part/serializers.py:841
msgid "Create Part with initial stock quantity"
msgstr ""
-#: part/serializers.py:829
+#: part/serializers.py:847
msgid "Supplier Information"
msgstr ""
-#: part/serializers.py:830
+#: part/serializers.py:848
msgid "Add initial supplier information for this part"
msgstr ""
-#: part/serializers.py:838
+#: part/serializers.py:856
msgid "Copy Category Parameters"
msgstr ""
-#: part/serializers.py:839
+#: part/serializers.py:857
msgid "Copy parameter templates from selected part category"
msgstr ""
-#: part/serializers.py:844
+#: part/serializers.py:862
msgid "Existing Image"
msgstr ""
-#: part/serializers.py:845
+#: part/serializers.py:863
msgid "Filename of an existing part image"
msgstr ""
-#: part/serializers.py:862
+#: part/serializers.py:880
msgid "Image file does not exist"
msgstr ""
-#: part/serializers.py:1068
+#: part/serializers.py:1086
msgid "Limit stocktake report to a particular part, and any variant parts"
msgstr ""
-#: part/serializers.py:1078
+#: part/serializers.py:1096
msgid "Limit stocktake report to a particular part category, and any child categories"
msgstr ""
-#: part/serializers.py:1088
+#: part/serializers.py:1106
msgid "Limit stocktake report to a particular stock location, and any child locations"
msgstr ""
-#: part/serializers.py:1094
+#: part/serializers.py:1112
msgid "Exclude External Stock"
msgstr ""
-#: part/serializers.py:1095
+#: part/serializers.py:1113
msgid "Exclude stock items in external locations"
msgstr ""
-#: part/serializers.py:1100
+#: part/serializers.py:1118
msgid "Generate Report"
msgstr ""
-#: part/serializers.py:1101
+#: part/serializers.py:1119
msgid "Generate report file containing calculated stocktake data"
msgstr ""
-#: part/serializers.py:1106
+#: part/serializers.py:1124
msgid "Update Parts"
msgstr ""
-#: part/serializers.py:1107
+#: part/serializers.py:1125
msgid "Update specified parts with calculated stocktake data"
msgstr ""
-#: part/serializers.py:1115
+#: part/serializers.py:1133
msgid "Stocktake functionality is not enabled"
msgstr ""
-#: part/serializers.py:1221
+#: part/serializers.py:1239
msgid "Override calculated value for minimum price"
msgstr ""
-#: part/serializers.py:1228
+#: part/serializers.py:1246
msgid "Minimum price currency"
msgstr ""
-#: part/serializers.py:1236
+#: part/serializers.py:1254
msgid "Override calculated value for maximum price"
msgstr ""
-#: part/serializers.py:1243
+#: part/serializers.py:1261
msgid "Maximum price currency"
msgstr ""
-#: part/serializers.py:1272
+#: part/serializers.py:1290
msgid "Update"
msgstr ""
-#: part/serializers.py:1273
+#: part/serializers.py:1291
msgid "Update pricing for this part"
msgstr ""
-#: part/serializers.py:1296
+#: part/serializers.py:1314
#, python-brace-format
msgid "Could not convert from provided currencies to {default_currency}"
msgstr ""
-#: part/serializers.py:1303
+#: part/serializers.py:1321
msgid "Minimum price must not be greater than maximum price"
msgstr ""
-#: part/serializers.py:1306
+#: part/serializers.py:1324
msgid "Maximum price must not be less than minimum price"
msgstr ""
-#: part/serializers.py:1632
+#: part/serializers.py:1660
msgid "Select part to copy BOM from"
msgstr ""
-#: part/serializers.py:1640
+#: part/serializers.py:1668
msgid "Remove Existing Data"
msgstr ""
-#: part/serializers.py:1641
+#: part/serializers.py:1669
msgid "Remove existing BOM items before copying"
msgstr ""
-#: part/serializers.py:1646
+#: part/serializers.py:1674
msgid "Include Inherited"
msgstr ""
-#: part/serializers.py:1647
+#: part/serializers.py:1675
msgid "Include BOM items which are inherited from templated parts"
msgstr ""
-#: part/serializers.py:1652
+#: part/serializers.py:1680
msgid "Skip Invalid Rows"
msgstr ""
-#: part/serializers.py:1653
+#: part/serializers.py:1681
msgid "Enable this option to skip invalid rows"
msgstr ""
-#: part/serializers.py:1658
+#: part/serializers.py:1686
msgid "Copy Substitute Parts"
msgstr ""
-#: part/serializers.py:1659
+#: part/serializers.py:1687
msgid "Copy substitute parts when duplicate BOM items"
msgstr ""
-#: part/serializers.py:1693
+#: part/serializers.py:1721
msgid "Clear Existing BOM"
msgstr ""
-#: part/serializers.py:1694
+#: part/serializers.py:1722
msgid "Delete existing BOM items before uploading"
msgstr ""
-#: part/serializers.py:1724
+#: part/serializers.py:1752
msgid "No part column specified"
msgstr ""
-#: part/serializers.py:1768
+#: part/serializers.py:1796
msgid "Multiple matching parts found"
msgstr ""
-#: part/serializers.py:1771
+#: part/serializers.py:1799
msgid "No matching part found"
msgstr ""
-#: part/serializers.py:1774
+#: part/serializers.py:1802
msgid "Part is not designated as a component"
msgstr ""
-#: part/serializers.py:1783
+#: part/serializers.py:1811
msgid "Quantity not provided"
msgstr ""
-#: part/serializers.py:1791
+#: part/serializers.py:1819
msgid "Invalid quantity"
msgstr ""
-#: part/serializers.py:1812
+#: part/serializers.py:1840
msgid "At least one BOM item is required"
msgstr ""
@@ -7221,7 +7247,7 @@ msgid "Validate BOM"
msgstr ""
#: part/templates/part/detail.html:283 part/templates/part/detail.html:284
-#: templates/js/translated/bom.js:1314 templates/js/translated/bom.js:1315
+#: templates/js/translated/bom.js:1320 templates/js/translated/bom.js:1321
msgid "Add BOM Item"
msgstr ""
@@ -7405,7 +7431,7 @@ msgstr ""
msgid "Allocated to Sales Orders"
msgstr ""
-#: part/templates/part/part_base.html:235 templates/js/translated/bom.js:1213
+#: part/templates/part/part_base.html:235 templates/js/translated/bom.js:1219
msgid "Can Build"
msgstr ""
@@ -8784,7 +8810,7 @@ msgstr ""
msgid "Where is this stock item located?"
msgstr ""
-#: stock/models.py:786 stock/serializers.py:1318
+#: stock/models.py:786 stock/serializers.py:1324
msgid "Packaging this stock item is stored in"
msgstr ""
@@ -8796,7 +8822,7 @@ msgstr ""
msgid "Serial number for this item"
msgstr ""
-#: stock/models.py:830 stock/serializers.py:1301
+#: stock/models.py:830 stock/serializers.py:1307
msgid "Batch code for this stock item"
msgstr ""
@@ -8905,7 +8931,7 @@ msgstr ""
msgid "Serialized stock cannot be merged"
msgstr ""
-#: stock/models.py:1639 stock/serializers.py:1207
+#: stock/models.py:1639 stock/serializers.py:1213
msgid "Duplicate stock items"
msgstr ""
@@ -8986,7 +9012,7 @@ msgstr ""
msgid "Enter serial numbers for new items"
msgstr ""
-#: stock/serializers.py:473 stock/serializers.py:1164 stock/serializers.py:1420
+#: stock/serializers.py:473 stock/serializers.py:1170 stock/serializers.py:1426
msgid "Destination stock location"
msgstr ""
@@ -9059,77 +9085,78 @@ msgstr ""
msgid "No stock items selected"
msgstr ""
-#: stock/serializers.py:863 stock/templates/stock/location.html:165
+#: stock/serializers.py:863 stock/serializers.py:926
+#: stock/templates/stock/location.html:165
#: stock/templates/stock/location.html:213
#: stock/templates/stock/location_sidebar.html:5
msgid "Sublocations"
msgstr ""
-#: stock/serializers.py:1036
+#: stock/serializers.py:1042
msgid "Part must be salable"
msgstr ""
-#: stock/serializers.py:1040
+#: stock/serializers.py:1046
msgid "Item is allocated to a sales order"
msgstr ""
-#: stock/serializers.py:1044
+#: stock/serializers.py:1050
msgid "Item is allocated to a build order"
msgstr ""
-#: stock/serializers.py:1068
+#: stock/serializers.py:1074
msgid "Customer to assign stock items"
msgstr ""
-#: stock/serializers.py:1074
+#: stock/serializers.py:1080
msgid "Selected company is not a customer"
msgstr ""
-#: stock/serializers.py:1082
+#: stock/serializers.py:1088
msgid "Stock assignment notes"
msgstr ""
-#: stock/serializers.py:1092 stock/serializers.py:1346
+#: stock/serializers.py:1098 stock/serializers.py:1352
msgid "A list of stock items must be provided"
msgstr ""
-#: stock/serializers.py:1171
+#: stock/serializers.py:1177
msgid "Stock merging notes"
msgstr ""
-#: stock/serializers.py:1176
+#: stock/serializers.py:1182
msgid "Allow mismatched suppliers"
msgstr ""
-#: stock/serializers.py:1177
+#: stock/serializers.py:1183
msgid "Allow stock items with different supplier parts to be merged"
msgstr ""
-#: stock/serializers.py:1182
+#: stock/serializers.py:1188
msgid "Allow mismatched status"
msgstr ""
-#: stock/serializers.py:1183
+#: stock/serializers.py:1189
msgid "Allow stock items with different status codes to be merged"
msgstr ""
-#: stock/serializers.py:1193
+#: stock/serializers.py:1199
msgid "At least two stock items must be provided"
msgstr ""
-#: stock/serializers.py:1260
+#: stock/serializers.py:1266
msgid "No Change"
msgstr ""
-#: stock/serializers.py:1289
+#: stock/serializers.py:1295
msgid "StockItem primary key value"
msgstr ""
-#: stock/serializers.py:1308
+#: stock/serializers.py:1314
msgid "Stock item status code"
msgstr ""
-#: stock/serializers.py:1336
+#: stock/serializers.py:1342
msgid "Stock transaction notes"
msgstr ""
@@ -10662,7 +10689,7 @@ msgid "The following parts are low on required stock"
msgstr ""
#: templates/email/build_order_required_stock.html:18
-#: templates/js/translated/bom.js:1668 templates/js/translated/build.js:2557
+#: templates/js/translated/bom.js:1674 templates/js/translated/build.js:2557
msgid "Required Quantity"
msgstr ""
@@ -10676,7 +10703,7 @@ msgid "Click on the following link to view this part"
msgstr ""
#: templates/email/low_stock_notification.html:18
-#: templates/js/translated/part.js:3209
+#: templates/js/translated/part.js:3218
msgid "Minimum Quantity"
msgstr ""
@@ -11051,62 +11078,66 @@ msgstr ""
msgid "No pricing available"
msgstr ""
-#: templates/js/translated/bom.js:1182 templates/js/translated/build.js:2596
+#: templates/js/translated/bom.js:1184 templates/js/translated/build.js:2622
+msgid "External stock"
+msgstr ""
+
+#: templates/js/translated/bom.js:1188 templates/js/translated/build.js:2596
#: templates/js/translated/sales_order.js:1910
msgid "No Stock Available"
msgstr ""
-#: templates/js/translated/bom.js:1187 templates/js/translated/build.js:2600
+#: templates/js/translated/bom.js:1193 templates/js/translated/build.js:2600
msgid "Includes variant and substitute stock"
msgstr ""
-#: templates/js/translated/bom.js:1189 templates/js/translated/build.js:2602
+#: templates/js/translated/bom.js:1195 templates/js/translated/build.js:2602
#: templates/js/translated/part.js:1256
#: templates/js/translated/sales_order.js:1907
msgid "Includes variant stock"
msgstr ""
-#: templates/js/translated/bom.js:1191 templates/js/translated/build.js:2604
+#: templates/js/translated/bom.js:1197 templates/js/translated/build.js:2604
msgid "Includes substitute stock"
msgstr ""
-#: templates/js/translated/bom.js:1219 templates/js/translated/build.js:2587
+#: templates/js/translated/bom.js:1225 templates/js/translated/build.js:2587
msgid "Consumable item"
msgstr ""
-#: templates/js/translated/bom.js:1279
+#: templates/js/translated/bom.js:1285
msgid "Validate BOM Item"
msgstr ""
-#: templates/js/translated/bom.js:1281
+#: templates/js/translated/bom.js:1287
msgid "This line has been validated"
msgstr ""
-#: templates/js/translated/bom.js:1283
+#: templates/js/translated/bom.js:1289
msgid "Edit substitute parts"
msgstr ""
-#: templates/js/translated/bom.js:1285 templates/js/translated/bom.js:1480
+#: templates/js/translated/bom.js:1291 templates/js/translated/bom.js:1486
msgid "Edit BOM Item"
msgstr ""
-#: templates/js/translated/bom.js:1287
+#: templates/js/translated/bom.js:1293
msgid "Delete BOM Item"
msgstr ""
-#: templates/js/translated/bom.js:1307
+#: templates/js/translated/bom.js:1313
msgid "View BOM"
msgstr ""
-#: templates/js/translated/bom.js:1391
+#: templates/js/translated/bom.js:1397
msgid "No BOM items found"
msgstr ""
-#: templates/js/translated/bom.js:1651 templates/js/translated/build.js:2486
+#: templates/js/translated/bom.js:1657 templates/js/translated/build.js:2486
msgid "Required Part"
msgstr ""
-#: templates/js/translated/bom.js:1677
+#: templates/js/translated/bom.js:1683
msgid "Inherited from parent BOM"
msgstr ""
@@ -11449,29 +11480,29 @@ msgstr ""
msgid "Sufficient stock available"
msgstr ""
-#: templates/js/translated/build.js:2643
+#: templates/js/translated/build.js:2647
msgid "Consumable Item"
msgstr ""
-#: templates/js/translated/build.js:2648
+#: templates/js/translated/build.js:2652
msgid "Tracked item"
msgstr ""
-#: templates/js/translated/build.js:2655
+#: templates/js/translated/build.js:2659
#: templates/js/translated/sales_order.js:2016
msgid "Build stock"
msgstr ""
-#: templates/js/translated/build.js:2660 templates/js/translated/stock.js:1829
+#: templates/js/translated/build.js:2664 templates/js/translated/stock.js:1829
msgid "Order stock"
msgstr ""
-#: templates/js/translated/build.js:2664
+#: templates/js/translated/build.js:2668
#: templates/js/translated/sales_order.js:2010
msgid "Allocate stock"
msgstr ""
-#: templates/js/translated/build.js:2668
+#: templates/js/translated/build.js:2672
msgid "Remove stock allocation"
msgstr ""
@@ -12313,64 +12344,64 @@ msgstr ""
msgid "Subscribed category"
msgstr ""
-#: templates/js/translated/part.js:2855
+#: templates/js/translated/part.js:2864
msgid "No test templates matching query"
msgstr ""
-#: templates/js/translated/part.js:2877 templates/js/translated/search.js:342
+#: templates/js/translated/part.js:2886 templates/js/translated/search.js:342
msgid "results"
msgstr ""
-#: templates/js/translated/part.js:2927 templates/js/translated/stock.js:1446
+#: templates/js/translated/part.js:2936 templates/js/translated/stock.js:1446
msgid "Edit test result"
msgstr ""
-#: templates/js/translated/part.js:2928 templates/js/translated/stock.js:1447
+#: templates/js/translated/part.js:2937 templates/js/translated/stock.js:1447
#: templates/js/translated/stock.js:1692
msgid "Delete test result"
msgstr ""
-#: templates/js/translated/part.js:2932
+#: templates/js/translated/part.js:2941
msgid "This test is defined for a parent part"
msgstr ""
-#: templates/js/translated/part.js:2948
+#: templates/js/translated/part.js:2957
msgid "Edit Test Result Template"
msgstr ""
-#: templates/js/translated/part.js:2962
+#: templates/js/translated/part.js:2971
msgid "Delete Test Result Template"
msgstr ""
-#: templates/js/translated/part.js:3041 templates/js/translated/part.js:3042
+#: templates/js/translated/part.js:3050 templates/js/translated/part.js:3051
msgid "No date specified"
msgstr ""
-#: templates/js/translated/part.js:3044
+#: templates/js/translated/part.js:3053
msgid "Specified date is in the past"
msgstr ""
-#: templates/js/translated/part.js:3050
+#: templates/js/translated/part.js:3059
msgid "Speculative"
msgstr ""
-#: templates/js/translated/part.js:3100
+#: templates/js/translated/part.js:3109
msgid "No scheduling information available for this part"
msgstr ""
-#: templates/js/translated/part.js:3106
+#: templates/js/translated/part.js:3115
msgid "Error fetching scheduling information for this part"
msgstr ""
-#: templates/js/translated/part.js:3202
+#: templates/js/translated/part.js:3211
msgid "Scheduled Stock Quantities"
msgstr ""
-#: templates/js/translated/part.js:3218
+#: templates/js/translated/part.js:3227
msgid "Maximum Quantity"
msgstr ""
-#: templates/js/translated/part.js:3263
+#: templates/js/translated/part.js:3272
msgid "Minimum Stock Level"
msgstr ""
@@ -14052,4 +14083,3 @@ msgstr ""
#: users/models.py:413
msgid "Permission to delete items"
msgstr ""
-
diff --git a/InvenTree/locale/fi/LC_MESSAGES/django.po b/InvenTree/locale/fi/LC_MESSAGES/django.po
index 99902bc110..1e1a2acb2f 100644
--- a/InvenTree/locale/fi/LC_MESSAGES/django.po
+++ b/InvenTree/locale/fi/LC_MESSAGES/django.po
@@ -2,7 +2,7 @@ msgid ""
msgstr ""
"Project-Id-Version: inventree\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2024-02-28 04:05+0000\n"
+"POT-Creation-Date: 2024-03-05 00:41+0000\n"
"PO-Revision-Date: 2024-02-28 07:23\n"
"Last-Translator: \n"
"Language-Team: Finnish\n"
@@ -66,9 +66,9 @@ msgstr "Anna päivämäärä"
#: report/templates/report/inventree_build_order_base.html:172
#: stock/admin.py:226 stock/models.py:2335 stock/models.py:2451
#: stock/serializers.py:479 stock/serializers.py:632 stock/serializers.py:728
-#: stock/serializers.py:778 stock/serializers.py:1081 stock/serializers.py:1170
-#: stock/serializers.py:1335 stock/templates/stock/stock_sidebar.html:25
-#: templates/js/translated/barcode.js:143 templates/js/translated/bom.js:1259
+#: stock/serializers.py:778 stock/serializers.py:1087 stock/serializers.py:1176
+#: stock/serializers.py:1341 stock/templates/stock/stock_sidebar.html:25
+#: templates/js/translated/barcode.js:143 templates/js/translated/bom.js:1265
#: templates/js/translated/company.js:1674 templates/js/translated/order.js:347
#: templates/js/translated/part.js:1080
#: templates/js/translated/purchase_order.js:2201
@@ -523,7 +523,7 @@ msgstr "Nimi"
#: templates/js/translated/order.js:298 templates/js/translated/part.js:1238
#: templates/js/translated/part.js:1483 templates/js/translated/part.js:1621
#: templates/js/translated/part.js:1958 templates/js/translated/part.js:2355
-#: templates/js/translated/part.js:2785 templates/js/translated/part.js:2887
+#: templates/js/translated/part.js:2785 templates/js/translated/part.js:2896
#: templates/js/translated/plugin.js:80
#: templates/js/translated/purchase_order.js:1707
#: templates/js/translated/purchase_order.js:1850
@@ -678,7 +678,7 @@ msgstr "Kuvatiedoston URL"
msgid "Downloading images from remote URL is not enabled"
msgstr "Kuvien lataaminen ei ole käytössä"
-#: InvenTree/status.py:66 part/serializers.py:1120
+#: InvenTree/status.py:66 part/serializers.py:1138
msgid "Background worker check failed"
msgstr ""
@@ -960,7 +960,7 @@ msgid "Tracked"
msgstr ""
#: build/api.py:285 part/admin.py:144 templates/js/translated/build.js:1741
-#: templates/js/translated/build.js:2626
+#: templates/js/translated/build.js:2630
#: templates/js/translated/sales_order.js:1929
#: templates/js/translated/table_filters.js:571
msgid "Allocated"
@@ -1044,11 +1044,11 @@ msgstr ""
#: build/models.py:199 build/templates/build/build_base.html:97
#: build/templates/build/detail.html:29 company/models.py:1044
#: order/models.py:1389 order/models.py:1532 order/models.py:1533
-#: part/api.py:1528 part/models.py:389 part/models.py:3003 part/models.py:3147
-#: part/models.py:3291 part/models.py:3314 part/models.py:3335
-#: part/models.py:3357 part/models.py:3458 part/models.py:3754
-#: part/models.py:3885 part/models.py:3978 part/models.py:4339
-#: part/serializers.py:1066 part/serializers.py:1631
+#: part/api.py:1528 part/api.py:1820 part/models.py:389 part/models.py:3003
+#: part/models.py:3147 part/models.py:3291 part/models.py:3314
+#: part/models.py:3335 part/models.py:3357 part/models.py:3458
+#: part/models.py:3754 part/models.py:3885 part/models.py:3978
+#: part/models.py:4339 part/serializers.py:1084 part/serializers.py:1659
#: part/templates/part/part_app_base.html:8
#: part/templates/part/part_pricing.html:12
#: part/templates/part/upload_bom.html:52
@@ -1147,7 +1147,7 @@ msgid "Build status code"
msgstr ""
#: build/models.py:264 build/serializers.py:280 order/serializers.py:549
-#: stock/models.py:826 stock/serializers.py:1300
+#: stock/models.py:826 stock/serializers.py:1306
#: templates/js/translated/purchase_order.js:1129
msgid "Batch Code"
msgstr ""
@@ -1242,48 +1242,48 @@ msgstr ""
msgid "Project code for this build order"
msgstr ""
-#: build/models.py:559
+#: build/models.py:575
#, python-brace-format
msgid "Build order {build} has been completed"
msgstr ""
-#: build/models.py:565
+#: build/models.py:581
msgid "A build order has been completed"
msgstr ""
-#: build/models.py:783 build/models.py:858
+#: build/models.py:799 build/models.py:874
msgid "No build output specified"
msgstr ""
-#: build/models.py:786
+#: build/models.py:802
msgid "Build output is already completed"
msgstr ""
-#: build/models.py:789
+#: build/models.py:805
msgid "Build output does not match Build Order"
msgstr ""
-#: build/models.py:862 build/serializers.py:223 build/serializers.py:262
+#: build/models.py:878 build/serializers.py:223 build/serializers.py:262
#: build/serializers.py:831 order/models.py:526 order/serializers.py:401
-#: order/serializers.py:544 part/serializers.py:1423 part/serializers.py:1789
+#: order/serializers.py:544 part/serializers.py:1442 part/serializers.py:1817
#: stock/models.py:665 stock/models.py:1477 stock/serializers.py:450
msgid "Quantity must be greater than zero"
msgstr ""
-#: build/models.py:867 build/serializers.py:228
+#: build/models.py:883 build/serializers.py:228
msgid "Quantity cannot be greater than the output quantity"
msgstr ""
-#: build/models.py:924 build/serializers.py:533
+#: build/models.py:940 build/serializers.py:533
#, python-brace-format
msgid "Build output {serial} has not passed all required tests"
msgstr ""
-#: build/models.py:1286
+#: build/models.py:1302
msgid "Build object"
msgstr ""
-#: build/models.py:1300 build/models.py:1558 build/serializers.py:210
+#: build/models.py:1316 build/models.py:1574 build/serializers.py:210
#: build/serializers.py:247 build/templates/build/build_base.html:102
#: build/templates/build/detail.html:34 common/models.py:2432
#: order/models.py:1247 order/models.py:1902 order/serializers.py:1306
@@ -1310,7 +1310,7 @@ msgstr ""
#: templates/js/translated/company.js:1808
#: templates/js/translated/model_renderers.js:230
#: templates/js/translated/order.js:304 templates/js/translated/part.js:961
-#: templates/js/translated/part.js:1811 templates/js/translated/part.js:3332
+#: templates/js/translated/part.js:1811 templates/js/translated/part.js:3341
#: templates/js/translated/pricing.js:381
#: templates/js/translated/pricing.js:474
#: templates/js/translated/pricing.js:522
@@ -1330,38 +1330,38 @@ msgstr ""
msgid "Quantity"
msgstr "Määrä"
-#: build/models.py:1301
+#: build/models.py:1317
msgid "Required quantity for build order"
msgstr ""
-#: build/models.py:1381
+#: build/models.py:1397
msgid "Build item must specify a build output, as master part is marked as trackable"
msgstr ""
-#: build/models.py:1390
+#: build/models.py:1406
#, python-brace-format
msgid "Allocated quantity ({q}) must not exceed available stock quantity ({a})"
msgstr ""
-#: build/models.py:1400 order/models.py:1853
+#: build/models.py:1416 order/models.py:1853
msgid "Stock item is over-allocated"
msgstr ""
-#: build/models.py:1406 order/models.py:1856
+#: build/models.py:1422 order/models.py:1856
msgid "Allocation quantity must be greater than zero"
msgstr ""
-#: build/models.py:1412
+#: build/models.py:1428
msgid "Quantity must be 1 for serialized stock"
msgstr ""
-#: build/models.py:1473
+#: build/models.py:1489
msgid "Selected stock item does not match BOM line"
msgstr ""
-#: build/models.py:1545 build/serializers.py:811 order/serializers.py:1150
-#: order/serializers.py:1171 stock/serializers.py:544 stock/serializers.py:1019
-#: stock/serializers.py:1131 stock/templates/stock/item_base.html:10
+#: build/models.py:1561 build/serializers.py:811 order/serializers.py:1150
+#: order/serializers.py:1171 stock/serializers.py:544 stock/serializers.py:1025
+#: stock/serializers.py:1137 stock/templates/stock/item_base.html:10
#: stock/templates/stock/item_base.html:23
#: stock/templates/stock/item_base.html:194
#: templates/js/translated/build.js:1742
@@ -1376,19 +1376,19 @@ msgstr ""
msgid "Stock Item"
msgstr "Varastotuote"
-#: build/models.py:1546
+#: build/models.py:1562
msgid "Source stock item"
msgstr ""
-#: build/models.py:1559
+#: build/models.py:1575
msgid "Stock quantity to allocate to build"
msgstr ""
-#: build/models.py:1567
+#: build/models.py:1583
msgid "Install into"
msgstr ""
-#: build/models.py:1568
+#: build/models.py:1584
msgid "Destination stock item"
msgstr ""
@@ -1452,9 +1452,9 @@ msgid "A list of build outputs must be provided"
msgstr ""
#: build/serializers.py:426 build/serializers.py:498 order/serializers.py:533
-#: order/serializers.py:641 order/serializers.py:1646 part/serializers.py:1086
+#: order/serializers.py:641 order/serializers.py:1646 part/serializers.py:1104
#: stock/serializers.py:472 stock/serializers.py:627 stock/serializers.py:723
-#: stock/serializers.py:1163 stock/serializers.py:1419
+#: stock/serializers.py:1169 stock/serializers.py:1425
#: stock/templates/stock/item_base.html:394
#: templates/js/translated/barcode.js:547
#: templates/js/translated/barcode.js:795 templates/js/translated/build.js:999
@@ -1494,7 +1494,7 @@ msgstr ""
#: build/serializers.py:505 build/templates/build/build_base.html:151
#: build/templates/build/detail.html:62 order/models.py:910
#: order/models.py:2005 order/serializers.py:565 stock/admin.py:165
-#: stock/serializers.py:774 stock/serializers.py:1307
+#: stock/serializers.py:774 stock/serializers.py:1313
#: stock/templates/stock/item_base.html:427
#: templates/js/translated/barcode.js:252 templates/js/translated/build.js:2189
#: templates/js/translated/purchase_order.js:1308
@@ -1602,7 +1602,7 @@ msgstr ""
msgid "bom_item.part must point to the same part as the build order"
msgstr ""
-#: build/serializers.py:817 stock/serializers.py:1032
+#: build/serializers.py:817 stock/serializers.py:1038
msgid "Item must be in stock"
msgstr ""
@@ -1659,44 +1659,45 @@ msgstr ""
msgid "Allocate optional BOM items to build order"
msgstr ""
-#: build/serializers.py:1096 part/models.py:3895 part/models.py:4331
+#: build/serializers.py:1097 part/models.py:3895 part/models.py:4331
#: stock/api.py:745
msgid "BOM Item"
msgstr ""
-#: build/serializers.py:1105 templates/js/translated/index.js:130
+#: build/serializers.py:1106 templates/js/translated/index.js:130
msgid "Allocated Stock"
msgstr ""
-#: build/serializers.py:1110 part/admin.py:132 part/bom.py:173
-#: part/serializers.py:1441 part/templates/part/part_base.html:210
-#: templates/js/translated/bom.js:1202 templates/js/translated/build.js:2614
-#: templates/js/translated/part.js:709 templates/js/translated/part.js:2148
+#: build/serializers.py:1111 part/admin.py:132 part/bom.py:173
+#: part/serializers.py:798 part/serializers.py:1460
+#: part/templates/part/part_base.html:210 templates/js/translated/bom.js:1208
+#: templates/js/translated/build.js:2614 templates/js/translated/part.js:709
+#: templates/js/translated/part.js:2148
#: templates/js/translated/table_filters.js:170
msgid "On Order"
msgstr ""
-#: build/serializers.py:1115 part/serializers.py:1443
+#: build/serializers.py:1116 part/serializers.py:1462
#: templates/js/translated/build.js:2618
#: templates/js/translated/table_filters.js:360
msgid "In Production"
msgstr ""
-#: build/serializers.py:1120 part/bom.py:172 part/serializers.py:1454
+#: build/serializers.py:1121 part/bom.py:172 part/serializers.py:1473
#: part/templates/part/part_base.html:192
#: templates/js/translated/sales_order.js:1893
msgid "Available Stock"
msgstr ""
-#: build/tasks.py:149
+#: build/tasks.py:171
msgid "Stock required for build order"
msgstr ""
-#: build/tasks.py:166
+#: build/tasks.py:188
msgid "Overdue Build Order"
msgstr ""
-#: build/tasks.py:171
+#: build/tasks.py:193
#, python-brace-format
msgid "Build order {bo} is now overdue"
msgstr ""
@@ -1990,27 +1991,31 @@ msgstr ""
msgid "Order Parts"
msgstr ""
-#: build/templates/build/detail.html:210
-msgid "Incomplete Build Outputs"
-msgstr ""
-
-#: build/templates/build/detail.html:214
-msgid "Create new build output"
+#: build/templates/build/detail.html:205
+msgid "Available stock has been filtered based on specified source location for this build order"
msgstr ""
#: build/templates/build/detail.html:215
+msgid "Incomplete Build Outputs"
+msgstr ""
+
+#: build/templates/build/detail.html:219
+msgid "Create new build output"
+msgstr ""
+
+#: build/templates/build/detail.html:220
msgid "New Build Output"
msgstr ""
-#: build/templates/build/detail.html:232 build/templates/build/sidebar.html:15
+#: build/templates/build/detail.html:237 build/templates/build/sidebar.html:15
msgid "Consumed Stock"
msgstr ""
-#: build/templates/build/detail.html:244
+#: build/templates/build/detail.html:249
msgid "Completed Build Outputs"
msgstr ""
-#: build/templates/build/detail.html:256 build/templates/build/sidebar.html:19
+#: build/templates/build/detail.html:261 build/templates/build/sidebar.html:19
#: company/templates/company/detail.html:229
#: company/templates/company/manufacturer_part.html:141
#: company/templates/company/manufacturer_part_sidebar.html:9
@@ -2026,15 +2031,15 @@ msgstr ""
msgid "Attachments"
msgstr "Liitteet"
-#: build/templates/build/detail.html:271
+#: build/templates/build/detail.html:276
msgid "Build Notes"
msgstr ""
-#: build/templates/build/detail.html:426
+#: build/templates/build/detail.html:434
msgid "Allocation Complete"
msgstr ""
-#: build/templates/build/detail.html:427
+#: build/templates/build/detail.html:435
msgid "All lines have been fully allocated"
msgstr ""
@@ -2436,7 +2441,7 @@ msgid "Parts are templates by default"
msgstr ""
#: common/models.py:1456 part/admin.py:91 part/admin.py:431 part/models.py:1015
-#: templates/js/translated/bom.js:1633
+#: templates/js/translated/bom.js:1639
#: templates/js/translated/table_filters.js:330
#: templates/js/translated/table_filters.js:721
msgid "Assembly"
@@ -3495,7 +3500,7 @@ msgstr ""
msgid "Price break quantity"
msgstr ""
-#: common/models.py:2440 company/serializers.py:484 order/admin.py:42
+#: common/models.py:2440 company/serializers.py:486 order/admin.py:42
#: order/models.py:1321 order/models.py:2226
#: templates/js/translated/company.js:1813 templates/js/translated/part.js:1885
#: templates/js/translated/pricing.js:621
@@ -3972,7 +3977,7 @@ msgstr ""
#: company/models.py:495 company/templates/company/company_base.html:76
#: company/templates/company/manufacturer_part.html:90
-#: company/templates/company/supplier_part.html:145 part/serializers.py:497
+#: company/templates/company/supplier_part.html:145 part/serializers.py:505
#: stock/templates/stock/item_base.html:207
#: templates/js/translated/company.js:506
#: templates/js/translated/company.js:1108
@@ -3987,7 +3992,7 @@ msgid "Select manufacturer"
msgstr "Valitse valmistaja"
#: company/models.py:502 company/templates/company/manufacturer_part.html:101
-#: company/templates/company/supplier_part.html:153 part/serializers.py:507
+#: company/templates/company/supplier_part.html:153 part/serializers.py:515
#: templates/js/translated/company.js:351
#: templates/js/translated/company.js:1107
#: templates/js/translated/company.js:1302
@@ -4059,7 +4064,7 @@ msgstr ""
#: company/models.py:795 company/templates/company/company_base.html:81
#: company/templates/company/supplier_part.html:129 order/models.py:453
#: order/templates/order/order_base.html:136 part/bom.py:272 part/bom.py:310
-#: part/serializers.py:481 plugin/builtin/suppliers/digikey.py:25
+#: part/serializers.py:489 plugin/builtin/suppliers/digikey.py:25
#: plugin/builtin/suppliers/lcsc.py:26 plugin/builtin/suppliers/mouser.py:24
#: plugin/builtin/suppliers/tme.py:26 stock/templates/stock/item_base.html:224
#: templates/email/overdue_purchase_order.html:16
@@ -4076,7 +4081,7 @@ msgstr "Toimittaja"
msgid "Select supplier"
msgstr "Valitse toimittaja"
-#: company/models.py:802 part/serializers.py:492
+#: company/models.py:802 part/serializers.py:500
msgid "Supplier stock keeping unit"
msgstr "Toimittajan varastonimike"
@@ -4112,7 +4117,7 @@ msgid "Minimum charge (e.g. stocking fee)"
msgstr ""
#: company/models.py:851 company/templates/company/supplier_part.html:160
-#: stock/admin.py:224 stock/models.py:785 stock/serializers.py:1317
+#: stock/admin.py:224 stock/models.py:785 stock/serializers.py:1323
#: stock/templates/stock/item_base.html:240
#: templates/js/translated/company.js:1636
#: templates/js/translated/stock.js:2387
@@ -4157,7 +4162,7 @@ msgstr ""
msgid "Date of last update of availability data"
msgstr ""
-#: company/serializers.py:153
+#: company/serializers.py:155
msgid "Default currency used for this supplier"
msgstr ""
@@ -4218,7 +4223,7 @@ msgstr ""
#: company/templates/company/company_base.html:86 order/models.py:898
#: order/models.py:1993 order/templates/order/return_order_base.html:131
#: order/templates/order/sales_order_base.html:144 stock/models.py:807
-#: stock/models.py:808 stock/serializers.py:1067
+#: stock/models.py:808 stock/serializers.py:1073
#: stock/templates/stock/item_base.html:405
#: templates/email/overdue_sales_order.html:16
#: templates/js/translated/company.js:502
@@ -4429,8 +4434,9 @@ msgstr ""
#: company/templates/company/manufacturer_part.html:119
#: company/templates/company/supplier_part.html:15 company/views.py:31
-#: part/admin.py:122 part/templates/part/part_sidebar.html:33
-#: templates/InvenTree/search.html:190 templates/navbar.html:48
+#: part/admin.py:122 part/serializers.py:802
+#: part/templates/part/part_sidebar.html:33 templates/InvenTree/search.html:190
+#: templates/navbar.html:48
msgid "Suppliers"
msgstr ""
@@ -4528,7 +4534,7 @@ msgid "No supplier information available"
msgstr ""
#: company/templates/company/supplier_part.html:139 part/bom.py:279
-#: part/bom.py:311 part/serializers.py:491
+#: part/bom.py:311 part/serializers.py:499
#: templates/js/translated/company.js:349 templates/js/translated/part.js:1786
#: templates/js/translated/pricing.js:510
#: templates/js/translated/purchase_order.js:1851
@@ -4577,10 +4583,12 @@ msgstr ""
msgid "Update Part Availability"
msgstr ""
-#: company/templates/company/supplier_part_sidebar.html:5 part/stocktake.py:223
+#: company/templates/company/supplier_part_sidebar.html:5
+#: part/serializers.py:801 part/stocktake.py:223
#: part/templates/part/category.html:183
#: part/templates/part/category_sidebar.html:17 stock/admin.py:69
-#: stock/serializers.py:760 stock/templates/stock/location.html:170
+#: stock/serializers.py:760 stock/serializers.py:924
+#: stock/templates/stock/location.html:170
#: stock/templates/stock/location.html:184
#: stock/templates/stock/location.html:196
#: stock/templates/stock/location_sidebar.html:7
@@ -4640,7 +4648,7 @@ msgid "Label template file"
msgstr ""
#: label/models.py:143 part/models.py:3484 report/models.py:322
-#: templates/js/translated/part.js:2891
+#: templates/js/translated/part.js:2900
#: templates/js/translated/table_filters.js:481
msgid "Enabled"
msgstr "Käytössä"
@@ -5733,7 +5741,7 @@ msgid "Pending Shipments"
msgstr ""
#: order/templates/order/sales_order_detail.html:71
-#: templates/js/translated/bom.js:1271 templates/js/translated/filters.js:296
+#: templates/js/translated/bom.js:1277 templates/js/translated/filters.js:296
msgid "Actions"
msgstr "Toiminnot"
@@ -5861,10 +5869,10 @@ msgstr ""
msgid "Category Path"
msgstr ""
-#: part/admin.py:323 part/models.py:390 part/serializers.py:259
-#: part/serializers.py:373 part/templates/part/cat_link.html:3
-#: part/templates/part/category.html:23 part/templates/part/category.html:141
-#: part/templates/part/category.html:161
+#: part/admin.py:323 part/models.py:390 part/serializers.py:112
+#: part/serializers.py:265 part/serializers.py:381
+#: part/templates/part/cat_link.html:3 part/templates/part/category.html:23
+#: part/templates/part/category.html:141 part/templates/part/category.html:161
#: part/templates/part/category_sidebar.html:9
#: templates/InvenTree/index.html:36 templates/InvenTree/search.html:84
#: templates/InvenTree/settings/sidebar.html:47
@@ -5889,13 +5897,13 @@ msgstr ""
msgid "Part IPN"
msgstr ""
-#: part/admin.py:421 part/serializers.py:1220
+#: part/admin.py:421 part/serializers.py:1238
#: templates/js/translated/pricing.js:358
#: templates/js/translated/pricing.js:1024
msgid "Minimum Price"
msgstr ""
-#: part/admin.py:426 part/serializers.py:1235
+#: part/admin.py:426 part/serializers.py:1253
#: templates/js/translated/pricing.js:353
#: templates/js/translated/pricing.js:1032
msgid "Maximum Price"
@@ -5974,7 +5982,7 @@ msgid "This option must be selected"
msgstr ""
#: part/api.py:1541 part/models.py:895 part/models.py:3385 part/models.py:3831
-#: part/serializers.py:388 part/serializers.py:1076
+#: part/serializers.py:396 part/serializers.py:1094
#: part/templates/part/part_base.html:260 stock/api.py:733
#: templates/InvenTree/settings/settings_staff_js.html:300
#: templates/js/translated/notification.js:60
@@ -5982,12 +5990,17 @@ msgstr ""
msgid "Category"
msgstr "Kategoria"
+#: part/api.py:1828
+msgid "Uses"
+msgstr ""
+
#: part/bom.py:170 part/models.py:100 part/models.py:938
#: part/templates/part/category.html:116 part/templates/part/part_base.html:367
msgid "Default Location"
msgstr ""
-#: part/bom.py:171 templates/email/low_stock_notification.html:16
+#: part/bom.py:171 part/serializers.py:803
+#: templates/email/low_stock_notification.html:16
msgid "Total Stock"
msgstr ""
@@ -6010,7 +6023,8 @@ msgstr ""
msgid "Default location for parts in this category"
msgstr ""
-#: part/models.py:106 stock/models.py:165 templates/js/translated/stock.js:2736
+#: part/models.py:106 stock/models.py:165 templates/js/translated/part.js:2810
+#: templates/js/translated/stock.js:2736
#: templates/js/translated/table_filters.js:239
#: templates/js/translated/table_filters.js:283
msgid "Structural"
@@ -6418,7 +6432,7 @@ msgstr ""
msgid "Test with this name already exists for this part"
msgstr ""
-#: part/models.py:3464 templates/js/translated/part.js:2870
+#: part/models.py:3464 templates/js/translated/part.js:2879
msgid "Test Name"
msgstr ""
@@ -6446,7 +6460,7 @@ msgstr ""
msgid "Is this test enabled?"
msgstr ""
-#: part/models.py:3489 templates/js/translated/part.js:2899
+#: part/models.py:3489 templates/js/translated/part.js:2908
#: templates/js/translated/table_filters.js:477
msgid "Required"
msgstr ""
@@ -6455,7 +6469,7 @@ msgstr ""
msgid "Is this test required to pass?"
msgstr ""
-#: part/models.py:3495 templates/js/translated/part.js:2907
+#: part/models.py:3495 templates/js/translated/part.js:2916
msgid "Requires Value"
msgstr ""
@@ -6463,7 +6477,7 @@ msgstr ""
msgid "Does this test require a value when adding a test result?"
msgstr ""
-#: part/models.py:3501 templates/js/translated/part.js:2914
+#: part/models.py:3501 templates/js/translated/part.js:2923
msgid "Requires Attachment"
msgstr ""
@@ -6685,311 +6699,325 @@ msgstr ""
msgid "Duplicate relationship already exists"
msgstr ""
-#: part/serializers.py:128 part/templates/part/category.html:122
-#: part/templates/part/category.html:207
+#: part/serializers.py:114 part/serializers.py:134
+#: part/templates/part/category.html:122 part/templates/part/category.html:207
#: part/templates/part/category_sidebar.html:7
msgid "Subcategories"
msgstr ""
-#: part/serializers.py:172
+#: part/serializers.py:178
msgid "Results"
msgstr ""
-#: part/serializers.py:173
+#: part/serializers.py:179
msgid "Number of results recorded against this template"
msgstr ""
-#: part/serializers.py:197 part/serializers.py:215 stock/serializers.py:384
+#: part/serializers.py:203 part/serializers.py:221 stock/serializers.py:384
msgid "Purchase currency of this stock item"
msgstr ""
-#: part/serializers.py:260
+#: part/serializers.py:266
msgid "Number of parts using this template"
msgstr ""
-#: part/serializers.py:379
+#: part/serializers.py:387
msgid "No parts selected"
msgstr ""
-#: part/serializers.py:389
+#: part/serializers.py:397
msgid "Select category"
msgstr ""
-#: part/serializers.py:419
+#: part/serializers.py:427
msgid "Original Part"
msgstr ""
-#: part/serializers.py:420
+#: part/serializers.py:428
msgid "Select original part to duplicate"
msgstr ""
-#: part/serializers.py:425
+#: part/serializers.py:433
msgid "Copy Image"
msgstr ""
-#: part/serializers.py:426
+#: part/serializers.py:434
msgid "Copy image from original part"
msgstr ""
-#: part/serializers.py:432 part/templates/part/detail.html:277
+#: part/serializers.py:440 part/templates/part/detail.html:277
msgid "Copy BOM"
msgstr ""
-#: part/serializers.py:433
+#: part/serializers.py:441
msgid "Copy bill of materials from original part"
msgstr ""
-#: part/serializers.py:439
+#: part/serializers.py:447
msgid "Copy Parameters"
msgstr ""
-#: part/serializers.py:440
+#: part/serializers.py:448
msgid "Copy parameter data from original part"
msgstr ""
-#: part/serializers.py:446
+#: part/serializers.py:454
msgid "Copy Notes"
msgstr ""
-#: part/serializers.py:447
+#: part/serializers.py:455
msgid "Copy notes from original part"
msgstr ""
-#: part/serializers.py:460
+#: part/serializers.py:468
msgid "Initial Stock Quantity"
msgstr ""
-#: part/serializers.py:462
+#: part/serializers.py:470
msgid "Specify initial stock quantity for this Part. If quantity is zero, no stock is added."
msgstr ""
-#: part/serializers.py:469
+#: part/serializers.py:477
msgid "Initial Stock Location"
msgstr ""
-#: part/serializers.py:470
+#: part/serializers.py:478
msgid "Specify initial stock location for this Part"
msgstr ""
-#: part/serializers.py:482
+#: part/serializers.py:490
msgid "Select supplier (or leave blank to skip)"
msgstr ""
-#: part/serializers.py:498
+#: part/serializers.py:506
msgid "Select manufacturer (or leave blank to skip)"
msgstr ""
-#: part/serializers.py:508
+#: part/serializers.py:516
msgid "Manufacturer part number"
msgstr "Valmistajan osanumero"
-#: part/serializers.py:515
+#: part/serializers.py:523
msgid "Selected company is not a valid supplier"
msgstr ""
-#: part/serializers.py:524
+#: part/serializers.py:532
msgid "Selected company is not a valid manufacturer"
msgstr ""
-#: part/serializers.py:535
+#: part/serializers.py:543
msgid "Manufacturer part matching this MPN already exists"
msgstr ""
-#: part/serializers.py:542
+#: part/serializers.py:550
msgid "Supplier part matching this SKU already exists"
msgstr ""
-#: part/serializers.py:815 part/templates/part/copy_part.html:9
+#: part/serializers.py:804
+#, fuzzy
+#| msgid "External Link"
+msgid "External Stock"
+msgstr "Ulkoinen linkki"
+
+#: part/serializers.py:806
+msgid "Unallocated Stock"
+msgstr ""
+
+#: part/serializers.py:808
+msgid "Variant Stock"
+msgstr ""
+
+#: part/serializers.py:833 part/templates/part/copy_part.html:9
#: templates/js/translated/part.js:471
msgid "Duplicate Part"
msgstr ""
-#: part/serializers.py:816
+#: part/serializers.py:834
msgid "Copy initial data from another Part"
msgstr ""
-#: part/serializers.py:822 templates/js/translated/part.js:102
+#: part/serializers.py:840 templates/js/translated/part.js:102
msgid "Initial Stock"
msgstr ""
-#: part/serializers.py:823
+#: part/serializers.py:841
msgid "Create Part with initial stock quantity"
msgstr ""
-#: part/serializers.py:829
+#: part/serializers.py:847
msgid "Supplier Information"
msgstr ""
-#: part/serializers.py:830
+#: part/serializers.py:848
msgid "Add initial supplier information for this part"
msgstr ""
-#: part/serializers.py:838
+#: part/serializers.py:856
msgid "Copy Category Parameters"
msgstr ""
-#: part/serializers.py:839
+#: part/serializers.py:857
msgid "Copy parameter templates from selected part category"
msgstr ""
-#: part/serializers.py:844
+#: part/serializers.py:862
msgid "Existing Image"
msgstr ""
-#: part/serializers.py:845
+#: part/serializers.py:863
msgid "Filename of an existing part image"
msgstr ""
-#: part/serializers.py:862
+#: part/serializers.py:880
msgid "Image file does not exist"
msgstr ""
-#: part/serializers.py:1068
+#: part/serializers.py:1086
msgid "Limit stocktake report to a particular part, and any variant parts"
msgstr ""
-#: part/serializers.py:1078
+#: part/serializers.py:1096
msgid "Limit stocktake report to a particular part category, and any child categories"
msgstr ""
-#: part/serializers.py:1088
+#: part/serializers.py:1106
msgid "Limit stocktake report to a particular stock location, and any child locations"
msgstr ""
-#: part/serializers.py:1094
+#: part/serializers.py:1112
msgid "Exclude External Stock"
msgstr ""
-#: part/serializers.py:1095
+#: part/serializers.py:1113
msgid "Exclude stock items in external locations"
msgstr ""
-#: part/serializers.py:1100
+#: part/serializers.py:1118
msgid "Generate Report"
msgstr "Luo raportti"
-#: part/serializers.py:1101
+#: part/serializers.py:1119
msgid "Generate report file containing calculated stocktake data"
msgstr ""
-#: part/serializers.py:1106
+#: part/serializers.py:1124
msgid "Update Parts"
msgstr ""
-#: part/serializers.py:1107
+#: part/serializers.py:1125
msgid "Update specified parts with calculated stocktake data"
msgstr ""
-#: part/serializers.py:1115
+#: part/serializers.py:1133
msgid "Stocktake functionality is not enabled"
msgstr ""
-#: part/serializers.py:1221
+#: part/serializers.py:1239
msgid "Override calculated value for minimum price"
msgstr ""
-#: part/serializers.py:1228
+#: part/serializers.py:1246
msgid "Minimum price currency"
msgstr ""
-#: part/serializers.py:1236
+#: part/serializers.py:1254
msgid "Override calculated value for maximum price"
msgstr ""
-#: part/serializers.py:1243
+#: part/serializers.py:1261
msgid "Maximum price currency"
msgstr ""
-#: part/serializers.py:1272
+#: part/serializers.py:1290
msgid "Update"
msgstr ""
-#: part/serializers.py:1273
+#: part/serializers.py:1291
msgid "Update pricing for this part"
msgstr ""
-#: part/serializers.py:1296
+#: part/serializers.py:1314
#, python-brace-format
msgid "Could not convert from provided currencies to {default_currency}"
msgstr ""
-#: part/serializers.py:1303
+#: part/serializers.py:1321
msgid "Minimum price must not be greater than maximum price"
msgstr ""
-#: part/serializers.py:1306
+#: part/serializers.py:1324
msgid "Maximum price must not be less than minimum price"
msgstr ""
-#: part/serializers.py:1632
+#: part/serializers.py:1660
msgid "Select part to copy BOM from"
msgstr ""
-#: part/serializers.py:1640
+#: part/serializers.py:1668
msgid "Remove Existing Data"
msgstr ""
-#: part/serializers.py:1641
+#: part/serializers.py:1669
msgid "Remove existing BOM items before copying"
msgstr ""
-#: part/serializers.py:1646
+#: part/serializers.py:1674
msgid "Include Inherited"
msgstr ""
-#: part/serializers.py:1647
+#: part/serializers.py:1675
msgid "Include BOM items which are inherited from templated parts"
msgstr ""
-#: part/serializers.py:1652
+#: part/serializers.py:1680
msgid "Skip Invalid Rows"
msgstr ""
-#: part/serializers.py:1653
+#: part/serializers.py:1681
msgid "Enable this option to skip invalid rows"
msgstr ""
-#: part/serializers.py:1658
+#: part/serializers.py:1686
msgid "Copy Substitute Parts"
msgstr ""
-#: part/serializers.py:1659
+#: part/serializers.py:1687
msgid "Copy substitute parts when duplicate BOM items"
msgstr ""
-#: part/serializers.py:1693
+#: part/serializers.py:1721
msgid "Clear Existing BOM"
msgstr ""
-#: part/serializers.py:1694
+#: part/serializers.py:1722
msgid "Delete existing BOM items before uploading"
msgstr ""
-#: part/serializers.py:1724
+#: part/serializers.py:1752
msgid "No part column specified"
msgstr ""
-#: part/serializers.py:1768
+#: part/serializers.py:1796
msgid "Multiple matching parts found"
msgstr ""
-#: part/serializers.py:1771
+#: part/serializers.py:1799
msgid "No matching part found"
msgstr ""
-#: part/serializers.py:1774
+#: part/serializers.py:1802
msgid "Part is not designated as a component"
msgstr ""
-#: part/serializers.py:1783
+#: part/serializers.py:1811
msgid "Quantity not provided"
msgstr ""
-#: part/serializers.py:1791
+#: part/serializers.py:1819
msgid "Invalid quantity"
msgstr ""
-#: part/serializers.py:1812
+#: part/serializers.py:1840
msgid "At least one BOM item is required"
msgstr ""
@@ -7221,7 +7249,7 @@ msgid "Validate BOM"
msgstr ""
#: part/templates/part/detail.html:283 part/templates/part/detail.html:284
-#: templates/js/translated/bom.js:1314 templates/js/translated/bom.js:1315
+#: templates/js/translated/bom.js:1320 templates/js/translated/bom.js:1321
msgid "Add BOM Item"
msgstr ""
@@ -7405,7 +7433,7 @@ msgstr ""
msgid "Allocated to Sales Orders"
msgstr ""
-#: part/templates/part/part_base.html:235 templates/js/translated/bom.js:1213
+#: part/templates/part/part_base.html:235 templates/js/translated/bom.js:1219
msgid "Can Build"
msgstr ""
@@ -8784,7 +8812,7 @@ msgstr ""
msgid "Where is this stock item located?"
msgstr ""
-#: stock/models.py:786 stock/serializers.py:1318
+#: stock/models.py:786 stock/serializers.py:1324
msgid "Packaging this stock item is stored in"
msgstr ""
@@ -8796,7 +8824,7 @@ msgstr ""
msgid "Serial number for this item"
msgstr ""
-#: stock/models.py:830 stock/serializers.py:1301
+#: stock/models.py:830 stock/serializers.py:1307
msgid "Batch code for this stock item"
msgstr ""
@@ -8905,7 +8933,7 @@ msgstr ""
msgid "Serialized stock cannot be merged"
msgstr ""
-#: stock/models.py:1639 stock/serializers.py:1207
+#: stock/models.py:1639 stock/serializers.py:1213
msgid "Duplicate stock items"
msgstr ""
@@ -8986,7 +9014,7 @@ msgstr ""
msgid "Enter serial numbers for new items"
msgstr ""
-#: stock/serializers.py:473 stock/serializers.py:1164 stock/serializers.py:1420
+#: stock/serializers.py:473 stock/serializers.py:1170 stock/serializers.py:1426
msgid "Destination stock location"
msgstr ""
@@ -9059,77 +9087,78 @@ msgstr ""
msgid "No stock items selected"
msgstr ""
-#: stock/serializers.py:863 stock/templates/stock/location.html:165
+#: stock/serializers.py:863 stock/serializers.py:926
+#: stock/templates/stock/location.html:165
#: stock/templates/stock/location.html:213
#: stock/templates/stock/location_sidebar.html:5
msgid "Sublocations"
msgstr ""
-#: stock/serializers.py:1036
+#: stock/serializers.py:1042
msgid "Part must be salable"
msgstr ""
-#: stock/serializers.py:1040
+#: stock/serializers.py:1046
msgid "Item is allocated to a sales order"
msgstr ""
-#: stock/serializers.py:1044
+#: stock/serializers.py:1050
msgid "Item is allocated to a build order"
msgstr ""
-#: stock/serializers.py:1068
+#: stock/serializers.py:1074
msgid "Customer to assign stock items"
msgstr ""
-#: stock/serializers.py:1074
+#: stock/serializers.py:1080
msgid "Selected company is not a customer"
msgstr ""
-#: stock/serializers.py:1082
+#: stock/serializers.py:1088
msgid "Stock assignment notes"
msgstr ""
-#: stock/serializers.py:1092 stock/serializers.py:1346
+#: stock/serializers.py:1098 stock/serializers.py:1352
msgid "A list of stock items must be provided"
msgstr ""
-#: stock/serializers.py:1171
+#: stock/serializers.py:1177
msgid "Stock merging notes"
msgstr ""
-#: stock/serializers.py:1176
+#: stock/serializers.py:1182
msgid "Allow mismatched suppliers"
msgstr ""
-#: stock/serializers.py:1177
+#: stock/serializers.py:1183
msgid "Allow stock items with different supplier parts to be merged"
msgstr ""
-#: stock/serializers.py:1182
+#: stock/serializers.py:1188
msgid "Allow mismatched status"
msgstr ""
-#: stock/serializers.py:1183
+#: stock/serializers.py:1189
msgid "Allow stock items with different status codes to be merged"
msgstr ""
-#: stock/serializers.py:1193
+#: stock/serializers.py:1199
msgid "At least two stock items must be provided"
msgstr ""
-#: stock/serializers.py:1260
+#: stock/serializers.py:1266
msgid "No Change"
msgstr ""
-#: stock/serializers.py:1289
+#: stock/serializers.py:1295
msgid "StockItem primary key value"
msgstr ""
-#: stock/serializers.py:1308
+#: stock/serializers.py:1314
msgid "Stock item status code"
msgstr ""
-#: stock/serializers.py:1336
+#: stock/serializers.py:1342
msgid "Stock transaction notes"
msgstr ""
@@ -10662,7 +10691,7 @@ msgid "The following parts are low on required stock"
msgstr ""
#: templates/email/build_order_required_stock.html:18
-#: templates/js/translated/bom.js:1668 templates/js/translated/build.js:2557
+#: templates/js/translated/bom.js:1674 templates/js/translated/build.js:2557
msgid "Required Quantity"
msgstr ""
@@ -10676,7 +10705,7 @@ msgid "Click on the following link to view this part"
msgstr ""
#: templates/email/low_stock_notification.html:18
-#: templates/js/translated/part.js:3209
+#: templates/js/translated/part.js:3218
msgid "Minimum Quantity"
msgstr ""
@@ -11051,62 +11080,68 @@ msgstr ""
msgid "No pricing available"
msgstr ""
-#: templates/js/translated/bom.js:1182 templates/js/translated/build.js:2596
+#: templates/js/translated/bom.js:1184 templates/js/translated/build.js:2622
+#, fuzzy
+#| msgid "External Link"
+msgid "External stock"
+msgstr "Ulkoinen linkki"
+
+#: templates/js/translated/bom.js:1188 templates/js/translated/build.js:2596
#: templates/js/translated/sales_order.js:1910
msgid "No Stock Available"
msgstr ""
-#: templates/js/translated/bom.js:1187 templates/js/translated/build.js:2600
+#: templates/js/translated/bom.js:1193 templates/js/translated/build.js:2600
msgid "Includes variant and substitute stock"
msgstr ""
-#: templates/js/translated/bom.js:1189 templates/js/translated/build.js:2602
+#: templates/js/translated/bom.js:1195 templates/js/translated/build.js:2602
#: templates/js/translated/part.js:1256
#: templates/js/translated/sales_order.js:1907
msgid "Includes variant stock"
msgstr ""
-#: templates/js/translated/bom.js:1191 templates/js/translated/build.js:2604
+#: templates/js/translated/bom.js:1197 templates/js/translated/build.js:2604
msgid "Includes substitute stock"
msgstr ""
-#: templates/js/translated/bom.js:1219 templates/js/translated/build.js:2587
+#: templates/js/translated/bom.js:1225 templates/js/translated/build.js:2587
msgid "Consumable item"
msgstr ""
-#: templates/js/translated/bom.js:1279
+#: templates/js/translated/bom.js:1285
msgid "Validate BOM Item"
msgstr ""
-#: templates/js/translated/bom.js:1281
+#: templates/js/translated/bom.js:1287
msgid "This line has been validated"
msgstr ""
-#: templates/js/translated/bom.js:1283
+#: templates/js/translated/bom.js:1289
msgid "Edit substitute parts"
msgstr ""
-#: templates/js/translated/bom.js:1285 templates/js/translated/bom.js:1480
+#: templates/js/translated/bom.js:1291 templates/js/translated/bom.js:1486
msgid "Edit BOM Item"
msgstr ""
-#: templates/js/translated/bom.js:1287
+#: templates/js/translated/bom.js:1293
msgid "Delete BOM Item"
msgstr ""
-#: templates/js/translated/bom.js:1307
+#: templates/js/translated/bom.js:1313
msgid "View BOM"
msgstr ""
-#: templates/js/translated/bom.js:1391
+#: templates/js/translated/bom.js:1397
msgid "No BOM items found"
msgstr ""
-#: templates/js/translated/bom.js:1651 templates/js/translated/build.js:2486
+#: templates/js/translated/bom.js:1657 templates/js/translated/build.js:2486
msgid "Required Part"
msgstr ""
-#: templates/js/translated/bom.js:1677
+#: templates/js/translated/bom.js:1683
msgid "Inherited from parent BOM"
msgstr ""
@@ -11449,29 +11484,29 @@ msgstr ""
msgid "Sufficient stock available"
msgstr ""
-#: templates/js/translated/build.js:2643
+#: templates/js/translated/build.js:2647
msgid "Consumable Item"
msgstr ""
-#: templates/js/translated/build.js:2648
+#: templates/js/translated/build.js:2652
msgid "Tracked item"
msgstr ""
-#: templates/js/translated/build.js:2655
+#: templates/js/translated/build.js:2659
#: templates/js/translated/sales_order.js:2016
msgid "Build stock"
msgstr ""
-#: templates/js/translated/build.js:2660 templates/js/translated/stock.js:1829
+#: templates/js/translated/build.js:2664 templates/js/translated/stock.js:1829
msgid "Order stock"
msgstr ""
-#: templates/js/translated/build.js:2664
+#: templates/js/translated/build.js:2668
#: templates/js/translated/sales_order.js:2010
msgid "Allocate stock"
msgstr ""
-#: templates/js/translated/build.js:2668
+#: templates/js/translated/build.js:2672
msgid "Remove stock allocation"
msgstr ""
@@ -12313,64 +12348,64 @@ msgstr ""
msgid "Subscribed category"
msgstr ""
-#: templates/js/translated/part.js:2855
+#: templates/js/translated/part.js:2864
msgid "No test templates matching query"
msgstr ""
-#: templates/js/translated/part.js:2877 templates/js/translated/search.js:342
+#: templates/js/translated/part.js:2886 templates/js/translated/search.js:342
msgid "results"
msgstr ""
-#: templates/js/translated/part.js:2927 templates/js/translated/stock.js:1446
+#: templates/js/translated/part.js:2936 templates/js/translated/stock.js:1446
msgid "Edit test result"
msgstr ""
-#: templates/js/translated/part.js:2928 templates/js/translated/stock.js:1447
+#: templates/js/translated/part.js:2937 templates/js/translated/stock.js:1447
#: templates/js/translated/stock.js:1692
msgid "Delete test result"
msgstr ""
-#: templates/js/translated/part.js:2932
+#: templates/js/translated/part.js:2941
msgid "This test is defined for a parent part"
msgstr ""
-#: templates/js/translated/part.js:2948
+#: templates/js/translated/part.js:2957
msgid "Edit Test Result Template"
msgstr ""
-#: templates/js/translated/part.js:2962
+#: templates/js/translated/part.js:2971
msgid "Delete Test Result Template"
msgstr ""
-#: templates/js/translated/part.js:3041 templates/js/translated/part.js:3042
+#: templates/js/translated/part.js:3050 templates/js/translated/part.js:3051
msgid "No date specified"
msgstr ""
-#: templates/js/translated/part.js:3044
+#: templates/js/translated/part.js:3053
msgid "Specified date is in the past"
msgstr ""
-#: templates/js/translated/part.js:3050
+#: templates/js/translated/part.js:3059
msgid "Speculative"
msgstr ""
-#: templates/js/translated/part.js:3100
+#: templates/js/translated/part.js:3109
msgid "No scheduling information available for this part"
msgstr ""
-#: templates/js/translated/part.js:3106
+#: templates/js/translated/part.js:3115
msgid "Error fetching scheduling information for this part"
msgstr ""
-#: templates/js/translated/part.js:3202
+#: templates/js/translated/part.js:3211
msgid "Scheduled Stock Quantities"
msgstr ""
-#: templates/js/translated/part.js:3218
+#: templates/js/translated/part.js:3227
msgid "Maximum Quantity"
msgstr ""
-#: templates/js/translated/part.js:3263
+#: templates/js/translated/part.js:3272
msgid "Minimum Stock Level"
msgstr ""
@@ -14052,4 +14087,3 @@ msgstr "Oikeus muokata kohteita"
#: users/models.py:413
msgid "Permission to delete items"
msgstr "Oikeus poistaa kohteita"
-
diff --git a/InvenTree/locale/fr/LC_MESSAGES/django.po b/InvenTree/locale/fr/LC_MESSAGES/django.po
index 5fd400cca7..9276718982 100644
--- a/InvenTree/locale/fr/LC_MESSAGES/django.po
+++ b/InvenTree/locale/fr/LC_MESSAGES/django.po
@@ -2,7 +2,7 @@ msgid ""
msgstr ""
"Project-Id-Version: inventree\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2024-02-28 04:05+0000\n"
+"POT-Creation-Date: 2024-03-05 00:41+0000\n"
"PO-Revision-Date: 2024-02-28 07:23\n"
"Last-Translator: \n"
"Language-Team: French\n"
@@ -66,9 +66,9 @@ msgstr "Entrer la date"
#: report/templates/report/inventree_build_order_base.html:172
#: stock/admin.py:226 stock/models.py:2335 stock/models.py:2451
#: stock/serializers.py:479 stock/serializers.py:632 stock/serializers.py:728
-#: stock/serializers.py:778 stock/serializers.py:1081 stock/serializers.py:1170
-#: stock/serializers.py:1335 stock/templates/stock/stock_sidebar.html:25
-#: templates/js/translated/barcode.js:143 templates/js/translated/bom.js:1259
+#: stock/serializers.py:778 stock/serializers.py:1087 stock/serializers.py:1176
+#: stock/serializers.py:1341 stock/templates/stock/stock_sidebar.html:25
+#: templates/js/translated/barcode.js:143 templates/js/translated/bom.js:1265
#: templates/js/translated/company.js:1674 templates/js/translated/order.js:347
#: templates/js/translated/part.js:1080
#: templates/js/translated/purchase_order.js:2201
@@ -523,7 +523,7 @@ msgstr "Nom"
#: templates/js/translated/order.js:298 templates/js/translated/part.js:1238
#: templates/js/translated/part.js:1483 templates/js/translated/part.js:1621
#: templates/js/translated/part.js:1958 templates/js/translated/part.js:2355
-#: templates/js/translated/part.js:2785 templates/js/translated/part.js:2887
+#: templates/js/translated/part.js:2785 templates/js/translated/part.js:2896
#: templates/js/translated/plugin.js:80
#: templates/js/translated/purchase_order.js:1707
#: templates/js/translated/purchase_order.js:1850
@@ -678,7 +678,7 @@ msgstr "URL du fichier image distant"
msgid "Downloading images from remote URL is not enabled"
msgstr "Le téléchargement des images depuis une URL distante n'est pas activé"
-#: InvenTree/status.py:66 part/serializers.py:1120
+#: InvenTree/status.py:66 part/serializers.py:1138
msgid "Background worker check failed"
msgstr "Échec de la vérification du processus d'arrière-plan"
@@ -960,7 +960,7 @@ msgid "Tracked"
msgstr "Suivi"
#: build/api.py:285 part/admin.py:144 templates/js/translated/build.js:1741
-#: templates/js/translated/build.js:2626
+#: templates/js/translated/build.js:2630
#: templates/js/translated/sales_order.js:1929
#: templates/js/translated/table_filters.js:571
msgid "Allocated"
@@ -1044,11 +1044,11 @@ msgstr "BuildOrder associé a cette fabrication"
#: build/models.py:199 build/templates/build/build_base.html:97
#: build/templates/build/detail.html:29 company/models.py:1044
#: order/models.py:1389 order/models.py:1532 order/models.py:1533
-#: part/api.py:1528 part/models.py:389 part/models.py:3003 part/models.py:3147
-#: part/models.py:3291 part/models.py:3314 part/models.py:3335
-#: part/models.py:3357 part/models.py:3458 part/models.py:3754
-#: part/models.py:3885 part/models.py:3978 part/models.py:4339
-#: part/serializers.py:1066 part/serializers.py:1631
+#: part/api.py:1528 part/api.py:1820 part/models.py:389 part/models.py:3003
+#: part/models.py:3147 part/models.py:3291 part/models.py:3314
+#: part/models.py:3335 part/models.py:3357 part/models.py:3458
+#: part/models.py:3754 part/models.py:3885 part/models.py:3978
+#: part/models.py:4339 part/serializers.py:1084 part/serializers.py:1659
#: part/templates/part/part_app_base.html:8
#: part/templates/part/part_pricing.html:12
#: part/templates/part/upload_bom.html:52
@@ -1147,7 +1147,7 @@ msgid "Build status code"
msgstr "Code de statut de construction"
#: build/models.py:264 build/serializers.py:280 order/serializers.py:549
-#: stock/models.py:826 stock/serializers.py:1300
+#: stock/models.py:826 stock/serializers.py:1306
#: templates/js/translated/purchase_order.js:1129
msgid "Batch Code"
msgstr "Code de lot"
@@ -1242,48 +1242,48 @@ msgstr "Code du projet"
msgid "Project code for this build order"
msgstr "Code de projet pour cet ordre de construction"
-#: build/models.py:559
+#: build/models.py:575
#, python-brace-format
msgid "Build order {build} has been completed"
msgstr "La commande de construction {build} a été effectuée"
-#: build/models.py:565
+#: build/models.py:581
msgid "A build order has been completed"
msgstr "Une commande de construction a été effectuée"
-#: build/models.py:783 build/models.py:858
+#: build/models.py:799 build/models.py:874
msgid "No build output specified"
msgstr "Pas d'ordre de production défini"
-#: build/models.py:786
+#: build/models.py:802
msgid "Build output is already completed"
msgstr "L'ordre de production a déjà été réalisé"
-#: build/models.py:789
+#: build/models.py:805
msgid "Build output does not match Build Order"
msgstr "L'ordre de production de correspond pas à l'ordre de commande"
-#: build/models.py:862 build/serializers.py:223 build/serializers.py:262
+#: build/models.py:878 build/serializers.py:223 build/serializers.py:262
#: build/serializers.py:831 order/models.py:526 order/serializers.py:401
-#: order/serializers.py:544 part/serializers.py:1423 part/serializers.py:1789
+#: order/serializers.py:544 part/serializers.py:1442 part/serializers.py:1817
#: stock/models.py:665 stock/models.py:1477 stock/serializers.py:450
msgid "Quantity must be greater than zero"
msgstr "La quantité doit être supérieure à zéro"
-#: build/models.py:867 build/serializers.py:228
+#: build/models.py:883 build/serializers.py:228
msgid "Quantity cannot be greater than the output quantity"
msgstr "La quantité ne peut pas être supérieure à la quantité de sortie"
-#: build/models.py:924 build/serializers.py:533
+#: build/models.py:940 build/serializers.py:533
#, python-brace-format
msgid "Build output {serial} has not passed all required tests"
msgstr ""
-#: build/models.py:1286
+#: build/models.py:1302
msgid "Build object"
msgstr "Création de l'objet"
-#: build/models.py:1300 build/models.py:1558 build/serializers.py:210
+#: build/models.py:1316 build/models.py:1574 build/serializers.py:210
#: build/serializers.py:247 build/templates/build/build_base.html:102
#: build/templates/build/detail.html:34 common/models.py:2432
#: order/models.py:1247 order/models.py:1902 order/serializers.py:1306
@@ -1310,7 +1310,7 @@ msgstr "Création de l'objet"
#: templates/js/translated/company.js:1808
#: templates/js/translated/model_renderers.js:230
#: templates/js/translated/order.js:304 templates/js/translated/part.js:961
-#: templates/js/translated/part.js:1811 templates/js/translated/part.js:3332
+#: templates/js/translated/part.js:1811 templates/js/translated/part.js:3341
#: templates/js/translated/pricing.js:381
#: templates/js/translated/pricing.js:474
#: templates/js/translated/pricing.js:522
@@ -1330,38 +1330,38 @@ msgstr "Création de l'objet"
msgid "Quantity"
msgstr "Quantité"
-#: build/models.py:1301
+#: build/models.py:1317
msgid "Required quantity for build order"
msgstr "Quantité requise pour la commande de construction"
-#: build/models.py:1381
+#: build/models.py:1397
msgid "Build item must specify a build output, as master part is marked as trackable"
msgstr "L'élément de construction doit spécifier une sortie de construction, la pièce maîtresse étant marquée comme objet traçable"
-#: build/models.py:1390
+#: build/models.py:1406
#, python-brace-format
msgid "Allocated quantity ({q}) must not exceed available stock quantity ({a})"
msgstr "La quantité allouée ({q}) ne doit pas excéder la quantité disponible ({a})"
-#: build/models.py:1400 order/models.py:1853
+#: build/models.py:1416 order/models.py:1853
msgid "Stock item is over-allocated"
msgstr "L'article de stock est suralloué"
-#: build/models.py:1406 order/models.py:1856
+#: build/models.py:1422 order/models.py:1856
msgid "Allocation quantity must be greater than zero"
msgstr "La quantité allouée doit être supérieure à zéro"
-#: build/models.py:1412
+#: build/models.py:1428
msgid "Quantity must be 1 for serialized stock"
msgstr "La quantité doit être de 1 pour stock sérialisé"
-#: build/models.py:1473
+#: build/models.py:1489
msgid "Selected stock item does not match BOM line"
msgstr "L'article de stock sélectionné ne correspond pas à la ligne BOM"
-#: build/models.py:1545 build/serializers.py:811 order/serializers.py:1150
-#: order/serializers.py:1171 stock/serializers.py:544 stock/serializers.py:1019
-#: stock/serializers.py:1131 stock/templates/stock/item_base.html:10
+#: build/models.py:1561 build/serializers.py:811 order/serializers.py:1150
+#: order/serializers.py:1171 stock/serializers.py:544 stock/serializers.py:1025
+#: stock/serializers.py:1137 stock/templates/stock/item_base.html:10
#: stock/templates/stock/item_base.html:23
#: stock/templates/stock/item_base.html:194
#: templates/js/translated/build.js:1742
@@ -1376,19 +1376,19 @@ msgstr "L'article de stock sélectionné ne correspond pas à la ligne BOM"
msgid "Stock Item"
msgstr "Article en stock"
-#: build/models.py:1546
+#: build/models.py:1562
msgid "Source stock item"
msgstr "Stock d'origine de l'article"
-#: build/models.py:1559
+#: build/models.py:1575
msgid "Stock quantity to allocate to build"
msgstr "Quantité de stock à allouer à la construction"
-#: build/models.py:1567
+#: build/models.py:1583
msgid "Install into"
msgstr "Installer dans"
-#: build/models.py:1568
+#: build/models.py:1584
msgid "Destination stock item"
msgstr "Stock de destination de l'article"
@@ -1452,9 +1452,9 @@ msgid "A list of build outputs must be provided"
msgstr "Une liste d'ordre de production doit être fourni"
#: build/serializers.py:426 build/serializers.py:498 order/serializers.py:533
-#: order/serializers.py:641 order/serializers.py:1646 part/serializers.py:1086
+#: order/serializers.py:641 order/serializers.py:1646 part/serializers.py:1104
#: stock/serializers.py:472 stock/serializers.py:627 stock/serializers.py:723
-#: stock/serializers.py:1163 stock/serializers.py:1419
+#: stock/serializers.py:1169 stock/serializers.py:1425
#: stock/templates/stock/item_base.html:394
#: templates/js/translated/barcode.js:547
#: templates/js/translated/barcode.js:795 templates/js/translated/build.js:999
@@ -1494,7 +1494,7 @@ msgstr "Emplacement des ordres de production achevés"
#: build/serializers.py:505 build/templates/build/build_base.html:151
#: build/templates/build/detail.html:62 order/models.py:910
#: order/models.py:2005 order/serializers.py:565 stock/admin.py:165
-#: stock/serializers.py:774 stock/serializers.py:1307
+#: stock/serializers.py:774 stock/serializers.py:1313
#: stock/templates/stock/item_base.html:427
#: templates/js/translated/barcode.js:252 templates/js/translated/build.js:2189
#: templates/js/translated/purchase_order.js:1308
@@ -1602,7 +1602,7 @@ msgstr "Élément de la ligne de construction"
msgid "bom_item.part must point to the same part as the build order"
msgstr "bom_item.part doit pointer sur la même pièce que l'ordre de construction"
-#: build/serializers.py:817 stock/serializers.py:1032
+#: build/serializers.py:817 stock/serializers.py:1038
msgid "Item must be in stock"
msgstr "L'article doit être en stock"
@@ -1659,44 +1659,45 @@ msgstr "Objets Optionnels"
msgid "Allocate optional BOM items to build order"
msgstr "Affecter des éléments de nomenclature facultatifs à l'ordre de fabrication"
-#: build/serializers.py:1096 part/models.py:3895 part/models.py:4331
+#: build/serializers.py:1097 part/models.py:3895 part/models.py:4331
#: stock/api.py:745
msgid "BOM Item"
msgstr "Article du BOM"
-#: build/serializers.py:1105 templates/js/translated/index.js:130
+#: build/serializers.py:1106 templates/js/translated/index.js:130
msgid "Allocated Stock"
msgstr ""
-#: build/serializers.py:1110 part/admin.py:132 part/bom.py:173
-#: part/serializers.py:1441 part/templates/part/part_base.html:210
-#: templates/js/translated/bom.js:1202 templates/js/translated/build.js:2614
-#: templates/js/translated/part.js:709 templates/js/translated/part.js:2148
+#: build/serializers.py:1111 part/admin.py:132 part/bom.py:173
+#: part/serializers.py:798 part/serializers.py:1460
+#: part/templates/part/part_base.html:210 templates/js/translated/bom.js:1208
+#: templates/js/translated/build.js:2614 templates/js/translated/part.js:709
+#: templates/js/translated/part.js:2148
#: templates/js/translated/table_filters.js:170
msgid "On Order"
msgstr "En Commande"
-#: build/serializers.py:1115 part/serializers.py:1443
+#: build/serializers.py:1116 part/serializers.py:1462
#: templates/js/translated/build.js:2618
#: templates/js/translated/table_filters.js:360
msgid "In Production"
msgstr ""
-#: build/serializers.py:1120 part/bom.py:172 part/serializers.py:1454
+#: build/serializers.py:1121 part/bom.py:172 part/serializers.py:1473
#: part/templates/part/part_base.html:192
#: templates/js/translated/sales_order.js:1893
msgid "Available Stock"
msgstr ""
-#: build/tasks.py:149
+#: build/tasks.py:171
msgid "Stock required for build order"
msgstr "Stock requis pour la commande de construction"
-#: build/tasks.py:166
+#: build/tasks.py:188
msgid "Overdue Build Order"
msgstr "Ordre de commande en retard"
-#: build/tasks.py:171
+#: build/tasks.py:193
#, python-brace-format
msgid "Build order {bo} is now overdue"
msgstr "L'ordre de commande {bo} est maintenant en retard"
@@ -1990,27 +1991,31 @@ msgstr "Commander les pièces requises"
msgid "Order Parts"
msgstr "Commander des pièces"
-#: build/templates/build/detail.html:210
+#: build/templates/build/detail.html:205
+msgid "Available stock has been filtered based on specified source location for this build order"
+msgstr ""
+
+#: build/templates/build/detail.html:215
msgid "Incomplete Build Outputs"
msgstr "Sorties de construction incomplètes"
-#: build/templates/build/detail.html:214
+#: build/templates/build/detail.html:219
msgid "Create new build output"
msgstr "Créer une nouvelle sortie de construction"
-#: build/templates/build/detail.html:215
+#: build/templates/build/detail.html:220
msgid "New Build Output"
msgstr "Nouvelle sortie de construction"
-#: build/templates/build/detail.html:232 build/templates/build/sidebar.html:15
+#: build/templates/build/detail.html:237 build/templates/build/sidebar.html:15
msgid "Consumed Stock"
msgstr "Stock Consommé"
-#: build/templates/build/detail.html:244
+#: build/templates/build/detail.html:249
msgid "Completed Build Outputs"
msgstr "Sorties de Construction terminées"
-#: build/templates/build/detail.html:256 build/templates/build/sidebar.html:19
+#: build/templates/build/detail.html:261 build/templates/build/sidebar.html:19
#: company/templates/company/detail.html:229
#: company/templates/company/manufacturer_part.html:141
#: company/templates/company/manufacturer_part_sidebar.html:9
@@ -2026,15 +2031,15 @@ msgstr "Sorties de Construction terminées"
msgid "Attachments"
msgstr "Pieces jointes"
-#: build/templates/build/detail.html:271
+#: build/templates/build/detail.html:276
msgid "Build Notes"
msgstr "Notes de construction"
-#: build/templates/build/detail.html:426
+#: build/templates/build/detail.html:434
msgid "Allocation Complete"
msgstr ""
-#: build/templates/build/detail.html:427
+#: build/templates/build/detail.html:435
msgid "All lines have been fully allocated"
msgstr ""
@@ -2436,7 +2441,7 @@ msgid "Parts are templates by default"
msgstr "Les pièces sont des templates par défaut"
#: common/models.py:1456 part/admin.py:91 part/admin.py:431 part/models.py:1015
-#: templates/js/translated/bom.js:1633
+#: templates/js/translated/bom.js:1639
#: templates/js/translated/table_filters.js:330
#: templates/js/translated/table_filters.js:721
msgid "Assembly"
@@ -3495,7 +3500,7 @@ msgstr ""
msgid "Price break quantity"
msgstr ""
-#: common/models.py:2440 company/serializers.py:484 order/admin.py:42
+#: common/models.py:2440 company/serializers.py:486 order/admin.py:42
#: order/models.py:1321 order/models.py:2226
#: templates/js/translated/company.js:1813 templates/js/translated/part.js:1885
#: templates/js/translated/pricing.js:621
@@ -3972,7 +3977,7 @@ msgstr ""
#: company/models.py:495 company/templates/company/company_base.html:76
#: company/templates/company/manufacturer_part.html:90
-#: company/templates/company/supplier_part.html:145 part/serializers.py:497
+#: company/templates/company/supplier_part.html:145 part/serializers.py:505
#: stock/templates/stock/item_base.html:207
#: templates/js/translated/company.js:506
#: templates/js/translated/company.js:1108
@@ -3987,7 +3992,7 @@ msgid "Select manufacturer"
msgstr "Sélectionner un fabricant"
#: company/models.py:502 company/templates/company/manufacturer_part.html:101
-#: company/templates/company/supplier_part.html:153 part/serializers.py:507
+#: company/templates/company/supplier_part.html:153 part/serializers.py:515
#: templates/js/translated/company.js:351
#: templates/js/translated/company.js:1107
#: templates/js/translated/company.js:1302
@@ -4059,7 +4064,7 @@ msgstr "La pièce du fabricant liée doit faire référence à la même pièce d
#: company/models.py:795 company/templates/company/company_base.html:81
#: company/templates/company/supplier_part.html:129 order/models.py:453
#: order/templates/order/order_base.html:136 part/bom.py:272 part/bom.py:310
-#: part/serializers.py:481 plugin/builtin/suppliers/digikey.py:25
+#: part/serializers.py:489 plugin/builtin/suppliers/digikey.py:25
#: plugin/builtin/suppliers/lcsc.py:26 plugin/builtin/suppliers/mouser.py:24
#: plugin/builtin/suppliers/tme.py:26 stock/templates/stock/item_base.html:224
#: templates/email/overdue_purchase_order.html:16
@@ -4076,7 +4081,7 @@ msgstr "Fournisseur"
msgid "Select supplier"
msgstr "Sélectionner un fournisseur"
-#: company/models.py:802 part/serializers.py:492
+#: company/models.py:802 part/serializers.py:500
msgid "Supplier stock keeping unit"
msgstr "Unité de gestion des stocks des fournisseurs"
@@ -4112,7 +4117,7 @@ msgid "Minimum charge (e.g. stocking fee)"
msgstr "Frais minimums (par exemple frais de stock)"
#: company/models.py:851 company/templates/company/supplier_part.html:160
-#: stock/admin.py:224 stock/models.py:785 stock/serializers.py:1317
+#: stock/admin.py:224 stock/models.py:785 stock/serializers.py:1323
#: stock/templates/stock/item_base.html:240
#: templates/js/translated/company.js:1636
#: templates/js/translated/stock.js:2387
@@ -4157,7 +4162,7 @@ msgstr "Disponibilité mise à jour"
msgid "Date of last update of availability data"
msgstr "Date de dernière mise à jour des données de disponibilité"
-#: company/serializers.py:153
+#: company/serializers.py:155
msgid "Default currency used for this supplier"
msgstr "Devise par défaut utilisée pour ce fournisseur"
@@ -4218,7 +4223,7 @@ msgstr "Supprimer image"
#: company/templates/company/company_base.html:86 order/models.py:898
#: order/models.py:1993 order/templates/order/return_order_base.html:131
#: order/templates/order/sales_order_base.html:144 stock/models.py:807
-#: stock/models.py:808 stock/serializers.py:1067
+#: stock/models.py:808 stock/serializers.py:1073
#: stock/templates/stock/item_base.html:405
#: templates/email/overdue_sales_order.html:16
#: templates/js/translated/company.js:502
@@ -4429,8 +4434,9 @@ msgstr "Aucune information sur le fabricant disponible"
#: company/templates/company/manufacturer_part.html:119
#: company/templates/company/supplier_part.html:15 company/views.py:31
-#: part/admin.py:122 part/templates/part/part_sidebar.html:33
-#: templates/InvenTree/search.html:190 templates/navbar.html:48
+#: part/admin.py:122 part/serializers.py:802
+#: part/templates/part/part_sidebar.html:33 templates/InvenTree/search.html:190
+#: templates/navbar.html:48
msgid "Suppliers"
msgstr "Fournisseurs"
@@ -4528,7 +4534,7 @@ msgid "No supplier information available"
msgstr "Aucune information de fournisseur disponible"
#: company/templates/company/supplier_part.html:139 part/bom.py:279
-#: part/bom.py:311 part/serializers.py:491
+#: part/bom.py:311 part/serializers.py:499
#: templates/js/translated/company.js:349 templates/js/translated/part.js:1786
#: templates/js/translated/pricing.js:510
#: templates/js/translated/purchase_order.js:1851
@@ -4577,10 +4583,12 @@ msgstr ""
msgid "Update Part Availability"
msgstr ""
-#: company/templates/company/supplier_part_sidebar.html:5 part/stocktake.py:223
+#: company/templates/company/supplier_part_sidebar.html:5
+#: part/serializers.py:801 part/stocktake.py:223
#: part/templates/part/category.html:183
#: part/templates/part/category_sidebar.html:17 stock/admin.py:69
-#: stock/serializers.py:760 stock/templates/stock/location.html:170
+#: stock/serializers.py:760 stock/serializers.py:924
+#: stock/templates/stock/location.html:170
#: stock/templates/stock/location.html:184
#: stock/templates/stock/location.html:196
#: stock/templates/stock/location_sidebar.html:7
@@ -4640,7 +4648,7 @@ msgid "Label template file"
msgstr "Fichier de modèle d'étiquette"
#: label/models.py:143 part/models.py:3484 report/models.py:322
-#: templates/js/translated/part.js:2891
+#: templates/js/translated/part.js:2900
#: templates/js/translated/table_filters.js:481
msgid "Enabled"
msgstr "Activé"
@@ -5733,7 +5741,7 @@ msgid "Pending Shipments"
msgstr "Expéditions en attente"
#: order/templates/order/sales_order_detail.html:71
-#: templates/js/translated/bom.js:1271 templates/js/translated/filters.js:296
+#: templates/js/translated/bom.js:1277 templates/js/translated/filters.js:296
msgid "Actions"
msgstr ""
@@ -5861,10 +5869,10 @@ msgstr ""
msgid "Category Path"
msgstr ""
-#: part/admin.py:323 part/models.py:390 part/serializers.py:259
-#: part/serializers.py:373 part/templates/part/cat_link.html:3
-#: part/templates/part/category.html:23 part/templates/part/category.html:141
-#: part/templates/part/category.html:161
+#: part/admin.py:323 part/models.py:390 part/serializers.py:112
+#: part/serializers.py:265 part/serializers.py:381
+#: part/templates/part/cat_link.html:3 part/templates/part/category.html:23
+#: part/templates/part/category.html:141 part/templates/part/category.html:161
#: part/templates/part/category_sidebar.html:9
#: templates/InvenTree/index.html:36 templates/InvenTree/search.html:84
#: templates/InvenTree/settings/sidebar.html:47
@@ -5889,13 +5897,13 @@ msgstr ""
msgid "Part IPN"
msgstr ""
-#: part/admin.py:421 part/serializers.py:1220
+#: part/admin.py:421 part/serializers.py:1238
#: templates/js/translated/pricing.js:358
#: templates/js/translated/pricing.js:1024
msgid "Minimum Price"
msgstr "Prix Minimum"
-#: part/admin.py:426 part/serializers.py:1235
+#: part/admin.py:426 part/serializers.py:1253
#: templates/js/translated/pricing.js:353
#: templates/js/translated/pricing.js:1032
msgid "Maximum Price"
@@ -5974,7 +5982,7 @@ msgid "This option must be selected"
msgstr ""
#: part/api.py:1541 part/models.py:895 part/models.py:3385 part/models.py:3831
-#: part/serializers.py:388 part/serializers.py:1076
+#: part/serializers.py:396 part/serializers.py:1094
#: part/templates/part/part_base.html:260 stock/api.py:733
#: templates/InvenTree/settings/settings_staff_js.html:300
#: templates/js/translated/notification.js:60
@@ -5982,12 +5990,17 @@ msgstr ""
msgid "Category"
msgstr "Catégorie"
+#: part/api.py:1828
+msgid "Uses"
+msgstr ""
+
#: part/bom.py:170 part/models.py:100 part/models.py:938
#: part/templates/part/category.html:116 part/templates/part/part_base.html:367
msgid "Default Location"
msgstr ""
-#: part/bom.py:171 templates/email/low_stock_notification.html:16
+#: part/bom.py:171 part/serializers.py:803
+#: templates/email/low_stock_notification.html:16
msgid "Total Stock"
msgstr ""
@@ -6010,7 +6023,8 @@ msgstr "Catégories de composants"
msgid "Default location for parts in this category"
msgstr ""
-#: part/models.py:106 stock/models.py:165 templates/js/translated/stock.js:2736
+#: part/models.py:106 stock/models.py:165 templates/js/translated/part.js:2810
+#: templates/js/translated/stock.js:2736
#: templates/js/translated/table_filters.js:239
#: templates/js/translated/table_filters.js:283
msgid "Structural"
@@ -6418,7 +6432,7 @@ msgstr ""
msgid "Test with this name already exists for this part"
msgstr ""
-#: part/models.py:3464 templates/js/translated/part.js:2870
+#: part/models.py:3464 templates/js/translated/part.js:2879
msgid "Test Name"
msgstr "Nom de test"
@@ -6446,7 +6460,7 @@ msgstr ""
msgid "Is this test enabled?"
msgstr ""
-#: part/models.py:3489 templates/js/translated/part.js:2899
+#: part/models.py:3489 templates/js/translated/part.js:2908
#: templates/js/translated/table_filters.js:477
msgid "Required"
msgstr "Requis"
@@ -6455,7 +6469,7 @@ msgstr "Requis"
msgid "Is this test required to pass?"
msgstr ""
-#: part/models.py:3495 templates/js/translated/part.js:2907
+#: part/models.py:3495 templates/js/translated/part.js:2916
msgid "Requires Value"
msgstr "Valeur requise"
@@ -6463,7 +6477,7 @@ msgstr "Valeur requise"
msgid "Does this test require a value when adding a test result?"
msgstr ""
-#: part/models.py:3501 templates/js/translated/part.js:2914
+#: part/models.py:3501 templates/js/translated/part.js:2923
msgid "Requires Attachment"
msgstr ""
@@ -6685,311 +6699,329 @@ msgstr ""
msgid "Duplicate relationship already exists"
msgstr ""
-#: part/serializers.py:128 part/templates/part/category.html:122
-#: part/templates/part/category.html:207
+#: part/serializers.py:114 part/serializers.py:134
+#: part/templates/part/category.html:122 part/templates/part/category.html:207
#: part/templates/part/category_sidebar.html:7
msgid "Subcategories"
msgstr ""
-#: part/serializers.py:172
+#: part/serializers.py:178
msgid "Results"
msgstr ""
-#: part/serializers.py:173
+#: part/serializers.py:179
msgid "Number of results recorded against this template"
msgstr ""
-#: part/serializers.py:197 part/serializers.py:215 stock/serializers.py:384
+#: part/serializers.py:203 part/serializers.py:221 stock/serializers.py:384
msgid "Purchase currency of this stock item"
msgstr "Devise d'achat de l'item"
-#: part/serializers.py:260
+#: part/serializers.py:266
msgid "Number of parts using this template"
msgstr ""
-#: part/serializers.py:379
+#: part/serializers.py:387
msgid "No parts selected"
msgstr ""
-#: part/serializers.py:389
+#: part/serializers.py:397
msgid "Select category"
msgstr ""
-#: part/serializers.py:419
+#: part/serializers.py:427
msgid "Original Part"
msgstr ""
-#: part/serializers.py:420
+#: part/serializers.py:428
msgid "Select original part to duplicate"
msgstr ""
-#: part/serializers.py:425
+#: part/serializers.py:433
msgid "Copy Image"
msgstr "Copier l'image"
-#: part/serializers.py:426
+#: part/serializers.py:434
msgid "Copy image from original part"
msgstr ""
-#: part/serializers.py:432 part/templates/part/detail.html:277
+#: part/serializers.py:440 part/templates/part/detail.html:277
msgid "Copy BOM"
msgstr ""
-#: part/serializers.py:433
+#: part/serializers.py:441
msgid "Copy bill of materials from original part"
msgstr ""
-#: part/serializers.py:439
+#: part/serializers.py:447
msgid "Copy Parameters"
msgstr "Copier les paramètres"
-#: part/serializers.py:440
+#: part/serializers.py:448
msgid "Copy parameter data from original part"
msgstr ""
-#: part/serializers.py:446
+#: part/serializers.py:454
msgid "Copy Notes"
msgstr ""
-#: part/serializers.py:447
+#: part/serializers.py:455
msgid "Copy notes from original part"
msgstr ""
-#: part/serializers.py:460
+#: part/serializers.py:468
msgid "Initial Stock Quantity"
msgstr ""
-#: part/serializers.py:462
+#: part/serializers.py:470
msgid "Specify initial stock quantity for this Part. If quantity is zero, no stock is added."
msgstr ""
-#: part/serializers.py:469
+#: part/serializers.py:477
msgid "Initial Stock Location"
msgstr ""
-#: part/serializers.py:470
+#: part/serializers.py:478
msgid "Specify initial stock location for this Part"
msgstr ""
-#: part/serializers.py:482
+#: part/serializers.py:490
msgid "Select supplier (or leave blank to skip)"
msgstr ""
-#: part/serializers.py:498
+#: part/serializers.py:506
msgid "Select manufacturer (or leave blank to skip)"
msgstr ""
-#: part/serializers.py:508
+#: part/serializers.py:516
msgid "Manufacturer part number"
msgstr ""
-#: part/serializers.py:515
+#: part/serializers.py:523
msgid "Selected company is not a valid supplier"
msgstr ""
-#: part/serializers.py:524
+#: part/serializers.py:532
msgid "Selected company is not a valid manufacturer"
msgstr ""
-#: part/serializers.py:535
+#: part/serializers.py:543
msgid "Manufacturer part matching this MPN already exists"
msgstr ""
-#: part/serializers.py:542
+#: part/serializers.py:550
msgid "Supplier part matching this SKU already exists"
msgstr ""
-#: part/serializers.py:815 part/templates/part/copy_part.html:9
+#: part/serializers.py:804
+#, fuzzy
+#| msgid "External Link"
+msgid "External Stock"
+msgstr "Lien Externe"
+
+#: part/serializers.py:806
+#, fuzzy
+#| msgid "Deallocate Stock"
+msgid "Unallocated Stock"
+msgstr "Désallouer le Stock"
+
+#: part/serializers.py:808
+#, fuzzy
+#| msgid "Part Stocktake"
+msgid "Variant Stock"
+msgstr "Inventaire des pièces"
+
+#: part/serializers.py:833 part/templates/part/copy_part.html:9
#: templates/js/translated/part.js:471
msgid "Duplicate Part"
msgstr ""
-#: part/serializers.py:816
+#: part/serializers.py:834
msgid "Copy initial data from another Part"
msgstr ""
-#: part/serializers.py:822 templates/js/translated/part.js:102
+#: part/serializers.py:840 templates/js/translated/part.js:102
msgid "Initial Stock"
msgstr ""
-#: part/serializers.py:823
+#: part/serializers.py:841
msgid "Create Part with initial stock quantity"
msgstr ""
-#: part/serializers.py:829
+#: part/serializers.py:847
msgid "Supplier Information"
msgstr ""
-#: part/serializers.py:830
+#: part/serializers.py:848
msgid "Add initial supplier information for this part"
msgstr ""
-#: part/serializers.py:838
+#: part/serializers.py:856
msgid "Copy Category Parameters"
msgstr ""
-#: part/serializers.py:839
+#: part/serializers.py:857
msgid "Copy parameter templates from selected part category"
msgstr ""
-#: part/serializers.py:844
+#: part/serializers.py:862
msgid "Existing Image"
msgstr ""
-#: part/serializers.py:845
+#: part/serializers.py:863
msgid "Filename of an existing part image"
msgstr ""
-#: part/serializers.py:862
+#: part/serializers.py:880
msgid "Image file does not exist"
msgstr ""
-#: part/serializers.py:1068
+#: part/serializers.py:1086
msgid "Limit stocktake report to a particular part, and any variant parts"
msgstr ""
-#: part/serializers.py:1078
+#: part/serializers.py:1096
msgid "Limit stocktake report to a particular part category, and any child categories"
msgstr ""
-#: part/serializers.py:1088
+#: part/serializers.py:1106
msgid "Limit stocktake report to a particular stock location, and any child locations"
msgstr ""
-#: part/serializers.py:1094
+#: part/serializers.py:1112
msgid "Exclude External Stock"
msgstr ""
-#: part/serializers.py:1095
+#: part/serializers.py:1113
msgid "Exclude stock items in external locations"
msgstr ""
-#: part/serializers.py:1100
+#: part/serializers.py:1118
msgid "Generate Report"
msgstr ""
-#: part/serializers.py:1101
+#: part/serializers.py:1119
msgid "Generate report file containing calculated stocktake data"
msgstr ""
-#: part/serializers.py:1106
+#: part/serializers.py:1124
msgid "Update Parts"
msgstr ""
-#: part/serializers.py:1107
+#: part/serializers.py:1125
msgid "Update specified parts with calculated stocktake data"
msgstr ""
-#: part/serializers.py:1115
+#: part/serializers.py:1133
msgid "Stocktake functionality is not enabled"
msgstr ""
-#: part/serializers.py:1221
+#: part/serializers.py:1239
msgid "Override calculated value for minimum price"
msgstr ""
-#: part/serializers.py:1228
+#: part/serializers.py:1246
msgid "Minimum price currency"
msgstr ""
-#: part/serializers.py:1236
+#: part/serializers.py:1254
msgid "Override calculated value for maximum price"
msgstr ""
-#: part/serializers.py:1243
+#: part/serializers.py:1261
msgid "Maximum price currency"
msgstr ""
-#: part/serializers.py:1272
+#: part/serializers.py:1290
msgid "Update"
msgstr ""
-#: part/serializers.py:1273
+#: part/serializers.py:1291
msgid "Update pricing for this part"
msgstr ""
-#: part/serializers.py:1296
+#: part/serializers.py:1314
#, python-brace-format
msgid "Could not convert from provided currencies to {default_currency}"
msgstr ""
-#: part/serializers.py:1303
+#: part/serializers.py:1321
msgid "Minimum price must not be greater than maximum price"
msgstr ""
-#: part/serializers.py:1306
+#: part/serializers.py:1324
msgid "Maximum price must not be less than minimum price"
msgstr ""
-#: part/serializers.py:1632
+#: part/serializers.py:1660
msgid "Select part to copy BOM from"
msgstr ""
-#: part/serializers.py:1640
+#: part/serializers.py:1668
msgid "Remove Existing Data"
msgstr ""
-#: part/serializers.py:1641
+#: part/serializers.py:1669
msgid "Remove existing BOM items before copying"
msgstr ""
-#: part/serializers.py:1646
+#: part/serializers.py:1674
msgid "Include Inherited"
msgstr ""
-#: part/serializers.py:1647
+#: part/serializers.py:1675
msgid "Include BOM items which are inherited from templated parts"
msgstr ""
-#: part/serializers.py:1652
+#: part/serializers.py:1680
msgid "Skip Invalid Rows"
msgstr ""
-#: part/serializers.py:1653
+#: part/serializers.py:1681
msgid "Enable this option to skip invalid rows"
msgstr ""
-#: part/serializers.py:1658
+#: part/serializers.py:1686
msgid "Copy Substitute Parts"
msgstr ""
-#: part/serializers.py:1659
+#: part/serializers.py:1687
msgid "Copy substitute parts when duplicate BOM items"
msgstr ""
-#: part/serializers.py:1693
+#: part/serializers.py:1721
msgid "Clear Existing BOM"
msgstr ""
-#: part/serializers.py:1694
+#: part/serializers.py:1722
msgid "Delete existing BOM items before uploading"
msgstr ""
-#: part/serializers.py:1724
+#: part/serializers.py:1752
msgid "No part column specified"
msgstr ""
-#: part/serializers.py:1768
+#: part/serializers.py:1796
msgid "Multiple matching parts found"
msgstr ""
-#: part/serializers.py:1771
+#: part/serializers.py:1799
msgid "No matching part found"
msgstr ""
-#: part/serializers.py:1774
+#: part/serializers.py:1802
msgid "Part is not designated as a component"
msgstr ""
-#: part/serializers.py:1783
+#: part/serializers.py:1811
msgid "Quantity not provided"
msgstr ""
-#: part/serializers.py:1791
+#: part/serializers.py:1819
msgid "Invalid quantity"
msgstr ""
-#: part/serializers.py:1812
+#: part/serializers.py:1840
msgid "At least one BOM item is required"
msgstr ""
@@ -7221,7 +7253,7 @@ msgid "Validate BOM"
msgstr ""
#: part/templates/part/detail.html:283 part/templates/part/detail.html:284
-#: templates/js/translated/bom.js:1314 templates/js/translated/bom.js:1315
+#: templates/js/translated/bom.js:1320 templates/js/translated/bom.js:1321
msgid "Add BOM Item"
msgstr ""
@@ -7405,7 +7437,7 @@ msgstr ""
msgid "Allocated to Sales Orders"
msgstr ""
-#: part/templates/part/part_base.html:235 templates/js/translated/bom.js:1213
+#: part/templates/part/part_base.html:235 templates/js/translated/bom.js:1219
msgid "Can Build"
msgstr ""
@@ -8784,7 +8816,7 @@ msgstr ""
msgid "Where is this stock item located?"
msgstr ""
-#: stock/models.py:786 stock/serializers.py:1318
+#: stock/models.py:786 stock/serializers.py:1324
msgid "Packaging this stock item is stored in"
msgstr ""
@@ -8796,7 +8828,7 @@ msgstr ""
msgid "Serial number for this item"
msgstr "Numéro de série pour cet article"
-#: stock/models.py:830 stock/serializers.py:1301
+#: stock/models.py:830 stock/serializers.py:1307
msgid "Batch code for this stock item"
msgstr ""
@@ -8905,7 +8937,7 @@ msgstr ""
msgid "Serialized stock cannot be merged"
msgstr ""
-#: stock/models.py:1639 stock/serializers.py:1207
+#: stock/models.py:1639 stock/serializers.py:1213
msgid "Duplicate stock items"
msgstr ""
@@ -8986,7 +9018,7 @@ msgstr ""
msgid "Enter serial numbers for new items"
msgstr "Entrez les numéros de série pour les nouveaux articles"
-#: stock/serializers.py:473 stock/serializers.py:1164 stock/serializers.py:1420
+#: stock/serializers.py:473 stock/serializers.py:1170 stock/serializers.py:1426
msgid "Destination stock location"
msgstr ""
@@ -9059,77 +9091,78 @@ msgstr ""
msgid "No stock items selected"
msgstr ""
-#: stock/serializers.py:863 stock/templates/stock/location.html:165
+#: stock/serializers.py:863 stock/serializers.py:926
+#: stock/templates/stock/location.html:165
#: stock/templates/stock/location.html:213
#: stock/templates/stock/location_sidebar.html:5
msgid "Sublocations"
msgstr ""
-#: stock/serializers.py:1036
+#: stock/serializers.py:1042
msgid "Part must be salable"
msgstr ""
-#: stock/serializers.py:1040
+#: stock/serializers.py:1046
msgid "Item is allocated to a sales order"
msgstr ""
-#: stock/serializers.py:1044
+#: stock/serializers.py:1050
msgid "Item is allocated to a build order"
msgstr ""
-#: stock/serializers.py:1068
+#: stock/serializers.py:1074
msgid "Customer to assign stock items"
msgstr ""
-#: stock/serializers.py:1074
+#: stock/serializers.py:1080
msgid "Selected company is not a customer"
msgstr ""
-#: stock/serializers.py:1082
+#: stock/serializers.py:1088
msgid "Stock assignment notes"
msgstr ""
-#: stock/serializers.py:1092 stock/serializers.py:1346
+#: stock/serializers.py:1098 stock/serializers.py:1352
msgid "A list of stock items must be provided"
msgstr ""
-#: stock/serializers.py:1171
+#: stock/serializers.py:1177
msgid "Stock merging notes"
msgstr ""
-#: stock/serializers.py:1176
+#: stock/serializers.py:1182
msgid "Allow mismatched suppliers"
msgstr ""
-#: stock/serializers.py:1177
+#: stock/serializers.py:1183
msgid "Allow stock items with different supplier parts to be merged"
msgstr ""
-#: stock/serializers.py:1182
+#: stock/serializers.py:1188
msgid "Allow mismatched status"
msgstr ""
-#: stock/serializers.py:1183
+#: stock/serializers.py:1189
msgid "Allow stock items with different status codes to be merged"
msgstr ""
-#: stock/serializers.py:1193
+#: stock/serializers.py:1199
msgid "At least two stock items must be provided"
msgstr ""
-#: stock/serializers.py:1260
+#: stock/serializers.py:1266
msgid "No Change"
msgstr ""
-#: stock/serializers.py:1289
+#: stock/serializers.py:1295
msgid "StockItem primary key value"
msgstr ""
-#: stock/serializers.py:1308
+#: stock/serializers.py:1314
msgid "Stock item status code"
msgstr ""
-#: stock/serializers.py:1336
+#: stock/serializers.py:1342
msgid "Stock transaction notes"
msgstr ""
@@ -10662,7 +10695,7 @@ msgid "The following parts are low on required stock"
msgstr ""
#: templates/email/build_order_required_stock.html:18
-#: templates/js/translated/bom.js:1668 templates/js/translated/build.js:2557
+#: templates/js/translated/bom.js:1674 templates/js/translated/build.js:2557
msgid "Required Quantity"
msgstr "Quantité requise"
@@ -10676,7 +10709,7 @@ msgid "Click on the following link to view this part"
msgstr ""
#: templates/email/low_stock_notification.html:18
-#: templates/js/translated/part.js:3209
+#: templates/js/translated/part.js:3218
msgid "Minimum Quantity"
msgstr ""
@@ -11051,62 +11084,68 @@ msgstr ""
msgid "No pricing available"
msgstr ""
-#: templates/js/translated/bom.js:1182 templates/js/translated/build.js:2596
+#: templates/js/translated/bom.js:1184 templates/js/translated/build.js:2622
+#, fuzzy
+#| msgid "External Link"
+msgid "External stock"
+msgstr "Lien Externe"
+
+#: templates/js/translated/bom.js:1188 templates/js/translated/build.js:2596
#: templates/js/translated/sales_order.js:1910
msgid "No Stock Available"
msgstr ""
-#: templates/js/translated/bom.js:1187 templates/js/translated/build.js:2600
+#: templates/js/translated/bom.js:1193 templates/js/translated/build.js:2600
msgid "Includes variant and substitute stock"
msgstr ""
-#: templates/js/translated/bom.js:1189 templates/js/translated/build.js:2602
+#: templates/js/translated/bom.js:1195 templates/js/translated/build.js:2602
#: templates/js/translated/part.js:1256
#: templates/js/translated/sales_order.js:1907
msgid "Includes variant stock"
msgstr ""
-#: templates/js/translated/bom.js:1191 templates/js/translated/build.js:2604
+#: templates/js/translated/bom.js:1197 templates/js/translated/build.js:2604
msgid "Includes substitute stock"
msgstr ""
-#: templates/js/translated/bom.js:1219 templates/js/translated/build.js:2587
+#: templates/js/translated/bom.js:1225 templates/js/translated/build.js:2587
msgid "Consumable item"
msgstr ""
-#: templates/js/translated/bom.js:1279
+#: templates/js/translated/bom.js:1285
msgid "Validate BOM Item"
msgstr ""
-#: templates/js/translated/bom.js:1281
+#: templates/js/translated/bom.js:1287
msgid "This line has been validated"
msgstr ""
-#: templates/js/translated/bom.js:1283
+#: templates/js/translated/bom.js:1289
msgid "Edit substitute parts"
msgstr ""
-#: templates/js/translated/bom.js:1285 templates/js/translated/bom.js:1480
+#: templates/js/translated/bom.js:1291 templates/js/translated/bom.js:1486
msgid "Edit BOM Item"
msgstr ""
-#: templates/js/translated/bom.js:1287
+#: templates/js/translated/bom.js:1293
msgid "Delete BOM Item"
msgstr ""
-#: templates/js/translated/bom.js:1307
+#: templates/js/translated/bom.js:1313
msgid "View BOM"
msgstr ""
-#: templates/js/translated/bom.js:1391
+#: templates/js/translated/bom.js:1397
msgid "No BOM items found"
msgstr ""
-#: templates/js/translated/bom.js:1651 templates/js/translated/build.js:2486
+#: templates/js/translated/bom.js:1657 templates/js/translated/build.js:2486
msgid "Required Part"
msgstr ""
-#: templates/js/translated/bom.js:1677
+#: templates/js/translated/bom.js:1683
msgid "Inherited from parent BOM"
msgstr ""
@@ -11449,29 +11488,29 @@ msgstr ""
msgid "Sufficient stock available"
msgstr ""
-#: templates/js/translated/build.js:2643
+#: templates/js/translated/build.js:2647
msgid "Consumable Item"
msgstr ""
-#: templates/js/translated/build.js:2648
+#: templates/js/translated/build.js:2652
msgid "Tracked item"
msgstr ""
-#: templates/js/translated/build.js:2655
+#: templates/js/translated/build.js:2659
#: templates/js/translated/sales_order.js:2016
msgid "Build stock"
msgstr ""
-#: templates/js/translated/build.js:2660 templates/js/translated/stock.js:1829
+#: templates/js/translated/build.js:2664 templates/js/translated/stock.js:1829
msgid "Order stock"
msgstr ""
-#: templates/js/translated/build.js:2664
+#: templates/js/translated/build.js:2668
#: templates/js/translated/sales_order.js:2010
msgid "Allocate stock"
msgstr ""
-#: templates/js/translated/build.js:2668
+#: templates/js/translated/build.js:2672
msgid "Remove stock allocation"
msgstr ""
@@ -12313,64 +12352,64 @@ msgstr ""
msgid "Subscribed category"
msgstr ""
-#: templates/js/translated/part.js:2855
+#: templates/js/translated/part.js:2864
msgid "No test templates matching query"
msgstr ""
-#: templates/js/translated/part.js:2877 templates/js/translated/search.js:342
+#: templates/js/translated/part.js:2886 templates/js/translated/search.js:342
msgid "results"
msgstr ""
-#: templates/js/translated/part.js:2927 templates/js/translated/stock.js:1446
+#: templates/js/translated/part.js:2936 templates/js/translated/stock.js:1446
msgid "Edit test result"
msgstr ""
-#: templates/js/translated/part.js:2928 templates/js/translated/stock.js:1447
+#: templates/js/translated/part.js:2937 templates/js/translated/stock.js:1447
#: templates/js/translated/stock.js:1692
msgid "Delete test result"
msgstr ""
-#: templates/js/translated/part.js:2932
+#: templates/js/translated/part.js:2941
msgid "This test is defined for a parent part"
msgstr ""
-#: templates/js/translated/part.js:2948
+#: templates/js/translated/part.js:2957
msgid "Edit Test Result Template"
msgstr ""
-#: templates/js/translated/part.js:2962
+#: templates/js/translated/part.js:2971
msgid "Delete Test Result Template"
msgstr ""
-#: templates/js/translated/part.js:3041 templates/js/translated/part.js:3042
+#: templates/js/translated/part.js:3050 templates/js/translated/part.js:3051
msgid "No date specified"
msgstr ""
-#: templates/js/translated/part.js:3044
+#: templates/js/translated/part.js:3053
msgid "Specified date is in the past"
msgstr ""
-#: templates/js/translated/part.js:3050
+#: templates/js/translated/part.js:3059
msgid "Speculative"
msgstr ""
-#: templates/js/translated/part.js:3100
+#: templates/js/translated/part.js:3109
msgid "No scheduling information available for this part"
msgstr ""
-#: templates/js/translated/part.js:3106
+#: templates/js/translated/part.js:3115
msgid "Error fetching scheduling information for this part"
msgstr ""
-#: templates/js/translated/part.js:3202
+#: templates/js/translated/part.js:3211
msgid "Scheduled Stock Quantities"
msgstr ""
-#: templates/js/translated/part.js:3218
+#: templates/js/translated/part.js:3227
msgid "Maximum Quantity"
msgstr ""
-#: templates/js/translated/part.js:3263
+#: templates/js/translated/part.js:3272
msgid "Minimum Stock Level"
msgstr ""
@@ -14052,4 +14091,3 @@ msgstr "Droit de modifier des élément"
#: users/models.py:413
msgid "Permission to delete items"
msgstr "Droit de supprimer des éléments"
-
diff --git a/InvenTree/locale/he/LC_MESSAGES/django.po b/InvenTree/locale/he/LC_MESSAGES/django.po
index 4de37ba244..5ee21f0b8c 100644
--- a/InvenTree/locale/he/LC_MESSAGES/django.po
+++ b/InvenTree/locale/he/LC_MESSAGES/django.po
@@ -2,7 +2,7 @@ msgid ""
msgstr ""
"Project-Id-Version: inventree\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2024-02-28 04:05+0000\n"
+"POT-Creation-Date: 2024-03-05 00:41+0000\n"
"PO-Revision-Date: 2024-02-28 07:23\n"
"Last-Translator: \n"
"Language-Team: Hebrew\n"
@@ -66,9 +66,9 @@ msgstr "הזן תאריך סיום"
#: report/templates/report/inventree_build_order_base.html:172
#: stock/admin.py:226 stock/models.py:2335 stock/models.py:2451
#: stock/serializers.py:479 stock/serializers.py:632 stock/serializers.py:728
-#: stock/serializers.py:778 stock/serializers.py:1081 stock/serializers.py:1170
-#: stock/serializers.py:1335 stock/templates/stock/stock_sidebar.html:25
-#: templates/js/translated/barcode.js:143 templates/js/translated/bom.js:1259
+#: stock/serializers.py:778 stock/serializers.py:1087 stock/serializers.py:1176
+#: stock/serializers.py:1341 stock/templates/stock/stock_sidebar.html:25
+#: templates/js/translated/barcode.js:143 templates/js/translated/bom.js:1265
#: templates/js/translated/company.js:1674 templates/js/translated/order.js:347
#: templates/js/translated/part.js:1080
#: templates/js/translated/purchase_order.js:2201
@@ -523,7 +523,7 @@ msgstr "שם"
#: templates/js/translated/order.js:298 templates/js/translated/part.js:1238
#: templates/js/translated/part.js:1483 templates/js/translated/part.js:1621
#: templates/js/translated/part.js:1958 templates/js/translated/part.js:2355
-#: templates/js/translated/part.js:2785 templates/js/translated/part.js:2887
+#: templates/js/translated/part.js:2785 templates/js/translated/part.js:2896
#: templates/js/translated/plugin.js:80
#: templates/js/translated/purchase_order.js:1707
#: templates/js/translated/purchase_order.js:1850
@@ -678,7 +678,7 @@ msgstr ""
msgid "Downloading images from remote URL is not enabled"
msgstr ""
-#: InvenTree/status.py:66 part/serializers.py:1120
+#: InvenTree/status.py:66 part/serializers.py:1138
msgid "Background worker check failed"
msgstr ""
@@ -960,7 +960,7 @@ msgid "Tracked"
msgstr ""
#: build/api.py:285 part/admin.py:144 templates/js/translated/build.js:1741
-#: templates/js/translated/build.js:2626
+#: templates/js/translated/build.js:2630
#: templates/js/translated/sales_order.js:1929
#: templates/js/translated/table_filters.js:571
msgid "Allocated"
@@ -1044,11 +1044,11 @@ msgstr ""
#: build/models.py:199 build/templates/build/build_base.html:97
#: build/templates/build/detail.html:29 company/models.py:1044
#: order/models.py:1389 order/models.py:1532 order/models.py:1533
-#: part/api.py:1528 part/models.py:389 part/models.py:3003 part/models.py:3147
-#: part/models.py:3291 part/models.py:3314 part/models.py:3335
-#: part/models.py:3357 part/models.py:3458 part/models.py:3754
-#: part/models.py:3885 part/models.py:3978 part/models.py:4339
-#: part/serializers.py:1066 part/serializers.py:1631
+#: part/api.py:1528 part/api.py:1820 part/models.py:389 part/models.py:3003
+#: part/models.py:3147 part/models.py:3291 part/models.py:3314
+#: part/models.py:3335 part/models.py:3357 part/models.py:3458
+#: part/models.py:3754 part/models.py:3885 part/models.py:3978
+#: part/models.py:4339 part/serializers.py:1084 part/serializers.py:1659
#: part/templates/part/part_app_base.html:8
#: part/templates/part/part_pricing.html:12
#: part/templates/part/upload_bom.html:52
@@ -1147,7 +1147,7 @@ msgid "Build status code"
msgstr ""
#: build/models.py:264 build/serializers.py:280 order/serializers.py:549
-#: stock/models.py:826 stock/serializers.py:1300
+#: stock/models.py:826 stock/serializers.py:1306
#: templates/js/translated/purchase_order.js:1129
msgid "Batch Code"
msgstr ""
@@ -1242,48 +1242,48 @@ msgstr ""
msgid "Project code for this build order"
msgstr ""
-#: build/models.py:559
+#: build/models.py:575
#, python-brace-format
msgid "Build order {build} has been completed"
msgstr ""
-#: build/models.py:565
+#: build/models.py:581
msgid "A build order has been completed"
msgstr ""
-#: build/models.py:783 build/models.py:858
+#: build/models.py:799 build/models.py:874
msgid "No build output specified"
msgstr ""
-#: build/models.py:786
+#: build/models.py:802
msgid "Build output is already completed"
msgstr ""
-#: build/models.py:789
+#: build/models.py:805
msgid "Build output does not match Build Order"
msgstr ""
-#: build/models.py:862 build/serializers.py:223 build/serializers.py:262
+#: build/models.py:878 build/serializers.py:223 build/serializers.py:262
#: build/serializers.py:831 order/models.py:526 order/serializers.py:401
-#: order/serializers.py:544 part/serializers.py:1423 part/serializers.py:1789
+#: order/serializers.py:544 part/serializers.py:1442 part/serializers.py:1817
#: stock/models.py:665 stock/models.py:1477 stock/serializers.py:450
msgid "Quantity must be greater than zero"
msgstr ""
-#: build/models.py:867 build/serializers.py:228
+#: build/models.py:883 build/serializers.py:228
msgid "Quantity cannot be greater than the output quantity"
msgstr ""
-#: build/models.py:924 build/serializers.py:533
+#: build/models.py:940 build/serializers.py:533
#, python-brace-format
msgid "Build output {serial} has not passed all required tests"
msgstr ""
-#: build/models.py:1286
+#: build/models.py:1302
msgid "Build object"
msgstr ""
-#: build/models.py:1300 build/models.py:1558 build/serializers.py:210
+#: build/models.py:1316 build/models.py:1574 build/serializers.py:210
#: build/serializers.py:247 build/templates/build/build_base.html:102
#: build/templates/build/detail.html:34 common/models.py:2432
#: order/models.py:1247 order/models.py:1902 order/serializers.py:1306
@@ -1310,7 +1310,7 @@ msgstr ""
#: templates/js/translated/company.js:1808
#: templates/js/translated/model_renderers.js:230
#: templates/js/translated/order.js:304 templates/js/translated/part.js:961
-#: templates/js/translated/part.js:1811 templates/js/translated/part.js:3332
+#: templates/js/translated/part.js:1811 templates/js/translated/part.js:3341
#: templates/js/translated/pricing.js:381
#: templates/js/translated/pricing.js:474
#: templates/js/translated/pricing.js:522
@@ -1330,38 +1330,38 @@ msgstr ""
msgid "Quantity"
msgstr "כמות"
-#: build/models.py:1301
+#: build/models.py:1317
msgid "Required quantity for build order"
msgstr ""
-#: build/models.py:1381
+#: build/models.py:1397
msgid "Build item must specify a build output, as master part is marked as trackable"
msgstr ""
-#: build/models.py:1390
+#: build/models.py:1406
#, python-brace-format
msgid "Allocated quantity ({q}) must not exceed available stock quantity ({a})"
msgstr ""
-#: build/models.py:1400 order/models.py:1853
+#: build/models.py:1416 order/models.py:1853
msgid "Stock item is over-allocated"
msgstr ""
-#: build/models.py:1406 order/models.py:1856
+#: build/models.py:1422 order/models.py:1856
msgid "Allocation quantity must be greater than zero"
msgstr ""
-#: build/models.py:1412
+#: build/models.py:1428
msgid "Quantity must be 1 for serialized stock"
msgstr ""
-#: build/models.py:1473
+#: build/models.py:1489
msgid "Selected stock item does not match BOM line"
msgstr ""
-#: build/models.py:1545 build/serializers.py:811 order/serializers.py:1150
-#: order/serializers.py:1171 stock/serializers.py:544 stock/serializers.py:1019
-#: stock/serializers.py:1131 stock/templates/stock/item_base.html:10
+#: build/models.py:1561 build/serializers.py:811 order/serializers.py:1150
+#: order/serializers.py:1171 stock/serializers.py:544 stock/serializers.py:1025
+#: stock/serializers.py:1137 stock/templates/stock/item_base.html:10
#: stock/templates/stock/item_base.html:23
#: stock/templates/stock/item_base.html:194
#: templates/js/translated/build.js:1742
@@ -1376,19 +1376,19 @@ msgstr ""
msgid "Stock Item"
msgstr ""
-#: build/models.py:1546
+#: build/models.py:1562
msgid "Source stock item"
msgstr ""
-#: build/models.py:1559
+#: build/models.py:1575
msgid "Stock quantity to allocate to build"
msgstr ""
-#: build/models.py:1567
+#: build/models.py:1583
msgid "Install into"
msgstr ""
-#: build/models.py:1568
+#: build/models.py:1584
msgid "Destination stock item"
msgstr ""
@@ -1452,9 +1452,9 @@ msgid "A list of build outputs must be provided"
msgstr ""
#: build/serializers.py:426 build/serializers.py:498 order/serializers.py:533
-#: order/serializers.py:641 order/serializers.py:1646 part/serializers.py:1086
+#: order/serializers.py:641 order/serializers.py:1646 part/serializers.py:1104
#: stock/serializers.py:472 stock/serializers.py:627 stock/serializers.py:723
-#: stock/serializers.py:1163 stock/serializers.py:1419
+#: stock/serializers.py:1169 stock/serializers.py:1425
#: stock/templates/stock/item_base.html:394
#: templates/js/translated/barcode.js:547
#: templates/js/translated/barcode.js:795 templates/js/translated/build.js:999
@@ -1494,7 +1494,7 @@ msgstr ""
#: build/serializers.py:505 build/templates/build/build_base.html:151
#: build/templates/build/detail.html:62 order/models.py:910
#: order/models.py:2005 order/serializers.py:565 stock/admin.py:165
-#: stock/serializers.py:774 stock/serializers.py:1307
+#: stock/serializers.py:774 stock/serializers.py:1313
#: stock/templates/stock/item_base.html:427
#: templates/js/translated/barcode.js:252 templates/js/translated/build.js:2189
#: templates/js/translated/purchase_order.js:1308
@@ -1602,7 +1602,7 @@ msgstr ""
msgid "bom_item.part must point to the same part as the build order"
msgstr ""
-#: build/serializers.py:817 stock/serializers.py:1032
+#: build/serializers.py:817 stock/serializers.py:1038
msgid "Item must be in stock"
msgstr ""
@@ -1659,44 +1659,45 @@ msgstr ""
msgid "Allocate optional BOM items to build order"
msgstr ""
-#: build/serializers.py:1096 part/models.py:3895 part/models.py:4331
+#: build/serializers.py:1097 part/models.py:3895 part/models.py:4331
#: stock/api.py:745
msgid "BOM Item"
msgstr ""
-#: build/serializers.py:1105 templates/js/translated/index.js:130
+#: build/serializers.py:1106 templates/js/translated/index.js:130
msgid "Allocated Stock"
msgstr ""
-#: build/serializers.py:1110 part/admin.py:132 part/bom.py:173
-#: part/serializers.py:1441 part/templates/part/part_base.html:210
-#: templates/js/translated/bom.js:1202 templates/js/translated/build.js:2614
-#: templates/js/translated/part.js:709 templates/js/translated/part.js:2148
+#: build/serializers.py:1111 part/admin.py:132 part/bom.py:173
+#: part/serializers.py:798 part/serializers.py:1460
+#: part/templates/part/part_base.html:210 templates/js/translated/bom.js:1208
+#: templates/js/translated/build.js:2614 templates/js/translated/part.js:709
+#: templates/js/translated/part.js:2148
#: templates/js/translated/table_filters.js:170
msgid "On Order"
msgstr ""
-#: build/serializers.py:1115 part/serializers.py:1443
+#: build/serializers.py:1116 part/serializers.py:1462
#: templates/js/translated/build.js:2618
#: templates/js/translated/table_filters.js:360
msgid "In Production"
msgstr ""
-#: build/serializers.py:1120 part/bom.py:172 part/serializers.py:1454
+#: build/serializers.py:1121 part/bom.py:172 part/serializers.py:1473
#: part/templates/part/part_base.html:192
#: templates/js/translated/sales_order.js:1893
msgid "Available Stock"
msgstr ""
-#: build/tasks.py:149
+#: build/tasks.py:171
msgid "Stock required for build order"
msgstr ""
-#: build/tasks.py:166
+#: build/tasks.py:188
msgid "Overdue Build Order"
msgstr ""
-#: build/tasks.py:171
+#: build/tasks.py:193
#, python-brace-format
msgid "Build order {bo} is now overdue"
msgstr ""
@@ -1990,27 +1991,31 @@ msgstr ""
msgid "Order Parts"
msgstr ""
-#: build/templates/build/detail.html:210
-msgid "Incomplete Build Outputs"
-msgstr ""
-
-#: build/templates/build/detail.html:214
-msgid "Create new build output"
+#: build/templates/build/detail.html:205
+msgid "Available stock has been filtered based on specified source location for this build order"
msgstr ""
#: build/templates/build/detail.html:215
+msgid "Incomplete Build Outputs"
+msgstr ""
+
+#: build/templates/build/detail.html:219
+msgid "Create new build output"
+msgstr ""
+
+#: build/templates/build/detail.html:220
msgid "New Build Output"
msgstr ""
-#: build/templates/build/detail.html:232 build/templates/build/sidebar.html:15
+#: build/templates/build/detail.html:237 build/templates/build/sidebar.html:15
msgid "Consumed Stock"
msgstr ""
-#: build/templates/build/detail.html:244
+#: build/templates/build/detail.html:249
msgid "Completed Build Outputs"
msgstr ""
-#: build/templates/build/detail.html:256 build/templates/build/sidebar.html:19
+#: build/templates/build/detail.html:261 build/templates/build/sidebar.html:19
#: company/templates/company/detail.html:229
#: company/templates/company/manufacturer_part.html:141
#: company/templates/company/manufacturer_part_sidebar.html:9
@@ -2026,15 +2031,15 @@ msgstr ""
msgid "Attachments"
msgstr ""
-#: build/templates/build/detail.html:271
+#: build/templates/build/detail.html:276
msgid "Build Notes"
msgstr ""
-#: build/templates/build/detail.html:426
+#: build/templates/build/detail.html:434
msgid "Allocation Complete"
msgstr ""
-#: build/templates/build/detail.html:427
+#: build/templates/build/detail.html:435
msgid "All lines have been fully allocated"
msgstr ""
@@ -2436,7 +2441,7 @@ msgid "Parts are templates by default"
msgstr ""
#: common/models.py:1456 part/admin.py:91 part/admin.py:431 part/models.py:1015
-#: templates/js/translated/bom.js:1633
+#: templates/js/translated/bom.js:1639
#: templates/js/translated/table_filters.js:330
#: templates/js/translated/table_filters.js:721
msgid "Assembly"
@@ -3495,7 +3500,7 @@ msgstr ""
msgid "Price break quantity"
msgstr ""
-#: common/models.py:2440 company/serializers.py:484 order/admin.py:42
+#: common/models.py:2440 company/serializers.py:486 order/admin.py:42
#: order/models.py:1321 order/models.py:2226
#: templates/js/translated/company.js:1813 templates/js/translated/part.js:1885
#: templates/js/translated/pricing.js:621
@@ -3972,7 +3977,7 @@ msgstr ""
#: company/models.py:495 company/templates/company/company_base.html:76
#: company/templates/company/manufacturer_part.html:90
-#: company/templates/company/supplier_part.html:145 part/serializers.py:497
+#: company/templates/company/supplier_part.html:145 part/serializers.py:505
#: stock/templates/stock/item_base.html:207
#: templates/js/translated/company.js:506
#: templates/js/translated/company.js:1108
@@ -3987,7 +3992,7 @@ msgid "Select manufacturer"
msgstr ""
#: company/models.py:502 company/templates/company/manufacturer_part.html:101
-#: company/templates/company/supplier_part.html:153 part/serializers.py:507
+#: company/templates/company/supplier_part.html:153 part/serializers.py:515
#: templates/js/translated/company.js:351
#: templates/js/translated/company.js:1107
#: templates/js/translated/company.js:1302
@@ -4059,7 +4064,7 @@ msgstr ""
#: company/models.py:795 company/templates/company/company_base.html:81
#: company/templates/company/supplier_part.html:129 order/models.py:453
#: order/templates/order/order_base.html:136 part/bom.py:272 part/bom.py:310
-#: part/serializers.py:481 plugin/builtin/suppliers/digikey.py:25
+#: part/serializers.py:489 plugin/builtin/suppliers/digikey.py:25
#: plugin/builtin/suppliers/lcsc.py:26 plugin/builtin/suppliers/mouser.py:24
#: plugin/builtin/suppliers/tme.py:26 stock/templates/stock/item_base.html:224
#: templates/email/overdue_purchase_order.html:16
@@ -4076,7 +4081,7 @@ msgstr ""
msgid "Select supplier"
msgstr ""
-#: company/models.py:802 part/serializers.py:492
+#: company/models.py:802 part/serializers.py:500
msgid "Supplier stock keeping unit"
msgstr ""
@@ -4112,7 +4117,7 @@ msgid "Minimum charge (e.g. stocking fee)"
msgstr ""
#: company/models.py:851 company/templates/company/supplier_part.html:160
-#: stock/admin.py:224 stock/models.py:785 stock/serializers.py:1317
+#: stock/admin.py:224 stock/models.py:785 stock/serializers.py:1323
#: stock/templates/stock/item_base.html:240
#: templates/js/translated/company.js:1636
#: templates/js/translated/stock.js:2387
@@ -4157,7 +4162,7 @@ msgstr ""
msgid "Date of last update of availability data"
msgstr ""
-#: company/serializers.py:153
+#: company/serializers.py:155
msgid "Default currency used for this supplier"
msgstr ""
@@ -4218,7 +4223,7 @@ msgstr ""
#: company/templates/company/company_base.html:86 order/models.py:898
#: order/models.py:1993 order/templates/order/return_order_base.html:131
#: order/templates/order/sales_order_base.html:144 stock/models.py:807
-#: stock/models.py:808 stock/serializers.py:1067
+#: stock/models.py:808 stock/serializers.py:1073
#: stock/templates/stock/item_base.html:405
#: templates/email/overdue_sales_order.html:16
#: templates/js/translated/company.js:502
@@ -4429,8 +4434,9 @@ msgstr ""
#: company/templates/company/manufacturer_part.html:119
#: company/templates/company/supplier_part.html:15 company/views.py:31
-#: part/admin.py:122 part/templates/part/part_sidebar.html:33
-#: templates/InvenTree/search.html:190 templates/navbar.html:48
+#: part/admin.py:122 part/serializers.py:802
+#: part/templates/part/part_sidebar.html:33 templates/InvenTree/search.html:190
+#: templates/navbar.html:48
msgid "Suppliers"
msgstr ""
@@ -4528,7 +4534,7 @@ msgid "No supplier information available"
msgstr ""
#: company/templates/company/supplier_part.html:139 part/bom.py:279
-#: part/bom.py:311 part/serializers.py:491
+#: part/bom.py:311 part/serializers.py:499
#: templates/js/translated/company.js:349 templates/js/translated/part.js:1786
#: templates/js/translated/pricing.js:510
#: templates/js/translated/purchase_order.js:1851
@@ -4577,10 +4583,12 @@ msgstr ""
msgid "Update Part Availability"
msgstr ""
-#: company/templates/company/supplier_part_sidebar.html:5 part/stocktake.py:223
+#: company/templates/company/supplier_part_sidebar.html:5
+#: part/serializers.py:801 part/stocktake.py:223
#: part/templates/part/category.html:183
#: part/templates/part/category_sidebar.html:17 stock/admin.py:69
-#: stock/serializers.py:760 stock/templates/stock/location.html:170
+#: stock/serializers.py:760 stock/serializers.py:924
+#: stock/templates/stock/location.html:170
#: stock/templates/stock/location.html:184
#: stock/templates/stock/location.html:196
#: stock/templates/stock/location_sidebar.html:7
@@ -4640,7 +4648,7 @@ msgid "Label template file"
msgstr ""
#: label/models.py:143 part/models.py:3484 report/models.py:322
-#: templates/js/translated/part.js:2891
+#: templates/js/translated/part.js:2900
#: templates/js/translated/table_filters.js:481
msgid "Enabled"
msgstr ""
@@ -5733,7 +5741,7 @@ msgid "Pending Shipments"
msgstr ""
#: order/templates/order/sales_order_detail.html:71
-#: templates/js/translated/bom.js:1271 templates/js/translated/filters.js:296
+#: templates/js/translated/bom.js:1277 templates/js/translated/filters.js:296
msgid "Actions"
msgstr ""
@@ -5861,10 +5869,10 @@ msgstr ""
msgid "Category Path"
msgstr ""
-#: part/admin.py:323 part/models.py:390 part/serializers.py:259
-#: part/serializers.py:373 part/templates/part/cat_link.html:3
-#: part/templates/part/category.html:23 part/templates/part/category.html:141
-#: part/templates/part/category.html:161
+#: part/admin.py:323 part/models.py:390 part/serializers.py:112
+#: part/serializers.py:265 part/serializers.py:381
+#: part/templates/part/cat_link.html:3 part/templates/part/category.html:23
+#: part/templates/part/category.html:141 part/templates/part/category.html:161
#: part/templates/part/category_sidebar.html:9
#: templates/InvenTree/index.html:36 templates/InvenTree/search.html:84
#: templates/InvenTree/settings/sidebar.html:47
@@ -5889,13 +5897,13 @@ msgstr ""
msgid "Part IPN"
msgstr ""
-#: part/admin.py:421 part/serializers.py:1220
+#: part/admin.py:421 part/serializers.py:1238
#: templates/js/translated/pricing.js:358
#: templates/js/translated/pricing.js:1024
msgid "Minimum Price"
msgstr ""
-#: part/admin.py:426 part/serializers.py:1235
+#: part/admin.py:426 part/serializers.py:1253
#: templates/js/translated/pricing.js:353
#: templates/js/translated/pricing.js:1032
msgid "Maximum Price"
@@ -5974,7 +5982,7 @@ msgid "This option must be selected"
msgstr ""
#: part/api.py:1541 part/models.py:895 part/models.py:3385 part/models.py:3831
-#: part/serializers.py:388 part/serializers.py:1076
+#: part/serializers.py:396 part/serializers.py:1094
#: part/templates/part/part_base.html:260 stock/api.py:733
#: templates/InvenTree/settings/settings_staff_js.html:300
#: templates/js/translated/notification.js:60
@@ -5982,12 +5990,17 @@ msgstr ""
msgid "Category"
msgstr ""
+#: part/api.py:1828
+msgid "Uses"
+msgstr ""
+
#: part/bom.py:170 part/models.py:100 part/models.py:938
#: part/templates/part/category.html:116 part/templates/part/part_base.html:367
msgid "Default Location"
msgstr ""
-#: part/bom.py:171 templates/email/low_stock_notification.html:16
+#: part/bom.py:171 part/serializers.py:803
+#: templates/email/low_stock_notification.html:16
msgid "Total Stock"
msgstr ""
@@ -6010,7 +6023,8 @@ msgstr ""
msgid "Default location for parts in this category"
msgstr ""
-#: part/models.py:106 stock/models.py:165 templates/js/translated/stock.js:2736
+#: part/models.py:106 stock/models.py:165 templates/js/translated/part.js:2810
+#: templates/js/translated/stock.js:2736
#: templates/js/translated/table_filters.js:239
#: templates/js/translated/table_filters.js:283
msgid "Structural"
@@ -6418,7 +6432,7 @@ msgstr ""
msgid "Test with this name already exists for this part"
msgstr ""
-#: part/models.py:3464 templates/js/translated/part.js:2870
+#: part/models.py:3464 templates/js/translated/part.js:2879
msgid "Test Name"
msgstr ""
@@ -6446,7 +6460,7 @@ msgstr ""
msgid "Is this test enabled?"
msgstr ""
-#: part/models.py:3489 templates/js/translated/part.js:2899
+#: part/models.py:3489 templates/js/translated/part.js:2908
#: templates/js/translated/table_filters.js:477
msgid "Required"
msgstr ""
@@ -6455,7 +6469,7 @@ msgstr ""
msgid "Is this test required to pass?"
msgstr ""
-#: part/models.py:3495 templates/js/translated/part.js:2907
+#: part/models.py:3495 templates/js/translated/part.js:2916
msgid "Requires Value"
msgstr ""
@@ -6463,7 +6477,7 @@ msgstr ""
msgid "Does this test require a value when adding a test result?"
msgstr ""
-#: part/models.py:3501 templates/js/translated/part.js:2914
+#: part/models.py:3501 templates/js/translated/part.js:2923
msgid "Requires Attachment"
msgstr ""
@@ -6685,311 +6699,323 @@ msgstr ""
msgid "Duplicate relationship already exists"
msgstr ""
-#: part/serializers.py:128 part/templates/part/category.html:122
-#: part/templates/part/category.html:207
+#: part/serializers.py:114 part/serializers.py:134
+#: part/templates/part/category.html:122 part/templates/part/category.html:207
#: part/templates/part/category_sidebar.html:7
msgid "Subcategories"
msgstr ""
-#: part/serializers.py:172
+#: part/serializers.py:178
msgid "Results"
msgstr ""
-#: part/serializers.py:173
+#: part/serializers.py:179
msgid "Number of results recorded against this template"
msgstr ""
-#: part/serializers.py:197 part/serializers.py:215 stock/serializers.py:384
+#: part/serializers.py:203 part/serializers.py:221 stock/serializers.py:384
msgid "Purchase currency of this stock item"
msgstr ""
-#: part/serializers.py:260
+#: part/serializers.py:266
msgid "Number of parts using this template"
msgstr ""
-#: part/serializers.py:379
+#: part/serializers.py:387
msgid "No parts selected"
msgstr ""
-#: part/serializers.py:389
+#: part/serializers.py:397
msgid "Select category"
msgstr ""
-#: part/serializers.py:419
+#: part/serializers.py:427
msgid "Original Part"
msgstr ""
-#: part/serializers.py:420
+#: part/serializers.py:428
msgid "Select original part to duplicate"
msgstr ""
-#: part/serializers.py:425
+#: part/serializers.py:433
msgid "Copy Image"
msgstr ""
-#: part/serializers.py:426
+#: part/serializers.py:434
msgid "Copy image from original part"
msgstr ""
-#: part/serializers.py:432 part/templates/part/detail.html:277
+#: part/serializers.py:440 part/templates/part/detail.html:277
msgid "Copy BOM"
msgstr ""
-#: part/serializers.py:433
+#: part/serializers.py:441
msgid "Copy bill of materials from original part"
msgstr ""
-#: part/serializers.py:439
+#: part/serializers.py:447
msgid "Copy Parameters"
msgstr ""
-#: part/serializers.py:440
+#: part/serializers.py:448
msgid "Copy parameter data from original part"
msgstr ""
-#: part/serializers.py:446
+#: part/serializers.py:454
msgid "Copy Notes"
msgstr ""
-#: part/serializers.py:447
+#: part/serializers.py:455
msgid "Copy notes from original part"
msgstr ""
-#: part/serializers.py:460
+#: part/serializers.py:468
msgid "Initial Stock Quantity"
msgstr ""
-#: part/serializers.py:462
+#: part/serializers.py:470
msgid "Specify initial stock quantity for this Part. If quantity is zero, no stock is added."
msgstr ""
-#: part/serializers.py:469
+#: part/serializers.py:477
msgid "Initial Stock Location"
msgstr ""
-#: part/serializers.py:470
+#: part/serializers.py:478
msgid "Specify initial stock location for this Part"
msgstr ""
-#: part/serializers.py:482
+#: part/serializers.py:490
msgid "Select supplier (or leave blank to skip)"
msgstr ""
-#: part/serializers.py:498
+#: part/serializers.py:506
msgid "Select manufacturer (or leave blank to skip)"
msgstr ""
-#: part/serializers.py:508
+#: part/serializers.py:516
msgid "Manufacturer part number"
msgstr ""
-#: part/serializers.py:515
+#: part/serializers.py:523
msgid "Selected company is not a valid supplier"
msgstr ""
-#: part/serializers.py:524
+#: part/serializers.py:532
msgid "Selected company is not a valid manufacturer"
msgstr ""
-#: part/serializers.py:535
+#: part/serializers.py:543
msgid "Manufacturer part matching this MPN already exists"
msgstr ""
-#: part/serializers.py:542
+#: part/serializers.py:550
msgid "Supplier part matching this SKU already exists"
msgstr ""
-#: part/serializers.py:815 part/templates/part/copy_part.html:9
+#: part/serializers.py:804
+msgid "External Stock"
+msgstr ""
+
+#: part/serializers.py:806
+msgid "Unallocated Stock"
+msgstr ""
+
+#: part/serializers.py:808
+msgid "Variant Stock"
+msgstr ""
+
+#: part/serializers.py:833 part/templates/part/copy_part.html:9
#: templates/js/translated/part.js:471
msgid "Duplicate Part"
msgstr ""
-#: part/serializers.py:816
+#: part/serializers.py:834
msgid "Copy initial data from another Part"
msgstr ""
-#: part/serializers.py:822 templates/js/translated/part.js:102
+#: part/serializers.py:840 templates/js/translated/part.js:102
msgid "Initial Stock"
msgstr ""
-#: part/serializers.py:823
+#: part/serializers.py:841
msgid "Create Part with initial stock quantity"
msgstr ""
-#: part/serializers.py:829
+#: part/serializers.py:847
msgid "Supplier Information"
msgstr ""
-#: part/serializers.py:830
+#: part/serializers.py:848
msgid "Add initial supplier information for this part"
msgstr ""
-#: part/serializers.py:838
+#: part/serializers.py:856
msgid "Copy Category Parameters"
msgstr ""
-#: part/serializers.py:839
+#: part/serializers.py:857
msgid "Copy parameter templates from selected part category"
msgstr ""
-#: part/serializers.py:844
+#: part/serializers.py:862
msgid "Existing Image"
msgstr ""
-#: part/serializers.py:845
+#: part/serializers.py:863
msgid "Filename of an existing part image"
msgstr ""
-#: part/serializers.py:862
+#: part/serializers.py:880
msgid "Image file does not exist"
msgstr ""
-#: part/serializers.py:1068
+#: part/serializers.py:1086
msgid "Limit stocktake report to a particular part, and any variant parts"
msgstr ""
-#: part/serializers.py:1078
+#: part/serializers.py:1096
msgid "Limit stocktake report to a particular part category, and any child categories"
msgstr ""
-#: part/serializers.py:1088
+#: part/serializers.py:1106
msgid "Limit stocktake report to a particular stock location, and any child locations"
msgstr ""
-#: part/serializers.py:1094
+#: part/serializers.py:1112
msgid "Exclude External Stock"
msgstr ""
-#: part/serializers.py:1095
+#: part/serializers.py:1113
msgid "Exclude stock items in external locations"
msgstr ""
-#: part/serializers.py:1100
+#: part/serializers.py:1118
msgid "Generate Report"
msgstr ""
-#: part/serializers.py:1101
+#: part/serializers.py:1119
msgid "Generate report file containing calculated stocktake data"
msgstr ""
-#: part/serializers.py:1106
+#: part/serializers.py:1124
msgid "Update Parts"
msgstr ""
-#: part/serializers.py:1107
+#: part/serializers.py:1125
msgid "Update specified parts with calculated stocktake data"
msgstr ""
-#: part/serializers.py:1115
+#: part/serializers.py:1133
msgid "Stocktake functionality is not enabled"
msgstr ""
-#: part/serializers.py:1221
+#: part/serializers.py:1239
msgid "Override calculated value for minimum price"
msgstr ""
-#: part/serializers.py:1228
+#: part/serializers.py:1246
msgid "Minimum price currency"
msgstr ""
-#: part/serializers.py:1236
+#: part/serializers.py:1254
msgid "Override calculated value for maximum price"
msgstr ""
-#: part/serializers.py:1243
+#: part/serializers.py:1261
msgid "Maximum price currency"
msgstr ""
-#: part/serializers.py:1272
+#: part/serializers.py:1290
msgid "Update"
msgstr ""
-#: part/serializers.py:1273
+#: part/serializers.py:1291
msgid "Update pricing for this part"
msgstr ""
-#: part/serializers.py:1296
+#: part/serializers.py:1314
#, python-brace-format
msgid "Could not convert from provided currencies to {default_currency}"
msgstr ""
-#: part/serializers.py:1303
+#: part/serializers.py:1321
msgid "Minimum price must not be greater than maximum price"
msgstr ""
-#: part/serializers.py:1306
+#: part/serializers.py:1324
msgid "Maximum price must not be less than minimum price"
msgstr ""
-#: part/serializers.py:1632
+#: part/serializers.py:1660
msgid "Select part to copy BOM from"
msgstr ""
-#: part/serializers.py:1640
+#: part/serializers.py:1668
msgid "Remove Existing Data"
msgstr ""
-#: part/serializers.py:1641
+#: part/serializers.py:1669
msgid "Remove existing BOM items before copying"
msgstr ""
-#: part/serializers.py:1646
+#: part/serializers.py:1674
msgid "Include Inherited"
msgstr ""
-#: part/serializers.py:1647
+#: part/serializers.py:1675
msgid "Include BOM items which are inherited from templated parts"
msgstr ""
-#: part/serializers.py:1652
+#: part/serializers.py:1680
msgid "Skip Invalid Rows"
msgstr ""
-#: part/serializers.py:1653
+#: part/serializers.py:1681
msgid "Enable this option to skip invalid rows"
msgstr ""
-#: part/serializers.py:1658
+#: part/serializers.py:1686
msgid "Copy Substitute Parts"
msgstr ""
-#: part/serializers.py:1659
+#: part/serializers.py:1687
msgid "Copy substitute parts when duplicate BOM items"
msgstr ""
-#: part/serializers.py:1693
+#: part/serializers.py:1721
msgid "Clear Existing BOM"
msgstr ""
-#: part/serializers.py:1694
+#: part/serializers.py:1722
msgid "Delete existing BOM items before uploading"
msgstr ""
-#: part/serializers.py:1724
+#: part/serializers.py:1752
msgid "No part column specified"
msgstr ""
-#: part/serializers.py:1768
+#: part/serializers.py:1796
msgid "Multiple matching parts found"
msgstr ""
-#: part/serializers.py:1771
+#: part/serializers.py:1799
msgid "No matching part found"
msgstr ""
-#: part/serializers.py:1774
+#: part/serializers.py:1802
msgid "Part is not designated as a component"
msgstr ""
-#: part/serializers.py:1783
+#: part/serializers.py:1811
msgid "Quantity not provided"
msgstr ""
-#: part/serializers.py:1791
+#: part/serializers.py:1819
msgid "Invalid quantity"
msgstr ""
-#: part/serializers.py:1812
+#: part/serializers.py:1840
msgid "At least one BOM item is required"
msgstr ""
@@ -7221,7 +7247,7 @@ msgid "Validate BOM"
msgstr ""
#: part/templates/part/detail.html:283 part/templates/part/detail.html:284
-#: templates/js/translated/bom.js:1314 templates/js/translated/bom.js:1315
+#: templates/js/translated/bom.js:1320 templates/js/translated/bom.js:1321
msgid "Add BOM Item"
msgstr ""
@@ -7405,7 +7431,7 @@ msgstr ""
msgid "Allocated to Sales Orders"
msgstr ""
-#: part/templates/part/part_base.html:235 templates/js/translated/bom.js:1213
+#: part/templates/part/part_base.html:235 templates/js/translated/bom.js:1219
msgid "Can Build"
msgstr ""
@@ -8784,7 +8810,7 @@ msgstr ""
msgid "Where is this stock item located?"
msgstr ""
-#: stock/models.py:786 stock/serializers.py:1318
+#: stock/models.py:786 stock/serializers.py:1324
msgid "Packaging this stock item is stored in"
msgstr ""
@@ -8796,7 +8822,7 @@ msgstr ""
msgid "Serial number for this item"
msgstr ""
-#: stock/models.py:830 stock/serializers.py:1301
+#: stock/models.py:830 stock/serializers.py:1307
msgid "Batch code for this stock item"
msgstr ""
@@ -8905,7 +8931,7 @@ msgstr ""
msgid "Serialized stock cannot be merged"
msgstr ""
-#: stock/models.py:1639 stock/serializers.py:1207
+#: stock/models.py:1639 stock/serializers.py:1213
msgid "Duplicate stock items"
msgstr ""
@@ -8986,7 +9012,7 @@ msgstr ""
msgid "Enter serial numbers for new items"
msgstr ""
-#: stock/serializers.py:473 stock/serializers.py:1164 stock/serializers.py:1420
+#: stock/serializers.py:473 stock/serializers.py:1170 stock/serializers.py:1426
msgid "Destination stock location"
msgstr ""
@@ -9059,77 +9085,78 @@ msgstr ""
msgid "No stock items selected"
msgstr ""
-#: stock/serializers.py:863 stock/templates/stock/location.html:165
+#: stock/serializers.py:863 stock/serializers.py:926
+#: stock/templates/stock/location.html:165
#: stock/templates/stock/location.html:213
#: stock/templates/stock/location_sidebar.html:5
msgid "Sublocations"
msgstr ""
-#: stock/serializers.py:1036
+#: stock/serializers.py:1042
msgid "Part must be salable"
msgstr ""
-#: stock/serializers.py:1040
+#: stock/serializers.py:1046
msgid "Item is allocated to a sales order"
msgstr ""
-#: stock/serializers.py:1044
+#: stock/serializers.py:1050
msgid "Item is allocated to a build order"
msgstr ""
-#: stock/serializers.py:1068
+#: stock/serializers.py:1074
msgid "Customer to assign stock items"
msgstr ""
-#: stock/serializers.py:1074
+#: stock/serializers.py:1080
msgid "Selected company is not a customer"
msgstr ""
-#: stock/serializers.py:1082
+#: stock/serializers.py:1088
msgid "Stock assignment notes"
msgstr ""
-#: stock/serializers.py:1092 stock/serializers.py:1346
+#: stock/serializers.py:1098 stock/serializers.py:1352
msgid "A list of stock items must be provided"
msgstr ""
-#: stock/serializers.py:1171
+#: stock/serializers.py:1177
msgid "Stock merging notes"
msgstr ""
-#: stock/serializers.py:1176
+#: stock/serializers.py:1182
msgid "Allow mismatched suppliers"
msgstr ""
-#: stock/serializers.py:1177
+#: stock/serializers.py:1183
msgid "Allow stock items with different supplier parts to be merged"
msgstr ""
-#: stock/serializers.py:1182
+#: stock/serializers.py:1188
msgid "Allow mismatched status"
msgstr ""
-#: stock/serializers.py:1183
+#: stock/serializers.py:1189
msgid "Allow stock items with different status codes to be merged"
msgstr ""
-#: stock/serializers.py:1193
+#: stock/serializers.py:1199
msgid "At least two stock items must be provided"
msgstr ""
-#: stock/serializers.py:1260
+#: stock/serializers.py:1266
msgid "No Change"
msgstr ""
-#: stock/serializers.py:1289
+#: stock/serializers.py:1295
msgid "StockItem primary key value"
msgstr ""
-#: stock/serializers.py:1308
+#: stock/serializers.py:1314
msgid "Stock item status code"
msgstr ""
-#: stock/serializers.py:1336
+#: stock/serializers.py:1342
msgid "Stock transaction notes"
msgstr ""
@@ -10662,7 +10689,7 @@ msgid "The following parts are low on required stock"
msgstr ""
#: templates/email/build_order_required_stock.html:18
-#: templates/js/translated/bom.js:1668 templates/js/translated/build.js:2557
+#: templates/js/translated/bom.js:1674 templates/js/translated/build.js:2557
msgid "Required Quantity"
msgstr ""
@@ -10676,7 +10703,7 @@ msgid "Click on the following link to view this part"
msgstr ""
#: templates/email/low_stock_notification.html:18
-#: templates/js/translated/part.js:3209
+#: templates/js/translated/part.js:3218
msgid "Minimum Quantity"
msgstr ""
@@ -11051,62 +11078,66 @@ msgstr ""
msgid "No pricing available"
msgstr ""
-#: templates/js/translated/bom.js:1182 templates/js/translated/build.js:2596
+#: templates/js/translated/bom.js:1184 templates/js/translated/build.js:2622
+msgid "External stock"
+msgstr ""
+
+#: templates/js/translated/bom.js:1188 templates/js/translated/build.js:2596
#: templates/js/translated/sales_order.js:1910
msgid "No Stock Available"
msgstr ""
-#: templates/js/translated/bom.js:1187 templates/js/translated/build.js:2600
+#: templates/js/translated/bom.js:1193 templates/js/translated/build.js:2600
msgid "Includes variant and substitute stock"
msgstr ""
-#: templates/js/translated/bom.js:1189 templates/js/translated/build.js:2602
+#: templates/js/translated/bom.js:1195 templates/js/translated/build.js:2602
#: templates/js/translated/part.js:1256
#: templates/js/translated/sales_order.js:1907
msgid "Includes variant stock"
msgstr ""
-#: templates/js/translated/bom.js:1191 templates/js/translated/build.js:2604
+#: templates/js/translated/bom.js:1197 templates/js/translated/build.js:2604
msgid "Includes substitute stock"
msgstr ""
-#: templates/js/translated/bom.js:1219 templates/js/translated/build.js:2587
+#: templates/js/translated/bom.js:1225 templates/js/translated/build.js:2587
msgid "Consumable item"
msgstr ""
-#: templates/js/translated/bom.js:1279
+#: templates/js/translated/bom.js:1285
msgid "Validate BOM Item"
msgstr ""
-#: templates/js/translated/bom.js:1281
+#: templates/js/translated/bom.js:1287
msgid "This line has been validated"
msgstr ""
-#: templates/js/translated/bom.js:1283
+#: templates/js/translated/bom.js:1289
msgid "Edit substitute parts"
msgstr ""
-#: templates/js/translated/bom.js:1285 templates/js/translated/bom.js:1480
+#: templates/js/translated/bom.js:1291 templates/js/translated/bom.js:1486
msgid "Edit BOM Item"
msgstr ""
-#: templates/js/translated/bom.js:1287
+#: templates/js/translated/bom.js:1293
msgid "Delete BOM Item"
msgstr ""
-#: templates/js/translated/bom.js:1307
+#: templates/js/translated/bom.js:1313
msgid "View BOM"
msgstr ""
-#: templates/js/translated/bom.js:1391
+#: templates/js/translated/bom.js:1397
msgid "No BOM items found"
msgstr ""
-#: templates/js/translated/bom.js:1651 templates/js/translated/build.js:2486
+#: templates/js/translated/bom.js:1657 templates/js/translated/build.js:2486
msgid "Required Part"
msgstr ""
-#: templates/js/translated/bom.js:1677
+#: templates/js/translated/bom.js:1683
msgid "Inherited from parent BOM"
msgstr ""
@@ -11449,29 +11480,29 @@ msgstr ""
msgid "Sufficient stock available"
msgstr ""
-#: templates/js/translated/build.js:2643
+#: templates/js/translated/build.js:2647
msgid "Consumable Item"
msgstr ""
-#: templates/js/translated/build.js:2648
+#: templates/js/translated/build.js:2652
msgid "Tracked item"
msgstr ""
-#: templates/js/translated/build.js:2655
+#: templates/js/translated/build.js:2659
#: templates/js/translated/sales_order.js:2016
msgid "Build stock"
msgstr ""
-#: templates/js/translated/build.js:2660 templates/js/translated/stock.js:1829
+#: templates/js/translated/build.js:2664 templates/js/translated/stock.js:1829
msgid "Order stock"
msgstr ""
-#: templates/js/translated/build.js:2664
+#: templates/js/translated/build.js:2668
#: templates/js/translated/sales_order.js:2010
msgid "Allocate stock"
msgstr ""
-#: templates/js/translated/build.js:2668
+#: templates/js/translated/build.js:2672
msgid "Remove stock allocation"
msgstr ""
@@ -12313,64 +12344,64 @@ msgstr ""
msgid "Subscribed category"
msgstr ""
-#: templates/js/translated/part.js:2855
+#: templates/js/translated/part.js:2864
msgid "No test templates matching query"
msgstr ""
-#: templates/js/translated/part.js:2877 templates/js/translated/search.js:342
+#: templates/js/translated/part.js:2886 templates/js/translated/search.js:342
msgid "results"
msgstr ""
-#: templates/js/translated/part.js:2927 templates/js/translated/stock.js:1446
+#: templates/js/translated/part.js:2936 templates/js/translated/stock.js:1446
msgid "Edit test result"
msgstr ""
-#: templates/js/translated/part.js:2928 templates/js/translated/stock.js:1447
+#: templates/js/translated/part.js:2937 templates/js/translated/stock.js:1447
#: templates/js/translated/stock.js:1692
msgid "Delete test result"
msgstr ""
-#: templates/js/translated/part.js:2932
+#: templates/js/translated/part.js:2941
msgid "This test is defined for a parent part"
msgstr ""
-#: templates/js/translated/part.js:2948
+#: templates/js/translated/part.js:2957
msgid "Edit Test Result Template"
msgstr ""
-#: templates/js/translated/part.js:2962
+#: templates/js/translated/part.js:2971
msgid "Delete Test Result Template"
msgstr ""
-#: templates/js/translated/part.js:3041 templates/js/translated/part.js:3042
+#: templates/js/translated/part.js:3050 templates/js/translated/part.js:3051
msgid "No date specified"
msgstr ""
-#: templates/js/translated/part.js:3044
+#: templates/js/translated/part.js:3053
msgid "Specified date is in the past"
msgstr ""
-#: templates/js/translated/part.js:3050
+#: templates/js/translated/part.js:3059
msgid "Speculative"
msgstr ""
-#: templates/js/translated/part.js:3100
+#: templates/js/translated/part.js:3109
msgid "No scheduling information available for this part"
msgstr ""
-#: templates/js/translated/part.js:3106
+#: templates/js/translated/part.js:3115
msgid "Error fetching scheduling information for this part"
msgstr ""
-#: templates/js/translated/part.js:3202
+#: templates/js/translated/part.js:3211
msgid "Scheduled Stock Quantities"
msgstr ""
-#: templates/js/translated/part.js:3218
+#: templates/js/translated/part.js:3227
msgid "Maximum Quantity"
msgstr ""
-#: templates/js/translated/part.js:3263
+#: templates/js/translated/part.js:3272
msgid "Minimum Stock Level"
msgstr ""
@@ -14052,4 +14083,3 @@ msgstr ""
#: users/models.py:413
msgid "Permission to delete items"
msgstr ""
-
diff --git a/InvenTree/locale/hi/LC_MESSAGES/django.po b/InvenTree/locale/hi/LC_MESSAGES/django.po
index 272618c1c6..fa9044a7f6 100644
--- a/InvenTree/locale/hi/LC_MESSAGES/django.po
+++ b/InvenTree/locale/hi/LC_MESSAGES/django.po
@@ -2,7 +2,7 @@ msgid ""
msgstr ""
"Project-Id-Version: inventree\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2024-02-28 04:05+0000\n"
+"POT-Creation-Date: 2024-03-05 00:41+0000\n"
"PO-Revision-Date: 2024-02-28 07:23\n"
"Last-Translator: \n"
"Language-Team: Hindi\n"
@@ -66,9 +66,9 @@ msgstr "तारीख दर्ज करें"
#: report/templates/report/inventree_build_order_base.html:172
#: stock/admin.py:226 stock/models.py:2335 stock/models.py:2451
#: stock/serializers.py:479 stock/serializers.py:632 stock/serializers.py:728
-#: stock/serializers.py:778 stock/serializers.py:1081 stock/serializers.py:1170
-#: stock/serializers.py:1335 stock/templates/stock/stock_sidebar.html:25
-#: templates/js/translated/barcode.js:143 templates/js/translated/bom.js:1259
+#: stock/serializers.py:778 stock/serializers.py:1087 stock/serializers.py:1176
+#: stock/serializers.py:1341 stock/templates/stock/stock_sidebar.html:25
+#: templates/js/translated/barcode.js:143 templates/js/translated/bom.js:1265
#: templates/js/translated/company.js:1674 templates/js/translated/order.js:347
#: templates/js/translated/part.js:1080
#: templates/js/translated/purchase_order.js:2201
@@ -523,7 +523,7 @@ msgstr ""
#: templates/js/translated/order.js:298 templates/js/translated/part.js:1238
#: templates/js/translated/part.js:1483 templates/js/translated/part.js:1621
#: templates/js/translated/part.js:1958 templates/js/translated/part.js:2355
-#: templates/js/translated/part.js:2785 templates/js/translated/part.js:2887
+#: templates/js/translated/part.js:2785 templates/js/translated/part.js:2896
#: templates/js/translated/plugin.js:80
#: templates/js/translated/purchase_order.js:1707
#: templates/js/translated/purchase_order.js:1850
@@ -678,7 +678,7 @@ msgstr ""
msgid "Downloading images from remote URL is not enabled"
msgstr ""
-#: InvenTree/status.py:66 part/serializers.py:1120
+#: InvenTree/status.py:66 part/serializers.py:1138
msgid "Background worker check failed"
msgstr ""
@@ -960,7 +960,7 @@ msgid "Tracked"
msgstr ""
#: build/api.py:285 part/admin.py:144 templates/js/translated/build.js:1741
-#: templates/js/translated/build.js:2626
+#: templates/js/translated/build.js:2630
#: templates/js/translated/sales_order.js:1929
#: templates/js/translated/table_filters.js:571
msgid "Allocated"
@@ -1044,11 +1044,11 @@ msgstr ""
#: build/models.py:199 build/templates/build/build_base.html:97
#: build/templates/build/detail.html:29 company/models.py:1044
#: order/models.py:1389 order/models.py:1532 order/models.py:1533
-#: part/api.py:1528 part/models.py:389 part/models.py:3003 part/models.py:3147
-#: part/models.py:3291 part/models.py:3314 part/models.py:3335
-#: part/models.py:3357 part/models.py:3458 part/models.py:3754
-#: part/models.py:3885 part/models.py:3978 part/models.py:4339
-#: part/serializers.py:1066 part/serializers.py:1631
+#: part/api.py:1528 part/api.py:1820 part/models.py:389 part/models.py:3003
+#: part/models.py:3147 part/models.py:3291 part/models.py:3314
+#: part/models.py:3335 part/models.py:3357 part/models.py:3458
+#: part/models.py:3754 part/models.py:3885 part/models.py:3978
+#: part/models.py:4339 part/serializers.py:1084 part/serializers.py:1659
#: part/templates/part/part_app_base.html:8
#: part/templates/part/part_pricing.html:12
#: part/templates/part/upload_bom.html:52
@@ -1147,7 +1147,7 @@ msgid "Build status code"
msgstr ""
#: build/models.py:264 build/serializers.py:280 order/serializers.py:549
-#: stock/models.py:826 stock/serializers.py:1300
+#: stock/models.py:826 stock/serializers.py:1306
#: templates/js/translated/purchase_order.js:1129
msgid "Batch Code"
msgstr ""
@@ -1242,48 +1242,48 @@ msgstr ""
msgid "Project code for this build order"
msgstr ""
-#: build/models.py:559
+#: build/models.py:575
#, python-brace-format
msgid "Build order {build} has been completed"
msgstr ""
-#: build/models.py:565
+#: build/models.py:581
msgid "A build order has been completed"
msgstr ""
-#: build/models.py:783 build/models.py:858
+#: build/models.py:799 build/models.py:874
msgid "No build output specified"
msgstr ""
-#: build/models.py:786
+#: build/models.py:802
msgid "Build output is already completed"
msgstr ""
-#: build/models.py:789
+#: build/models.py:805
msgid "Build output does not match Build Order"
msgstr ""
-#: build/models.py:862 build/serializers.py:223 build/serializers.py:262
+#: build/models.py:878 build/serializers.py:223 build/serializers.py:262
#: build/serializers.py:831 order/models.py:526 order/serializers.py:401
-#: order/serializers.py:544 part/serializers.py:1423 part/serializers.py:1789
+#: order/serializers.py:544 part/serializers.py:1442 part/serializers.py:1817
#: stock/models.py:665 stock/models.py:1477 stock/serializers.py:450
msgid "Quantity must be greater than zero"
msgstr ""
-#: build/models.py:867 build/serializers.py:228
+#: build/models.py:883 build/serializers.py:228
msgid "Quantity cannot be greater than the output quantity"
msgstr ""
-#: build/models.py:924 build/serializers.py:533
+#: build/models.py:940 build/serializers.py:533
#, python-brace-format
msgid "Build output {serial} has not passed all required tests"
msgstr ""
-#: build/models.py:1286
+#: build/models.py:1302
msgid "Build object"
msgstr ""
-#: build/models.py:1300 build/models.py:1558 build/serializers.py:210
+#: build/models.py:1316 build/models.py:1574 build/serializers.py:210
#: build/serializers.py:247 build/templates/build/build_base.html:102
#: build/templates/build/detail.html:34 common/models.py:2432
#: order/models.py:1247 order/models.py:1902 order/serializers.py:1306
@@ -1310,7 +1310,7 @@ msgstr ""
#: templates/js/translated/company.js:1808
#: templates/js/translated/model_renderers.js:230
#: templates/js/translated/order.js:304 templates/js/translated/part.js:961
-#: templates/js/translated/part.js:1811 templates/js/translated/part.js:3332
+#: templates/js/translated/part.js:1811 templates/js/translated/part.js:3341
#: templates/js/translated/pricing.js:381
#: templates/js/translated/pricing.js:474
#: templates/js/translated/pricing.js:522
@@ -1330,38 +1330,38 @@ msgstr ""
msgid "Quantity"
msgstr ""
-#: build/models.py:1301
+#: build/models.py:1317
msgid "Required quantity for build order"
msgstr ""
-#: build/models.py:1381
+#: build/models.py:1397
msgid "Build item must specify a build output, as master part is marked as trackable"
msgstr ""
-#: build/models.py:1390
+#: build/models.py:1406
#, python-brace-format
msgid "Allocated quantity ({q}) must not exceed available stock quantity ({a})"
msgstr ""
-#: build/models.py:1400 order/models.py:1853
+#: build/models.py:1416 order/models.py:1853
msgid "Stock item is over-allocated"
msgstr ""
-#: build/models.py:1406 order/models.py:1856
+#: build/models.py:1422 order/models.py:1856
msgid "Allocation quantity must be greater than zero"
msgstr ""
-#: build/models.py:1412
+#: build/models.py:1428
msgid "Quantity must be 1 for serialized stock"
msgstr ""
-#: build/models.py:1473
+#: build/models.py:1489
msgid "Selected stock item does not match BOM line"
msgstr ""
-#: build/models.py:1545 build/serializers.py:811 order/serializers.py:1150
-#: order/serializers.py:1171 stock/serializers.py:544 stock/serializers.py:1019
-#: stock/serializers.py:1131 stock/templates/stock/item_base.html:10
+#: build/models.py:1561 build/serializers.py:811 order/serializers.py:1150
+#: order/serializers.py:1171 stock/serializers.py:544 stock/serializers.py:1025
+#: stock/serializers.py:1137 stock/templates/stock/item_base.html:10
#: stock/templates/stock/item_base.html:23
#: stock/templates/stock/item_base.html:194
#: templates/js/translated/build.js:1742
@@ -1376,19 +1376,19 @@ msgstr ""
msgid "Stock Item"
msgstr ""
-#: build/models.py:1546
+#: build/models.py:1562
msgid "Source stock item"
msgstr ""
-#: build/models.py:1559
+#: build/models.py:1575
msgid "Stock quantity to allocate to build"
msgstr ""
-#: build/models.py:1567
+#: build/models.py:1583
msgid "Install into"
msgstr ""
-#: build/models.py:1568
+#: build/models.py:1584
msgid "Destination stock item"
msgstr ""
@@ -1452,9 +1452,9 @@ msgid "A list of build outputs must be provided"
msgstr ""
#: build/serializers.py:426 build/serializers.py:498 order/serializers.py:533
-#: order/serializers.py:641 order/serializers.py:1646 part/serializers.py:1086
+#: order/serializers.py:641 order/serializers.py:1646 part/serializers.py:1104
#: stock/serializers.py:472 stock/serializers.py:627 stock/serializers.py:723
-#: stock/serializers.py:1163 stock/serializers.py:1419
+#: stock/serializers.py:1169 stock/serializers.py:1425
#: stock/templates/stock/item_base.html:394
#: templates/js/translated/barcode.js:547
#: templates/js/translated/barcode.js:795 templates/js/translated/build.js:999
@@ -1494,7 +1494,7 @@ msgstr ""
#: build/serializers.py:505 build/templates/build/build_base.html:151
#: build/templates/build/detail.html:62 order/models.py:910
#: order/models.py:2005 order/serializers.py:565 stock/admin.py:165
-#: stock/serializers.py:774 stock/serializers.py:1307
+#: stock/serializers.py:774 stock/serializers.py:1313
#: stock/templates/stock/item_base.html:427
#: templates/js/translated/barcode.js:252 templates/js/translated/build.js:2189
#: templates/js/translated/purchase_order.js:1308
@@ -1602,7 +1602,7 @@ msgstr ""
msgid "bom_item.part must point to the same part as the build order"
msgstr ""
-#: build/serializers.py:817 stock/serializers.py:1032
+#: build/serializers.py:817 stock/serializers.py:1038
msgid "Item must be in stock"
msgstr ""
@@ -1659,44 +1659,45 @@ msgstr ""
msgid "Allocate optional BOM items to build order"
msgstr ""
-#: build/serializers.py:1096 part/models.py:3895 part/models.py:4331
+#: build/serializers.py:1097 part/models.py:3895 part/models.py:4331
#: stock/api.py:745
msgid "BOM Item"
msgstr ""
-#: build/serializers.py:1105 templates/js/translated/index.js:130
+#: build/serializers.py:1106 templates/js/translated/index.js:130
msgid "Allocated Stock"
msgstr ""
-#: build/serializers.py:1110 part/admin.py:132 part/bom.py:173
-#: part/serializers.py:1441 part/templates/part/part_base.html:210
-#: templates/js/translated/bom.js:1202 templates/js/translated/build.js:2614
-#: templates/js/translated/part.js:709 templates/js/translated/part.js:2148
+#: build/serializers.py:1111 part/admin.py:132 part/bom.py:173
+#: part/serializers.py:798 part/serializers.py:1460
+#: part/templates/part/part_base.html:210 templates/js/translated/bom.js:1208
+#: templates/js/translated/build.js:2614 templates/js/translated/part.js:709
+#: templates/js/translated/part.js:2148
#: templates/js/translated/table_filters.js:170
msgid "On Order"
msgstr ""
-#: build/serializers.py:1115 part/serializers.py:1443
+#: build/serializers.py:1116 part/serializers.py:1462
#: templates/js/translated/build.js:2618
#: templates/js/translated/table_filters.js:360
msgid "In Production"
msgstr ""
-#: build/serializers.py:1120 part/bom.py:172 part/serializers.py:1454
+#: build/serializers.py:1121 part/bom.py:172 part/serializers.py:1473
#: part/templates/part/part_base.html:192
#: templates/js/translated/sales_order.js:1893
msgid "Available Stock"
msgstr ""
-#: build/tasks.py:149
+#: build/tasks.py:171
msgid "Stock required for build order"
msgstr ""
-#: build/tasks.py:166
+#: build/tasks.py:188
msgid "Overdue Build Order"
msgstr ""
-#: build/tasks.py:171
+#: build/tasks.py:193
#, python-brace-format
msgid "Build order {bo} is now overdue"
msgstr ""
@@ -1990,27 +1991,31 @@ msgstr ""
msgid "Order Parts"
msgstr ""
-#: build/templates/build/detail.html:210
-msgid "Incomplete Build Outputs"
-msgstr ""
-
-#: build/templates/build/detail.html:214
-msgid "Create new build output"
+#: build/templates/build/detail.html:205
+msgid "Available stock has been filtered based on specified source location for this build order"
msgstr ""
#: build/templates/build/detail.html:215
+msgid "Incomplete Build Outputs"
+msgstr ""
+
+#: build/templates/build/detail.html:219
+msgid "Create new build output"
+msgstr ""
+
+#: build/templates/build/detail.html:220
msgid "New Build Output"
msgstr ""
-#: build/templates/build/detail.html:232 build/templates/build/sidebar.html:15
+#: build/templates/build/detail.html:237 build/templates/build/sidebar.html:15
msgid "Consumed Stock"
msgstr ""
-#: build/templates/build/detail.html:244
+#: build/templates/build/detail.html:249
msgid "Completed Build Outputs"
msgstr ""
-#: build/templates/build/detail.html:256 build/templates/build/sidebar.html:19
+#: build/templates/build/detail.html:261 build/templates/build/sidebar.html:19
#: company/templates/company/detail.html:229
#: company/templates/company/manufacturer_part.html:141
#: company/templates/company/manufacturer_part_sidebar.html:9
@@ -2026,15 +2031,15 @@ msgstr ""
msgid "Attachments"
msgstr ""
-#: build/templates/build/detail.html:271
+#: build/templates/build/detail.html:276
msgid "Build Notes"
msgstr ""
-#: build/templates/build/detail.html:426
+#: build/templates/build/detail.html:434
msgid "Allocation Complete"
msgstr ""
-#: build/templates/build/detail.html:427
+#: build/templates/build/detail.html:435
msgid "All lines have been fully allocated"
msgstr ""
@@ -2436,7 +2441,7 @@ msgid "Parts are templates by default"
msgstr ""
#: common/models.py:1456 part/admin.py:91 part/admin.py:431 part/models.py:1015
-#: templates/js/translated/bom.js:1633
+#: templates/js/translated/bom.js:1639
#: templates/js/translated/table_filters.js:330
#: templates/js/translated/table_filters.js:721
msgid "Assembly"
@@ -3495,7 +3500,7 @@ msgstr ""
msgid "Price break quantity"
msgstr ""
-#: common/models.py:2440 company/serializers.py:484 order/admin.py:42
+#: common/models.py:2440 company/serializers.py:486 order/admin.py:42
#: order/models.py:1321 order/models.py:2226
#: templates/js/translated/company.js:1813 templates/js/translated/part.js:1885
#: templates/js/translated/pricing.js:621
@@ -3972,7 +3977,7 @@ msgstr ""
#: company/models.py:495 company/templates/company/company_base.html:76
#: company/templates/company/manufacturer_part.html:90
-#: company/templates/company/supplier_part.html:145 part/serializers.py:497
+#: company/templates/company/supplier_part.html:145 part/serializers.py:505
#: stock/templates/stock/item_base.html:207
#: templates/js/translated/company.js:506
#: templates/js/translated/company.js:1108
@@ -3987,7 +3992,7 @@ msgid "Select manufacturer"
msgstr ""
#: company/models.py:502 company/templates/company/manufacturer_part.html:101
-#: company/templates/company/supplier_part.html:153 part/serializers.py:507
+#: company/templates/company/supplier_part.html:153 part/serializers.py:515
#: templates/js/translated/company.js:351
#: templates/js/translated/company.js:1107
#: templates/js/translated/company.js:1302
@@ -4059,7 +4064,7 @@ msgstr ""
#: company/models.py:795 company/templates/company/company_base.html:81
#: company/templates/company/supplier_part.html:129 order/models.py:453
#: order/templates/order/order_base.html:136 part/bom.py:272 part/bom.py:310
-#: part/serializers.py:481 plugin/builtin/suppliers/digikey.py:25
+#: part/serializers.py:489 plugin/builtin/suppliers/digikey.py:25
#: plugin/builtin/suppliers/lcsc.py:26 plugin/builtin/suppliers/mouser.py:24
#: plugin/builtin/suppliers/tme.py:26 stock/templates/stock/item_base.html:224
#: templates/email/overdue_purchase_order.html:16
@@ -4076,7 +4081,7 @@ msgstr ""
msgid "Select supplier"
msgstr ""
-#: company/models.py:802 part/serializers.py:492
+#: company/models.py:802 part/serializers.py:500
msgid "Supplier stock keeping unit"
msgstr ""
@@ -4112,7 +4117,7 @@ msgid "Minimum charge (e.g. stocking fee)"
msgstr ""
#: company/models.py:851 company/templates/company/supplier_part.html:160
-#: stock/admin.py:224 stock/models.py:785 stock/serializers.py:1317
+#: stock/admin.py:224 stock/models.py:785 stock/serializers.py:1323
#: stock/templates/stock/item_base.html:240
#: templates/js/translated/company.js:1636
#: templates/js/translated/stock.js:2387
@@ -4157,7 +4162,7 @@ msgstr ""
msgid "Date of last update of availability data"
msgstr ""
-#: company/serializers.py:153
+#: company/serializers.py:155
msgid "Default currency used for this supplier"
msgstr ""
@@ -4218,7 +4223,7 @@ msgstr ""
#: company/templates/company/company_base.html:86 order/models.py:898
#: order/models.py:1993 order/templates/order/return_order_base.html:131
#: order/templates/order/sales_order_base.html:144 stock/models.py:807
-#: stock/models.py:808 stock/serializers.py:1067
+#: stock/models.py:808 stock/serializers.py:1073
#: stock/templates/stock/item_base.html:405
#: templates/email/overdue_sales_order.html:16
#: templates/js/translated/company.js:502
@@ -4429,8 +4434,9 @@ msgstr ""
#: company/templates/company/manufacturer_part.html:119
#: company/templates/company/supplier_part.html:15 company/views.py:31
-#: part/admin.py:122 part/templates/part/part_sidebar.html:33
-#: templates/InvenTree/search.html:190 templates/navbar.html:48
+#: part/admin.py:122 part/serializers.py:802
+#: part/templates/part/part_sidebar.html:33 templates/InvenTree/search.html:190
+#: templates/navbar.html:48
msgid "Suppliers"
msgstr ""
@@ -4528,7 +4534,7 @@ msgid "No supplier information available"
msgstr ""
#: company/templates/company/supplier_part.html:139 part/bom.py:279
-#: part/bom.py:311 part/serializers.py:491
+#: part/bom.py:311 part/serializers.py:499
#: templates/js/translated/company.js:349 templates/js/translated/part.js:1786
#: templates/js/translated/pricing.js:510
#: templates/js/translated/purchase_order.js:1851
@@ -4577,10 +4583,12 @@ msgstr ""
msgid "Update Part Availability"
msgstr ""
-#: company/templates/company/supplier_part_sidebar.html:5 part/stocktake.py:223
+#: company/templates/company/supplier_part_sidebar.html:5
+#: part/serializers.py:801 part/stocktake.py:223
#: part/templates/part/category.html:183
#: part/templates/part/category_sidebar.html:17 stock/admin.py:69
-#: stock/serializers.py:760 stock/templates/stock/location.html:170
+#: stock/serializers.py:760 stock/serializers.py:924
+#: stock/templates/stock/location.html:170
#: stock/templates/stock/location.html:184
#: stock/templates/stock/location.html:196
#: stock/templates/stock/location_sidebar.html:7
@@ -4640,7 +4648,7 @@ msgid "Label template file"
msgstr ""
#: label/models.py:143 part/models.py:3484 report/models.py:322
-#: templates/js/translated/part.js:2891
+#: templates/js/translated/part.js:2900
#: templates/js/translated/table_filters.js:481
msgid "Enabled"
msgstr ""
@@ -5733,7 +5741,7 @@ msgid "Pending Shipments"
msgstr ""
#: order/templates/order/sales_order_detail.html:71
-#: templates/js/translated/bom.js:1271 templates/js/translated/filters.js:296
+#: templates/js/translated/bom.js:1277 templates/js/translated/filters.js:296
msgid "Actions"
msgstr ""
@@ -5861,10 +5869,10 @@ msgstr ""
msgid "Category Path"
msgstr ""
-#: part/admin.py:323 part/models.py:390 part/serializers.py:259
-#: part/serializers.py:373 part/templates/part/cat_link.html:3
-#: part/templates/part/category.html:23 part/templates/part/category.html:141
-#: part/templates/part/category.html:161
+#: part/admin.py:323 part/models.py:390 part/serializers.py:112
+#: part/serializers.py:265 part/serializers.py:381
+#: part/templates/part/cat_link.html:3 part/templates/part/category.html:23
+#: part/templates/part/category.html:141 part/templates/part/category.html:161
#: part/templates/part/category_sidebar.html:9
#: templates/InvenTree/index.html:36 templates/InvenTree/search.html:84
#: templates/InvenTree/settings/sidebar.html:47
@@ -5889,13 +5897,13 @@ msgstr ""
msgid "Part IPN"
msgstr ""
-#: part/admin.py:421 part/serializers.py:1220
+#: part/admin.py:421 part/serializers.py:1238
#: templates/js/translated/pricing.js:358
#: templates/js/translated/pricing.js:1024
msgid "Minimum Price"
msgstr ""
-#: part/admin.py:426 part/serializers.py:1235
+#: part/admin.py:426 part/serializers.py:1253
#: templates/js/translated/pricing.js:353
#: templates/js/translated/pricing.js:1032
msgid "Maximum Price"
@@ -5974,7 +5982,7 @@ msgid "This option must be selected"
msgstr ""
#: part/api.py:1541 part/models.py:895 part/models.py:3385 part/models.py:3831
-#: part/serializers.py:388 part/serializers.py:1076
+#: part/serializers.py:396 part/serializers.py:1094
#: part/templates/part/part_base.html:260 stock/api.py:733
#: templates/InvenTree/settings/settings_staff_js.html:300
#: templates/js/translated/notification.js:60
@@ -5982,12 +5990,17 @@ msgstr ""
msgid "Category"
msgstr ""
+#: part/api.py:1828
+msgid "Uses"
+msgstr ""
+
#: part/bom.py:170 part/models.py:100 part/models.py:938
#: part/templates/part/category.html:116 part/templates/part/part_base.html:367
msgid "Default Location"
msgstr ""
-#: part/bom.py:171 templates/email/low_stock_notification.html:16
+#: part/bom.py:171 part/serializers.py:803
+#: templates/email/low_stock_notification.html:16
msgid "Total Stock"
msgstr ""
@@ -6010,7 +6023,8 @@ msgstr ""
msgid "Default location for parts in this category"
msgstr ""
-#: part/models.py:106 stock/models.py:165 templates/js/translated/stock.js:2736
+#: part/models.py:106 stock/models.py:165 templates/js/translated/part.js:2810
+#: templates/js/translated/stock.js:2736
#: templates/js/translated/table_filters.js:239
#: templates/js/translated/table_filters.js:283
msgid "Structural"
@@ -6418,7 +6432,7 @@ msgstr ""
msgid "Test with this name already exists for this part"
msgstr ""
-#: part/models.py:3464 templates/js/translated/part.js:2870
+#: part/models.py:3464 templates/js/translated/part.js:2879
msgid "Test Name"
msgstr ""
@@ -6446,7 +6460,7 @@ msgstr ""
msgid "Is this test enabled?"
msgstr ""
-#: part/models.py:3489 templates/js/translated/part.js:2899
+#: part/models.py:3489 templates/js/translated/part.js:2908
#: templates/js/translated/table_filters.js:477
msgid "Required"
msgstr ""
@@ -6455,7 +6469,7 @@ msgstr ""
msgid "Is this test required to pass?"
msgstr ""
-#: part/models.py:3495 templates/js/translated/part.js:2907
+#: part/models.py:3495 templates/js/translated/part.js:2916
msgid "Requires Value"
msgstr ""
@@ -6463,7 +6477,7 @@ msgstr ""
msgid "Does this test require a value when adding a test result?"
msgstr ""
-#: part/models.py:3501 templates/js/translated/part.js:2914
+#: part/models.py:3501 templates/js/translated/part.js:2923
msgid "Requires Attachment"
msgstr ""
@@ -6685,311 +6699,323 @@ msgstr ""
msgid "Duplicate relationship already exists"
msgstr ""
-#: part/serializers.py:128 part/templates/part/category.html:122
-#: part/templates/part/category.html:207
+#: part/serializers.py:114 part/serializers.py:134
+#: part/templates/part/category.html:122 part/templates/part/category.html:207
#: part/templates/part/category_sidebar.html:7
msgid "Subcategories"
msgstr ""
-#: part/serializers.py:172
+#: part/serializers.py:178
msgid "Results"
msgstr ""
-#: part/serializers.py:173
+#: part/serializers.py:179
msgid "Number of results recorded against this template"
msgstr ""
-#: part/serializers.py:197 part/serializers.py:215 stock/serializers.py:384
+#: part/serializers.py:203 part/serializers.py:221 stock/serializers.py:384
msgid "Purchase currency of this stock item"
msgstr ""
-#: part/serializers.py:260
+#: part/serializers.py:266
msgid "Number of parts using this template"
msgstr ""
-#: part/serializers.py:379
+#: part/serializers.py:387
msgid "No parts selected"
msgstr ""
-#: part/serializers.py:389
+#: part/serializers.py:397
msgid "Select category"
msgstr ""
-#: part/serializers.py:419
+#: part/serializers.py:427
msgid "Original Part"
msgstr ""
-#: part/serializers.py:420
+#: part/serializers.py:428
msgid "Select original part to duplicate"
msgstr ""
-#: part/serializers.py:425
+#: part/serializers.py:433
msgid "Copy Image"
msgstr ""
-#: part/serializers.py:426
+#: part/serializers.py:434
msgid "Copy image from original part"
msgstr ""
-#: part/serializers.py:432 part/templates/part/detail.html:277
+#: part/serializers.py:440 part/templates/part/detail.html:277
msgid "Copy BOM"
msgstr ""
-#: part/serializers.py:433
+#: part/serializers.py:441
msgid "Copy bill of materials from original part"
msgstr ""
-#: part/serializers.py:439
+#: part/serializers.py:447
msgid "Copy Parameters"
msgstr ""
-#: part/serializers.py:440
+#: part/serializers.py:448
msgid "Copy parameter data from original part"
msgstr ""
-#: part/serializers.py:446
+#: part/serializers.py:454
msgid "Copy Notes"
msgstr ""
-#: part/serializers.py:447
+#: part/serializers.py:455
msgid "Copy notes from original part"
msgstr ""
-#: part/serializers.py:460
+#: part/serializers.py:468
msgid "Initial Stock Quantity"
msgstr ""
-#: part/serializers.py:462
+#: part/serializers.py:470
msgid "Specify initial stock quantity for this Part. If quantity is zero, no stock is added."
msgstr ""
-#: part/serializers.py:469
+#: part/serializers.py:477
msgid "Initial Stock Location"
msgstr ""
-#: part/serializers.py:470
+#: part/serializers.py:478
msgid "Specify initial stock location for this Part"
msgstr ""
-#: part/serializers.py:482
+#: part/serializers.py:490
msgid "Select supplier (or leave blank to skip)"
msgstr ""
-#: part/serializers.py:498
+#: part/serializers.py:506
msgid "Select manufacturer (or leave blank to skip)"
msgstr ""
-#: part/serializers.py:508
+#: part/serializers.py:516
msgid "Manufacturer part number"
msgstr ""
-#: part/serializers.py:515
+#: part/serializers.py:523
msgid "Selected company is not a valid supplier"
msgstr ""
-#: part/serializers.py:524
+#: part/serializers.py:532
msgid "Selected company is not a valid manufacturer"
msgstr ""
-#: part/serializers.py:535
+#: part/serializers.py:543
msgid "Manufacturer part matching this MPN already exists"
msgstr ""
-#: part/serializers.py:542
+#: part/serializers.py:550
msgid "Supplier part matching this SKU already exists"
msgstr ""
-#: part/serializers.py:815 part/templates/part/copy_part.html:9
+#: part/serializers.py:804
+msgid "External Stock"
+msgstr ""
+
+#: part/serializers.py:806
+msgid "Unallocated Stock"
+msgstr ""
+
+#: part/serializers.py:808
+msgid "Variant Stock"
+msgstr ""
+
+#: part/serializers.py:833 part/templates/part/copy_part.html:9
#: templates/js/translated/part.js:471
msgid "Duplicate Part"
msgstr ""
-#: part/serializers.py:816
+#: part/serializers.py:834
msgid "Copy initial data from another Part"
msgstr ""
-#: part/serializers.py:822 templates/js/translated/part.js:102
+#: part/serializers.py:840 templates/js/translated/part.js:102
msgid "Initial Stock"
msgstr ""
-#: part/serializers.py:823
+#: part/serializers.py:841
msgid "Create Part with initial stock quantity"
msgstr ""
-#: part/serializers.py:829
+#: part/serializers.py:847
msgid "Supplier Information"
msgstr ""
-#: part/serializers.py:830
+#: part/serializers.py:848
msgid "Add initial supplier information for this part"
msgstr ""
-#: part/serializers.py:838
+#: part/serializers.py:856
msgid "Copy Category Parameters"
msgstr ""
-#: part/serializers.py:839
+#: part/serializers.py:857
msgid "Copy parameter templates from selected part category"
msgstr ""
-#: part/serializers.py:844
+#: part/serializers.py:862
msgid "Existing Image"
msgstr ""
-#: part/serializers.py:845
+#: part/serializers.py:863
msgid "Filename of an existing part image"
msgstr ""
-#: part/serializers.py:862
+#: part/serializers.py:880
msgid "Image file does not exist"
msgstr ""
-#: part/serializers.py:1068
+#: part/serializers.py:1086
msgid "Limit stocktake report to a particular part, and any variant parts"
msgstr ""
-#: part/serializers.py:1078
+#: part/serializers.py:1096
msgid "Limit stocktake report to a particular part category, and any child categories"
msgstr ""
-#: part/serializers.py:1088
+#: part/serializers.py:1106
msgid "Limit stocktake report to a particular stock location, and any child locations"
msgstr ""
-#: part/serializers.py:1094
+#: part/serializers.py:1112
msgid "Exclude External Stock"
msgstr ""
-#: part/serializers.py:1095
+#: part/serializers.py:1113
msgid "Exclude stock items in external locations"
msgstr ""
-#: part/serializers.py:1100
+#: part/serializers.py:1118
msgid "Generate Report"
msgstr ""
-#: part/serializers.py:1101
+#: part/serializers.py:1119
msgid "Generate report file containing calculated stocktake data"
msgstr ""
-#: part/serializers.py:1106
+#: part/serializers.py:1124
msgid "Update Parts"
msgstr ""
-#: part/serializers.py:1107
+#: part/serializers.py:1125
msgid "Update specified parts with calculated stocktake data"
msgstr ""
-#: part/serializers.py:1115
+#: part/serializers.py:1133
msgid "Stocktake functionality is not enabled"
msgstr ""
-#: part/serializers.py:1221
+#: part/serializers.py:1239
msgid "Override calculated value for minimum price"
msgstr ""
-#: part/serializers.py:1228
+#: part/serializers.py:1246
msgid "Minimum price currency"
msgstr ""
-#: part/serializers.py:1236
+#: part/serializers.py:1254
msgid "Override calculated value for maximum price"
msgstr ""
-#: part/serializers.py:1243
+#: part/serializers.py:1261
msgid "Maximum price currency"
msgstr ""
-#: part/serializers.py:1272
+#: part/serializers.py:1290
msgid "Update"
msgstr ""
-#: part/serializers.py:1273
+#: part/serializers.py:1291
msgid "Update pricing for this part"
msgstr ""
-#: part/serializers.py:1296
+#: part/serializers.py:1314
#, python-brace-format
msgid "Could not convert from provided currencies to {default_currency}"
msgstr ""
-#: part/serializers.py:1303
+#: part/serializers.py:1321
msgid "Minimum price must not be greater than maximum price"
msgstr ""
-#: part/serializers.py:1306
+#: part/serializers.py:1324
msgid "Maximum price must not be less than minimum price"
msgstr ""
-#: part/serializers.py:1632
+#: part/serializers.py:1660
msgid "Select part to copy BOM from"
msgstr ""
-#: part/serializers.py:1640
+#: part/serializers.py:1668
msgid "Remove Existing Data"
msgstr ""
-#: part/serializers.py:1641
+#: part/serializers.py:1669
msgid "Remove existing BOM items before copying"
msgstr ""
-#: part/serializers.py:1646
+#: part/serializers.py:1674
msgid "Include Inherited"
msgstr ""
-#: part/serializers.py:1647
+#: part/serializers.py:1675
msgid "Include BOM items which are inherited from templated parts"
msgstr ""
-#: part/serializers.py:1652
+#: part/serializers.py:1680
msgid "Skip Invalid Rows"
msgstr ""
-#: part/serializers.py:1653
+#: part/serializers.py:1681
msgid "Enable this option to skip invalid rows"
msgstr ""
-#: part/serializers.py:1658
+#: part/serializers.py:1686
msgid "Copy Substitute Parts"
msgstr ""
-#: part/serializers.py:1659
+#: part/serializers.py:1687
msgid "Copy substitute parts when duplicate BOM items"
msgstr ""
-#: part/serializers.py:1693
+#: part/serializers.py:1721
msgid "Clear Existing BOM"
msgstr ""
-#: part/serializers.py:1694
+#: part/serializers.py:1722
msgid "Delete existing BOM items before uploading"
msgstr ""
-#: part/serializers.py:1724
+#: part/serializers.py:1752
msgid "No part column specified"
msgstr ""
-#: part/serializers.py:1768
+#: part/serializers.py:1796
msgid "Multiple matching parts found"
msgstr ""
-#: part/serializers.py:1771
+#: part/serializers.py:1799
msgid "No matching part found"
msgstr ""
-#: part/serializers.py:1774
+#: part/serializers.py:1802
msgid "Part is not designated as a component"
msgstr ""
-#: part/serializers.py:1783
+#: part/serializers.py:1811
msgid "Quantity not provided"
msgstr ""
-#: part/serializers.py:1791
+#: part/serializers.py:1819
msgid "Invalid quantity"
msgstr ""
-#: part/serializers.py:1812
+#: part/serializers.py:1840
msgid "At least one BOM item is required"
msgstr ""
@@ -7221,7 +7247,7 @@ msgid "Validate BOM"
msgstr ""
#: part/templates/part/detail.html:283 part/templates/part/detail.html:284
-#: templates/js/translated/bom.js:1314 templates/js/translated/bom.js:1315
+#: templates/js/translated/bom.js:1320 templates/js/translated/bom.js:1321
msgid "Add BOM Item"
msgstr ""
@@ -7405,7 +7431,7 @@ msgstr ""
msgid "Allocated to Sales Orders"
msgstr ""
-#: part/templates/part/part_base.html:235 templates/js/translated/bom.js:1213
+#: part/templates/part/part_base.html:235 templates/js/translated/bom.js:1219
msgid "Can Build"
msgstr ""
@@ -8784,7 +8810,7 @@ msgstr ""
msgid "Where is this stock item located?"
msgstr ""
-#: stock/models.py:786 stock/serializers.py:1318
+#: stock/models.py:786 stock/serializers.py:1324
msgid "Packaging this stock item is stored in"
msgstr ""
@@ -8796,7 +8822,7 @@ msgstr ""
msgid "Serial number for this item"
msgstr ""
-#: stock/models.py:830 stock/serializers.py:1301
+#: stock/models.py:830 stock/serializers.py:1307
msgid "Batch code for this stock item"
msgstr ""
@@ -8905,7 +8931,7 @@ msgstr ""
msgid "Serialized stock cannot be merged"
msgstr ""
-#: stock/models.py:1639 stock/serializers.py:1207
+#: stock/models.py:1639 stock/serializers.py:1213
msgid "Duplicate stock items"
msgstr ""
@@ -8986,7 +9012,7 @@ msgstr ""
msgid "Enter serial numbers for new items"
msgstr ""
-#: stock/serializers.py:473 stock/serializers.py:1164 stock/serializers.py:1420
+#: stock/serializers.py:473 stock/serializers.py:1170 stock/serializers.py:1426
msgid "Destination stock location"
msgstr ""
@@ -9059,77 +9085,78 @@ msgstr ""
msgid "No stock items selected"
msgstr ""
-#: stock/serializers.py:863 stock/templates/stock/location.html:165
+#: stock/serializers.py:863 stock/serializers.py:926
+#: stock/templates/stock/location.html:165
#: stock/templates/stock/location.html:213
#: stock/templates/stock/location_sidebar.html:5
msgid "Sublocations"
msgstr ""
-#: stock/serializers.py:1036
+#: stock/serializers.py:1042
msgid "Part must be salable"
msgstr ""
-#: stock/serializers.py:1040
+#: stock/serializers.py:1046
msgid "Item is allocated to a sales order"
msgstr ""
-#: stock/serializers.py:1044
+#: stock/serializers.py:1050
msgid "Item is allocated to a build order"
msgstr ""
-#: stock/serializers.py:1068
+#: stock/serializers.py:1074
msgid "Customer to assign stock items"
msgstr ""
-#: stock/serializers.py:1074
+#: stock/serializers.py:1080
msgid "Selected company is not a customer"
msgstr ""
-#: stock/serializers.py:1082
+#: stock/serializers.py:1088
msgid "Stock assignment notes"
msgstr ""
-#: stock/serializers.py:1092 stock/serializers.py:1346
+#: stock/serializers.py:1098 stock/serializers.py:1352
msgid "A list of stock items must be provided"
msgstr ""
-#: stock/serializers.py:1171
+#: stock/serializers.py:1177
msgid "Stock merging notes"
msgstr ""
-#: stock/serializers.py:1176
+#: stock/serializers.py:1182
msgid "Allow mismatched suppliers"
msgstr ""
-#: stock/serializers.py:1177
+#: stock/serializers.py:1183
msgid "Allow stock items with different supplier parts to be merged"
msgstr ""
-#: stock/serializers.py:1182
+#: stock/serializers.py:1188
msgid "Allow mismatched status"
msgstr ""
-#: stock/serializers.py:1183
+#: stock/serializers.py:1189
msgid "Allow stock items with different status codes to be merged"
msgstr ""
-#: stock/serializers.py:1193
+#: stock/serializers.py:1199
msgid "At least two stock items must be provided"
msgstr ""
-#: stock/serializers.py:1260
+#: stock/serializers.py:1266
msgid "No Change"
msgstr ""
-#: stock/serializers.py:1289
+#: stock/serializers.py:1295
msgid "StockItem primary key value"
msgstr ""
-#: stock/serializers.py:1308
+#: stock/serializers.py:1314
msgid "Stock item status code"
msgstr ""
-#: stock/serializers.py:1336
+#: stock/serializers.py:1342
msgid "Stock transaction notes"
msgstr ""
@@ -10662,7 +10689,7 @@ msgid "The following parts are low on required stock"
msgstr ""
#: templates/email/build_order_required_stock.html:18
-#: templates/js/translated/bom.js:1668 templates/js/translated/build.js:2557
+#: templates/js/translated/bom.js:1674 templates/js/translated/build.js:2557
msgid "Required Quantity"
msgstr ""
@@ -10676,7 +10703,7 @@ msgid "Click on the following link to view this part"
msgstr ""
#: templates/email/low_stock_notification.html:18
-#: templates/js/translated/part.js:3209
+#: templates/js/translated/part.js:3218
msgid "Minimum Quantity"
msgstr ""
@@ -11051,62 +11078,66 @@ msgstr ""
msgid "No pricing available"
msgstr ""
-#: templates/js/translated/bom.js:1182 templates/js/translated/build.js:2596
+#: templates/js/translated/bom.js:1184 templates/js/translated/build.js:2622
+msgid "External stock"
+msgstr ""
+
+#: templates/js/translated/bom.js:1188 templates/js/translated/build.js:2596
#: templates/js/translated/sales_order.js:1910
msgid "No Stock Available"
msgstr ""
-#: templates/js/translated/bom.js:1187 templates/js/translated/build.js:2600
+#: templates/js/translated/bom.js:1193 templates/js/translated/build.js:2600
msgid "Includes variant and substitute stock"
msgstr ""
-#: templates/js/translated/bom.js:1189 templates/js/translated/build.js:2602
+#: templates/js/translated/bom.js:1195 templates/js/translated/build.js:2602
#: templates/js/translated/part.js:1256
#: templates/js/translated/sales_order.js:1907
msgid "Includes variant stock"
msgstr ""
-#: templates/js/translated/bom.js:1191 templates/js/translated/build.js:2604
+#: templates/js/translated/bom.js:1197 templates/js/translated/build.js:2604
msgid "Includes substitute stock"
msgstr ""
-#: templates/js/translated/bom.js:1219 templates/js/translated/build.js:2587
+#: templates/js/translated/bom.js:1225 templates/js/translated/build.js:2587
msgid "Consumable item"
msgstr ""
-#: templates/js/translated/bom.js:1279
+#: templates/js/translated/bom.js:1285
msgid "Validate BOM Item"
msgstr ""
-#: templates/js/translated/bom.js:1281
+#: templates/js/translated/bom.js:1287
msgid "This line has been validated"
msgstr ""
-#: templates/js/translated/bom.js:1283
+#: templates/js/translated/bom.js:1289
msgid "Edit substitute parts"
msgstr ""
-#: templates/js/translated/bom.js:1285 templates/js/translated/bom.js:1480
+#: templates/js/translated/bom.js:1291 templates/js/translated/bom.js:1486
msgid "Edit BOM Item"
msgstr ""
-#: templates/js/translated/bom.js:1287
+#: templates/js/translated/bom.js:1293
msgid "Delete BOM Item"
msgstr ""
-#: templates/js/translated/bom.js:1307
+#: templates/js/translated/bom.js:1313
msgid "View BOM"
msgstr ""
-#: templates/js/translated/bom.js:1391
+#: templates/js/translated/bom.js:1397
msgid "No BOM items found"
msgstr ""
-#: templates/js/translated/bom.js:1651 templates/js/translated/build.js:2486
+#: templates/js/translated/bom.js:1657 templates/js/translated/build.js:2486
msgid "Required Part"
msgstr ""
-#: templates/js/translated/bom.js:1677
+#: templates/js/translated/bom.js:1683
msgid "Inherited from parent BOM"
msgstr ""
@@ -11449,29 +11480,29 @@ msgstr ""
msgid "Sufficient stock available"
msgstr ""
-#: templates/js/translated/build.js:2643
+#: templates/js/translated/build.js:2647
msgid "Consumable Item"
msgstr ""
-#: templates/js/translated/build.js:2648
+#: templates/js/translated/build.js:2652
msgid "Tracked item"
msgstr ""
-#: templates/js/translated/build.js:2655
+#: templates/js/translated/build.js:2659
#: templates/js/translated/sales_order.js:2016
msgid "Build stock"
msgstr ""
-#: templates/js/translated/build.js:2660 templates/js/translated/stock.js:1829
+#: templates/js/translated/build.js:2664 templates/js/translated/stock.js:1829
msgid "Order stock"
msgstr ""
-#: templates/js/translated/build.js:2664
+#: templates/js/translated/build.js:2668
#: templates/js/translated/sales_order.js:2010
msgid "Allocate stock"
msgstr ""
-#: templates/js/translated/build.js:2668
+#: templates/js/translated/build.js:2672
msgid "Remove stock allocation"
msgstr ""
@@ -12313,64 +12344,64 @@ msgstr ""
msgid "Subscribed category"
msgstr ""
-#: templates/js/translated/part.js:2855
+#: templates/js/translated/part.js:2864
msgid "No test templates matching query"
msgstr ""
-#: templates/js/translated/part.js:2877 templates/js/translated/search.js:342
+#: templates/js/translated/part.js:2886 templates/js/translated/search.js:342
msgid "results"
msgstr ""
-#: templates/js/translated/part.js:2927 templates/js/translated/stock.js:1446
+#: templates/js/translated/part.js:2936 templates/js/translated/stock.js:1446
msgid "Edit test result"
msgstr ""
-#: templates/js/translated/part.js:2928 templates/js/translated/stock.js:1447
+#: templates/js/translated/part.js:2937 templates/js/translated/stock.js:1447
#: templates/js/translated/stock.js:1692
msgid "Delete test result"
msgstr ""
-#: templates/js/translated/part.js:2932
+#: templates/js/translated/part.js:2941
msgid "This test is defined for a parent part"
msgstr ""
-#: templates/js/translated/part.js:2948
+#: templates/js/translated/part.js:2957
msgid "Edit Test Result Template"
msgstr ""
-#: templates/js/translated/part.js:2962
+#: templates/js/translated/part.js:2971
msgid "Delete Test Result Template"
msgstr ""
-#: templates/js/translated/part.js:3041 templates/js/translated/part.js:3042
+#: templates/js/translated/part.js:3050 templates/js/translated/part.js:3051
msgid "No date specified"
msgstr ""
-#: templates/js/translated/part.js:3044
+#: templates/js/translated/part.js:3053
msgid "Specified date is in the past"
msgstr ""
-#: templates/js/translated/part.js:3050
+#: templates/js/translated/part.js:3059
msgid "Speculative"
msgstr ""
-#: templates/js/translated/part.js:3100
+#: templates/js/translated/part.js:3109
msgid "No scheduling information available for this part"
msgstr ""
-#: templates/js/translated/part.js:3106
+#: templates/js/translated/part.js:3115
msgid "Error fetching scheduling information for this part"
msgstr ""
-#: templates/js/translated/part.js:3202
+#: templates/js/translated/part.js:3211
msgid "Scheduled Stock Quantities"
msgstr ""
-#: templates/js/translated/part.js:3218
+#: templates/js/translated/part.js:3227
msgid "Maximum Quantity"
msgstr ""
-#: templates/js/translated/part.js:3263
+#: templates/js/translated/part.js:3272
msgid "Minimum Stock Level"
msgstr ""
@@ -14052,4 +14083,3 @@ msgstr ""
#: users/models.py:413
msgid "Permission to delete items"
msgstr ""
-
diff --git a/InvenTree/locale/hu/LC_MESSAGES/django.po b/InvenTree/locale/hu/LC_MESSAGES/django.po
index b8fc4d3cfb..7fd610ab1f 100644
--- a/InvenTree/locale/hu/LC_MESSAGES/django.po
+++ b/InvenTree/locale/hu/LC_MESSAGES/django.po
@@ -2,7 +2,7 @@ msgid ""
msgstr ""
"Project-Id-Version: inventree\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2024-02-28 04:05+0000\n"
+"POT-Creation-Date: 2024-03-05 00:41+0000\n"
"PO-Revision-Date: 2024-02-28 07:23\n"
"Last-Translator: \n"
"Language-Team: Hungarian\n"
@@ -66,9 +66,9 @@ msgstr "Dátum megadása"
#: report/templates/report/inventree_build_order_base.html:172
#: stock/admin.py:226 stock/models.py:2335 stock/models.py:2451
#: stock/serializers.py:479 stock/serializers.py:632 stock/serializers.py:728
-#: stock/serializers.py:778 stock/serializers.py:1081 stock/serializers.py:1170
-#: stock/serializers.py:1335 stock/templates/stock/stock_sidebar.html:25
-#: templates/js/translated/barcode.js:143 templates/js/translated/bom.js:1259
+#: stock/serializers.py:778 stock/serializers.py:1087 stock/serializers.py:1176
+#: stock/serializers.py:1341 stock/templates/stock/stock_sidebar.html:25
+#: templates/js/translated/barcode.js:143 templates/js/translated/bom.js:1265
#: templates/js/translated/company.js:1674 templates/js/translated/order.js:347
#: templates/js/translated/part.js:1080
#: templates/js/translated/purchase_order.js:2201
@@ -523,7 +523,7 @@ msgstr "Név"
#: templates/js/translated/order.js:298 templates/js/translated/part.js:1238
#: templates/js/translated/part.js:1483 templates/js/translated/part.js:1621
#: templates/js/translated/part.js:1958 templates/js/translated/part.js:2355
-#: templates/js/translated/part.js:2785 templates/js/translated/part.js:2887
+#: templates/js/translated/part.js:2785 templates/js/translated/part.js:2896
#: templates/js/translated/plugin.js:80
#: templates/js/translated/purchase_order.js:1707
#: templates/js/translated/purchase_order.js:1850
@@ -678,7 +678,7 @@ msgstr "A távoli kép URL-je"
msgid "Downloading images from remote URL is not enabled"
msgstr "Képek letöltése távoli URL-ről nem engedélyezett"
-#: InvenTree/status.py:66 part/serializers.py:1120
+#: InvenTree/status.py:66 part/serializers.py:1138
msgid "Background worker check failed"
msgstr "Háttér folyamat ellenőrzés sikertelen"
@@ -960,7 +960,7 @@ msgid "Tracked"
msgstr "Követett"
#: build/api.py:285 part/admin.py:144 templates/js/translated/build.js:1741
-#: templates/js/translated/build.js:2626
+#: templates/js/translated/build.js:2630
#: templates/js/translated/sales_order.js:1929
#: templates/js/translated/table_filters.js:571
msgid "Allocated"
@@ -1044,11 +1044,11 @@ msgstr "Gyártás, amihez ez a gyártás hozzá van rendelve"
#: build/models.py:199 build/templates/build/build_base.html:97
#: build/templates/build/detail.html:29 company/models.py:1044
#: order/models.py:1389 order/models.py:1532 order/models.py:1533
-#: part/api.py:1528 part/models.py:389 part/models.py:3003 part/models.py:3147
-#: part/models.py:3291 part/models.py:3314 part/models.py:3335
-#: part/models.py:3357 part/models.py:3458 part/models.py:3754
-#: part/models.py:3885 part/models.py:3978 part/models.py:4339
-#: part/serializers.py:1066 part/serializers.py:1631
+#: part/api.py:1528 part/api.py:1820 part/models.py:389 part/models.py:3003
+#: part/models.py:3147 part/models.py:3291 part/models.py:3314
+#: part/models.py:3335 part/models.py:3357 part/models.py:3458
+#: part/models.py:3754 part/models.py:3885 part/models.py:3978
+#: part/models.py:4339 part/serializers.py:1084 part/serializers.py:1659
#: part/templates/part/part_app_base.html:8
#: part/templates/part/part_pricing.html:12
#: part/templates/part/upload_bom.html:52
@@ -1147,7 +1147,7 @@ msgid "Build status code"
msgstr "Gyártás státusz kód"
#: build/models.py:264 build/serializers.py:280 order/serializers.py:549
-#: stock/models.py:826 stock/serializers.py:1300
+#: stock/models.py:826 stock/serializers.py:1306
#: templates/js/translated/purchase_order.js:1129
msgid "Batch Code"
msgstr "Batch kód"
@@ -1242,48 +1242,48 @@ msgstr "Projektszám"
msgid "Project code for this build order"
msgstr "Projekt kód a gyártáshoz"
-#: build/models.py:559
+#: build/models.py:575
#, python-brace-format
msgid "Build order {build} has been completed"
msgstr "A {build} gyártási utasítás elkészült"
-#: build/models.py:565
+#: build/models.py:581
msgid "A build order has been completed"
msgstr "Gyártási utasítás elkészült"
-#: build/models.py:783 build/models.py:858
+#: build/models.py:799 build/models.py:874
msgid "No build output specified"
msgstr "Nincs gyártási kimenet megadva"
-#: build/models.py:786
+#: build/models.py:802
msgid "Build output is already completed"
msgstr "Gyártási kimenet már kész"
-#: build/models.py:789
+#: build/models.py:805
msgid "Build output does not match Build Order"
msgstr "Gyártási kimenet nem egyezik a gyártási utasítással"
-#: build/models.py:862 build/serializers.py:223 build/serializers.py:262
+#: build/models.py:878 build/serializers.py:223 build/serializers.py:262
#: build/serializers.py:831 order/models.py:526 order/serializers.py:401
-#: order/serializers.py:544 part/serializers.py:1423 part/serializers.py:1789
+#: order/serializers.py:544 part/serializers.py:1442 part/serializers.py:1817
#: stock/models.py:665 stock/models.py:1477 stock/serializers.py:450
msgid "Quantity must be greater than zero"
msgstr "Mennyiségnek nullánál többnek kell lennie"
-#: build/models.py:867 build/serializers.py:228
+#: build/models.py:883 build/serializers.py:228
msgid "Quantity cannot be greater than the output quantity"
msgstr "A mennyiség nem lehet több mint a gyártási mennyiség"
-#: build/models.py:924 build/serializers.py:533
+#: build/models.py:940 build/serializers.py:533
#, python-brace-format
msgid "Build output {serial} has not passed all required tests"
msgstr ""
-#: build/models.py:1286
+#: build/models.py:1302
msgid "Build object"
msgstr "Gyártás objektum"
-#: build/models.py:1300 build/models.py:1558 build/serializers.py:210
+#: build/models.py:1316 build/models.py:1574 build/serializers.py:210
#: build/serializers.py:247 build/templates/build/build_base.html:102
#: build/templates/build/detail.html:34 common/models.py:2432
#: order/models.py:1247 order/models.py:1902 order/serializers.py:1306
@@ -1310,7 +1310,7 @@ msgstr "Gyártás objektum"
#: templates/js/translated/company.js:1808
#: templates/js/translated/model_renderers.js:230
#: templates/js/translated/order.js:304 templates/js/translated/part.js:961
-#: templates/js/translated/part.js:1811 templates/js/translated/part.js:3332
+#: templates/js/translated/part.js:1811 templates/js/translated/part.js:3341
#: templates/js/translated/pricing.js:381
#: templates/js/translated/pricing.js:474
#: templates/js/translated/pricing.js:522
@@ -1330,38 +1330,38 @@ msgstr "Gyártás objektum"
msgid "Quantity"
msgstr "Mennyiség"
-#: build/models.py:1301
+#: build/models.py:1317
msgid "Required quantity for build order"
msgstr "Gyártáshoz szükséges mennyiség"
-#: build/models.py:1381
+#: build/models.py:1397
msgid "Build item must specify a build output, as master part is marked as trackable"
msgstr "Gyártási tételnek meg kell adnia a gyártási kimenetet, mivel a fő darab egyedi követésre kötelezett"
-#: build/models.py:1390
+#: build/models.py:1406
#, python-brace-format
msgid "Allocated quantity ({q}) must not exceed available stock quantity ({a})"
msgstr "A lefoglalt mennyiség ({q}) nem lépheti túl a szabad készletet ({a})"
-#: build/models.py:1400 order/models.py:1853
+#: build/models.py:1416 order/models.py:1853
msgid "Stock item is over-allocated"
msgstr "Készlet túlfoglalva"
-#: build/models.py:1406 order/models.py:1856
+#: build/models.py:1422 order/models.py:1856
msgid "Allocation quantity must be greater than zero"
msgstr "Lefoglalt mennyiségnek nullánál többnek kell lennie"
-#: build/models.py:1412
+#: build/models.py:1428
msgid "Quantity must be 1 for serialized stock"
msgstr "Egyedi követésre kötelezett tételeknél a menyiség 1 kell legyen"
-#: build/models.py:1473
+#: build/models.py:1489
msgid "Selected stock item does not match BOM line"
msgstr "A készlet tétel nem egyezik az alkatrészjegyzékkel"
-#: build/models.py:1545 build/serializers.py:811 order/serializers.py:1150
-#: order/serializers.py:1171 stock/serializers.py:544 stock/serializers.py:1019
-#: stock/serializers.py:1131 stock/templates/stock/item_base.html:10
+#: build/models.py:1561 build/serializers.py:811 order/serializers.py:1150
+#: order/serializers.py:1171 stock/serializers.py:544 stock/serializers.py:1025
+#: stock/serializers.py:1137 stock/templates/stock/item_base.html:10
#: stock/templates/stock/item_base.html:23
#: stock/templates/stock/item_base.html:194
#: templates/js/translated/build.js:1742
@@ -1376,19 +1376,19 @@ msgstr "A készlet tétel nem egyezik az alkatrészjegyzékkel"
msgid "Stock Item"
msgstr "Készlet tétel"
-#: build/models.py:1546
+#: build/models.py:1562
msgid "Source stock item"
msgstr "Forrás készlet tétel"
-#: build/models.py:1559
+#: build/models.py:1575
msgid "Stock quantity to allocate to build"
msgstr "Készlet mennyiség amit foglaljunk a gyártáshoz"
-#: build/models.py:1567
+#: build/models.py:1583
msgid "Install into"
msgstr "Beépítés ebbe"
-#: build/models.py:1568
+#: build/models.py:1584
msgid "Destination stock item"
msgstr "Cél készlet tétel"
@@ -1452,9 +1452,9 @@ msgid "A list of build outputs must be provided"
msgstr "A gyártási kimenetek listáját meg kell adni"
#: build/serializers.py:426 build/serializers.py:498 order/serializers.py:533
-#: order/serializers.py:641 order/serializers.py:1646 part/serializers.py:1086
+#: order/serializers.py:641 order/serializers.py:1646 part/serializers.py:1104
#: stock/serializers.py:472 stock/serializers.py:627 stock/serializers.py:723
-#: stock/serializers.py:1163 stock/serializers.py:1419
+#: stock/serializers.py:1169 stock/serializers.py:1425
#: stock/templates/stock/item_base.html:394
#: templates/js/translated/barcode.js:547
#: templates/js/translated/barcode.js:795 templates/js/translated/build.js:999
@@ -1494,7 +1494,7 @@ msgstr "A kész gyártási kimenetek helye"
#: build/serializers.py:505 build/templates/build/build_base.html:151
#: build/templates/build/detail.html:62 order/models.py:910
#: order/models.py:2005 order/serializers.py:565 stock/admin.py:165
-#: stock/serializers.py:774 stock/serializers.py:1307
+#: stock/serializers.py:774 stock/serializers.py:1313
#: stock/templates/stock/item_base.html:427
#: templates/js/translated/barcode.js:252 templates/js/translated/build.js:2189
#: templates/js/translated/purchase_order.js:1308
@@ -1512,7 +1512,8 @@ msgstr "Hiányos foglalás elfogadása"
#: build/serializers.py:512
msgid "Complete outputs if stock has not been fully allocated"
-msgstr "Kimenetek befejezése akkor is ha a készlet nem\n"
+msgstr ""
+"Kimenetek befejezése akkor is ha a készlet nem\n"
"lett teljesen lefoglalva"
#: build/serializers.py:592
@@ -1603,7 +1604,7 @@ msgstr "Gyártás sor tétel"
msgid "bom_item.part must point to the same part as the build order"
msgstr "bom_item.part ugyanarra az alkatrészre kell mutasson mint a gyártási utasítás"
-#: build/serializers.py:817 stock/serializers.py:1032
+#: build/serializers.py:817 stock/serializers.py:1038
msgid "Item must be in stock"
msgstr "A tételnek kell legyen készlete"
@@ -1660,44 +1661,45 @@ msgstr "Opcionális tételek"
msgid "Allocate optional BOM items to build order"
msgstr "Opcionális tételek lefoglalása a gyártáshoz"
-#: build/serializers.py:1096 part/models.py:3895 part/models.py:4331
+#: build/serializers.py:1097 part/models.py:3895 part/models.py:4331
#: stock/api.py:745
msgid "BOM Item"
msgstr "Alkatrészjegyzék tétel"
-#: build/serializers.py:1105 templates/js/translated/index.js:130
+#: build/serializers.py:1106 templates/js/translated/index.js:130
msgid "Allocated Stock"
msgstr "Lefoglalt készlet"
-#: build/serializers.py:1110 part/admin.py:132 part/bom.py:173
-#: part/serializers.py:1441 part/templates/part/part_base.html:210
-#: templates/js/translated/bom.js:1202 templates/js/translated/build.js:2614
-#: templates/js/translated/part.js:709 templates/js/translated/part.js:2148
+#: build/serializers.py:1111 part/admin.py:132 part/bom.py:173
+#: part/serializers.py:798 part/serializers.py:1460
+#: part/templates/part/part_base.html:210 templates/js/translated/bom.js:1208
+#: templates/js/translated/build.js:2614 templates/js/translated/part.js:709
+#: templates/js/translated/part.js:2148
#: templates/js/translated/table_filters.js:170
msgid "On Order"
msgstr "Rendelve"
-#: build/serializers.py:1115 part/serializers.py:1443
+#: build/serializers.py:1116 part/serializers.py:1462
#: templates/js/translated/build.js:2618
#: templates/js/translated/table_filters.js:360
msgid "In Production"
msgstr "Gyártásban"
-#: build/serializers.py:1120 part/bom.py:172 part/serializers.py:1454
+#: build/serializers.py:1121 part/bom.py:172 part/serializers.py:1473
#: part/templates/part/part_base.html:192
#: templates/js/translated/sales_order.js:1893
msgid "Available Stock"
msgstr "Elérhető készlet"
-#: build/tasks.py:149
+#: build/tasks.py:171
msgid "Stock required for build order"
msgstr "A gyártási utasításhoz készlet szükséges"
-#: build/tasks.py:166
+#: build/tasks.py:188
msgid "Overdue Build Order"
msgstr "Késésben lévő gyártás"
-#: build/tasks.py:171
+#: build/tasks.py:193
#, python-brace-format
msgid "Build order {bo} is now overdue"
msgstr "A {bo} gyártás most már késésben van"
@@ -1991,27 +1993,31 @@ msgstr "Szükséges alkatrészek rendelése"
msgid "Order Parts"
msgstr "Alkatrész rendelés"
-#: build/templates/build/detail.html:210
+#: build/templates/build/detail.html:205
+msgid "Available stock has been filtered based on specified source location for this build order"
+msgstr ""
+
+#: build/templates/build/detail.html:215
msgid "Incomplete Build Outputs"
msgstr "Befejezetlen gyártási kimenetek"
-#: build/templates/build/detail.html:214
+#: build/templates/build/detail.html:219
msgid "Create new build output"
msgstr "Új gyártási kimenet létrehozása"
-#: build/templates/build/detail.html:215
+#: build/templates/build/detail.html:220
msgid "New Build Output"
msgstr "Új gyártási kimenet"
-#: build/templates/build/detail.html:232 build/templates/build/sidebar.html:15
+#: build/templates/build/detail.html:237 build/templates/build/sidebar.html:15
msgid "Consumed Stock"
msgstr "Felhasznált készlet"
-#: build/templates/build/detail.html:244
+#: build/templates/build/detail.html:249
msgid "Completed Build Outputs"
msgstr "Befejezett gyártási kimenetek"
-#: build/templates/build/detail.html:256 build/templates/build/sidebar.html:19
+#: build/templates/build/detail.html:261 build/templates/build/sidebar.html:19
#: company/templates/company/detail.html:229
#: company/templates/company/manufacturer_part.html:141
#: company/templates/company/manufacturer_part_sidebar.html:9
@@ -2027,15 +2033,15 @@ msgstr "Befejezett gyártási kimenetek"
msgid "Attachments"
msgstr "Mellékletek"
-#: build/templates/build/detail.html:271
+#: build/templates/build/detail.html:276
msgid "Build Notes"
msgstr "Gyártási megjegyzések"
-#: build/templates/build/detail.html:426
+#: build/templates/build/detail.html:434
msgid "Allocation Complete"
msgstr "Lefoglalás kész"
-#: build/templates/build/detail.html:427
+#: build/templates/build/detail.html:435
msgid "All lines have been fully allocated"
msgstr "Minden sor rendben lefoglalva"
@@ -2437,7 +2443,7 @@ msgid "Parts are templates by default"
msgstr "Alkatrészek alapból sablon alkatrészek legyenek"
#: common/models.py:1456 part/admin.py:91 part/admin.py:431 part/models.py:1015
-#: templates/js/translated/bom.js:1633
+#: templates/js/translated/bom.js:1639
#: templates/js/translated/table_filters.js:330
#: templates/js/translated/table_filters.js:721
msgid "Assembly"
@@ -3496,7 +3502,7 @@ msgstr ""
msgid "Price break quantity"
msgstr "Ársáv mennyiség"
-#: common/models.py:2440 company/serializers.py:484 order/admin.py:42
+#: common/models.py:2440 company/serializers.py:486 order/admin.py:42
#: order/models.py:1321 order/models.py:2226
#: templates/js/translated/company.js:1813 templates/js/translated/part.js:1885
#: templates/js/translated/pricing.js:621
@@ -3973,7 +3979,7 @@ msgstr "Válassz alkatrészt"
#: company/models.py:495 company/templates/company/company_base.html:76
#: company/templates/company/manufacturer_part.html:90
-#: company/templates/company/supplier_part.html:145 part/serializers.py:497
+#: company/templates/company/supplier_part.html:145 part/serializers.py:505
#: stock/templates/stock/item_base.html:207
#: templates/js/translated/company.js:506
#: templates/js/translated/company.js:1108
@@ -3988,7 +3994,7 @@ msgid "Select manufacturer"
msgstr "Gyártó kiválasztása"
#: company/models.py:502 company/templates/company/manufacturer_part.html:101
-#: company/templates/company/supplier_part.html:153 part/serializers.py:507
+#: company/templates/company/supplier_part.html:153 part/serializers.py:515
#: templates/js/translated/company.js:351
#: templates/js/translated/company.js:1107
#: templates/js/translated/company.js:1302
@@ -4060,7 +4066,7 @@ msgstr "Kapcsolódó gyártói alkatrésznek ugyanarra a kiindulási alkatrészr
#: company/models.py:795 company/templates/company/company_base.html:81
#: company/templates/company/supplier_part.html:129 order/models.py:453
#: order/templates/order/order_base.html:136 part/bom.py:272 part/bom.py:310
-#: part/serializers.py:481 plugin/builtin/suppliers/digikey.py:25
+#: part/serializers.py:489 plugin/builtin/suppliers/digikey.py:25
#: plugin/builtin/suppliers/lcsc.py:26 plugin/builtin/suppliers/mouser.py:24
#: plugin/builtin/suppliers/tme.py:26 stock/templates/stock/item_base.html:224
#: templates/email/overdue_purchase_order.html:16
@@ -4077,7 +4083,7 @@ msgstr "Beszállító"
msgid "Select supplier"
msgstr "Beszállító kiválasztása"
-#: company/models.py:802 part/serializers.py:492
+#: company/models.py:802 part/serializers.py:500
msgid "Supplier stock keeping unit"
msgstr "Beszállítói cikkszám"
@@ -4113,7 +4119,7 @@ msgid "Minimum charge (e.g. stocking fee)"
msgstr "Minimális díj (pl. tárolási díj)"
#: company/models.py:851 company/templates/company/supplier_part.html:160
-#: stock/admin.py:224 stock/models.py:785 stock/serializers.py:1317
+#: stock/admin.py:224 stock/models.py:785 stock/serializers.py:1323
#: stock/templates/stock/item_base.html:240
#: templates/js/translated/company.js:1636
#: templates/js/translated/stock.js:2387
@@ -4158,7 +4164,7 @@ msgstr "Elérhetőség frissítve"
msgid "Date of last update of availability data"
msgstr "Utolsó elérhetőségi adat frissítés"
-#: company/serializers.py:153
+#: company/serializers.py:155
msgid "Default currency used for this supplier"
msgstr "Beszállító által használt alapértelmezett pénznem"
@@ -4219,7 +4225,7 @@ msgstr "Kép törlése"
#: company/templates/company/company_base.html:86 order/models.py:898
#: order/models.py:1993 order/templates/order/return_order_base.html:131
#: order/templates/order/sales_order_base.html:144 stock/models.py:807
-#: stock/models.py:808 stock/serializers.py:1067
+#: stock/models.py:808 stock/serializers.py:1073
#: stock/templates/stock/item_base.html:405
#: templates/email/overdue_sales_order.html:16
#: templates/js/translated/company.js:502
@@ -4430,8 +4436,9 @@ msgstr "Nincs elérhető gyártói információ"
#: company/templates/company/manufacturer_part.html:119
#: company/templates/company/supplier_part.html:15 company/views.py:31
-#: part/admin.py:122 part/templates/part/part_sidebar.html:33
-#: templates/InvenTree/search.html:190 templates/navbar.html:48
+#: part/admin.py:122 part/serializers.py:802
+#: part/templates/part/part_sidebar.html:33 templates/InvenTree/search.html:190
+#: templates/navbar.html:48
msgid "Suppliers"
msgstr "Beszállítók"
@@ -4529,7 +4536,7 @@ msgid "No supplier information available"
msgstr "Nincs elérhető beszállítói információ"
#: company/templates/company/supplier_part.html:139 part/bom.py:279
-#: part/bom.py:311 part/serializers.py:491
+#: part/bom.py:311 part/serializers.py:499
#: templates/js/translated/company.js:349 templates/js/translated/part.js:1786
#: templates/js/translated/pricing.js:510
#: templates/js/translated/purchase_order.js:1851
@@ -4578,10 +4585,12 @@ msgstr "Vonalkód hozzárendelése a beszállítói alkatrészhez"
msgid "Update Part Availability"
msgstr "Alkatrész elérhetőség frissítése"
-#: company/templates/company/supplier_part_sidebar.html:5 part/stocktake.py:223
+#: company/templates/company/supplier_part_sidebar.html:5
+#: part/serializers.py:801 part/stocktake.py:223
#: part/templates/part/category.html:183
#: part/templates/part/category_sidebar.html:17 stock/admin.py:69
-#: stock/serializers.py:760 stock/templates/stock/location.html:170
+#: stock/serializers.py:760 stock/serializers.py:924
+#: stock/templates/stock/location.html:170
#: stock/templates/stock/location.html:184
#: stock/templates/stock/location.html:196
#: stock/templates/stock/location_sidebar.html:7
@@ -4641,7 +4650,7 @@ msgid "Label template file"
msgstr "Címke sablon fájl"
#: label/models.py:143 part/models.py:3484 report/models.py:322
-#: templates/js/translated/part.js:2891
+#: templates/js/translated/part.js:2900
#: templates/js/translated/table_filters.js:481
msgid "Enabled"
msgstr "Engedélyezve"
@@ -5734,7 +5743,7 @@ msgid "Pending Shipments"
msgstr "Függő szállítmányok"
#: order/templates/order/sales_order_detail.html:71
-#: templates/js/translated/bom.js:1271 templates/js/translated/filters.js:296
+#: templates/js/translated/bom.js:1277 templates/js/translated/filters.js:296
msgid "Actions"
msgstr "Műveletek"
@@ -5862,10 +5871,10 @@ msgstr "Szülő neve"
msgid "Category Path"
msgstr "Kategória elérési út"
-#: part/admin.py:323 part/models.py:390 part/serializers.py:259
-#: part/serializers.py:373 part/templates/part/cat_link.html:3
-#: part/templates/part/category.html:23 part/templates/part/category.html:141
-#: part/templates/part/category.html:161
+#: part/admin.py:323 part/models.py:390 part/serializers.py:112
+#: part/serializers.py:265 part/serializers.py:381
+#: part/templates/part/cat_link.html:3 part/templates/part/category.html:23
+#: part/templates/part/category.html:141 part/templates/part/category.html:161
#: part/templates/part/category_sidebar.html:9
#: templates/InvenTree/index.html:36 templates/InvenTree/search.html:84
#: templates/InvenTree/settings/sidebar.html:47
@@ -5890,13 +5899,13 @@ msgstr "Szülő IPN"
msgid "Part IPN"
msgstr "Alkatrész IPN"
-#: part/admin.py:421 part/serializers.py:1220
+#: part/admin.py:421 part/serializers.py:1238
#: templates/js/translated/pricing.js:358
#: templates/js/translated/pricing.js:1024
msgid "Minimum Price"
msgstr "Minimum ár"
-#: part/admin.py:426 part/serializers.py:1235
+#: part/admin.py:426 part/serializers.py:1253
#: templates/js/translated/pricing.js:353
#: templates/js/translated/pricing.js:1032
msgid "Maximum Price"
@@ -5975,7 +5984,7 @@ msgid "This option must be selected"
msgstr "Ennek az opciónak ki kll lennie választva"
#: part/api.py:1541 part/models.py:895 part/models.py:3385 part/models.py:3831
-#: part/serializers.py:388 part/serializers.py:1076
+#: part/serializers.py:396 part/serializers.py:1094
#: part/templates/part/part_base.html:260 stock/api.py:733
#: templates/InvenTree/settings/settings_staff_js.html:300
#: templates/js/translated/notification.js:60
@@ -5983,12 +5992,17 @@ msgstr "Ennek az opciónak ki kll lennie választva"
msgid "Category"
msgstr "Kategória"
+#: part/api.py:1828
+msgid "Uses"
+msgstr ""
+
#: part/bom.py:170 part/models.py:100 part/models.py:938
#: part/templates/part/category.html:116 part/templates/part/part_base.html:367
msgid "Default Location"
msgstr "Alapértelmezett hely"
-#: part/bom.py:171 templates/email/low_stock_notification.html:16
+#: part/bom.py:171 part/serializers.py:803
+#: templates/email/low_stock_notification.html:16
msgid "Total Stock"
msgstr "Teljes készlet"
@@ -6011,7 +6025,8 @@ msgstr "Alkatrész kategóriák"
msgid "Default location for parts in this category"
msgstr "Ebben a kategóriában lévő alkatrészek helye alapban"
-#: part/models.py:106 stock/models.py:165 templates/js/translated/stock.js:2736
+#: part/models.py:106 stock/models.py:165 templates/js/translated/part.js:2810
+#: templates/js/translated/stock.js:2736
#: templates/js/translated/table_filters.js:239
#: templates/js/translated/table_filters.js:283
msgid "Structural"
@@ -6419,7 +6434,7 @@ msgstr "Teszt sablont csak követésre kötelezett alkatrészhez lehet csinálni
msgid "Test with this name already exists for this part"
msgstr "Erre az alkatrészre már létezik teszt ilyen névvel"
-#: part/models.py:3464 templates/js/translated/part.js:2870
+#: part/models.py:3464 templates/js/translated/part.js:2879
msgid "Test Name"
msgstr "Teszt név"
@@ -6447,7 +6462,7 @@ msgstr "Adj hozzá egy leírást ehhez a teszthez"
msgid "Is this test enabled?"
msgstr ""
-#: part/models.py:3489 templates/js/translated/part.js:2899
+#: part/models.py:3489 templates/js/translated/part.js:2908
#: templates/js/translated/table_filters.js:477
msgid "Required"
msgstr "Kötelező"
@@ -6456,7 +6471,7 @@ msgstr "Kötelező"
msgid "Is this test required to pass?"
msgstr "Szükséges-e hogy ez a teszt sikeres legyen?"
-#: part/models.py:3495 templates/js/translated/part.js:2907
+#: part/models.py:3495 templates/js/translated/part.js:2916
msgid "Requires Value"
msgstr "Kötelező érték"
@@ -6464,7 +6479,7 @@ msgstr "Kötelező érték"
msgid "Does this test require a value when adding a test result?"
msgstr "Szükséges-e hogy ennek a tesztnek az eredményéhez kötelezően érték legyen rendelve?"
-#: part/models.py:3501 templates/js/translated/part.js:2914
+#: part/models.py:3501 templates/js/translated/part.js:2923
msgid "Requires Attachment"
msgstr "Kötelező melléklet"
@@ -6686,311 +6701,329 @@ msgstr "Alkatrész kapcsolat nem hozható létre önmagával"
msgid "Duplicate relationship already exists"
msgstr "Már létezik duplikált alkatrész kapcsolat"
-#: part/serializers.py:128 part/templates/part/category.html:122
-#: part/templates/part/category.html:207
+#: part/serializers.py:114 part/serializers.py:134
+#: part/templates/part/category.html:122 part/templates/part/category.html:207
#: part/templates/part/category_sidebar.html:7
msgid "Subcategories"
msgstr "Alkategóriák"
-#: part/serializers.py:172
+#: part/serializers.py:178
msgid "Results"
msgstr ""
-#: part/serializers.py:173
+#: part/serializers.py:179
msgid "Number of results recorded against this template"
msgstr ""
-#: part/serializers.py:197 part/serializers.py:215 stock/serializers.py:384
+#: part/serializers.py:203 part/serializers.py:221 stock/serializers.py:384
msgid "Purchase currency of this stock item"
msgstr "Beszerzési pénzneme ennek a készlet tételnek"
-#: part/serializers.py:260
+#: part/serializers.py:266
msgid "Number of parts using this template"
msgstr ""
-#: part/serializers.py:379
+#: part/serializers.py:387
msgid "No parts selected"
msgstr "Nincs kiválasztva alkatrész"
-#: part/serializers.py:389
+#: part/serializers.py:397
msgid "Select category"
msgstr "Válassz kategóriát"
-#: part/serializers.py:419
+#: part/serializers.py:427
msgid "Original Part"
msgstr "Eredeti alkatrész"
-#: part/serializers.py:420
+#: part/serializers.py:428
msgid "Select original part to duplicate"
msgstr "Válassz eredeti alkatrészt a másoláshoz"
-#: part/serializers.py:425
+#: part/serializers.py:433
msgid "Copy Image"
msgstr "Kép másolása"
-#: part/serializers.py:426
+#: part/serializers.py:434
msgid "Copy image from original part"
msgstr "Kép másolása az eredeti alkatrészről"
-#: part/serializers.py:432 part/templates/part/detail.html:277
+#: part/serializers.py:440 part/templates/part/detail.html:277
msgid "Copy BOM"
msgstr "Alkatrészjegyzék másolása"
-#: part/serializers.py:433
+#: part/serializers.py:441
msgid "Copy bill of materials from original part"
msgstr "Alkatrészjegyzék másolása az eredeti alkatrészről"
-#: part/serializers.py:439
+#: part/serializers.py:447
msgid "Copy Parameters"
msgstr "Paraméterek másolása"
-#: part/serializers.py:440
+#: part/serializers.py:448
msgid "Copy parameter data from original part"
msgstr "Paraméterek másolása az eredeti alkatrészről"
-#: part/serializers.py:446
+#: part/serializers.py:454
msgid "Copy Notes"
msgstr "Megjegyzések másolása"
-#: part/serializers.py:447
+#: part/serializers.py:455
msgid "Copy notes from original part"
msgstr "Megjegyzések másolása az eredeti alkatrészről"
-#: part/serializers.py:460
+#: part/serializers.py:468
msgid "Initial Stock Quantity"
msgstr "Kezdeti készlet mennyiség"
-#: part/serializers.py:462
+#: part/serializers.py:470
msgid "Specify initial stock quantity for this Part. If quantity is zero, no stock is added."
msgstr "Add meg a kezdeti készlet mennyiséget. Ha nulla akkor nem lesz készlet létrehozva."
-#: part/serializers.py:469
+#: part/serializers.py:477
msgid "Initial Stock Location"
msgstr "Kezdeti készlet hely"
-#: part/serializers.py:470
+#: part/serializers.py:478
msgid "Specify initial stock location for this Part"
msgstr "Add meg a kezdeti készlet helyét"
-#: part/serializers.py:482
+#: part/serializers.py:490
msgid "Select supplier (or leave blank to skip)"
msgstr "Válassz beszállítót (hagyd üresen ha nem kell létrehozni)"
-#: part/serializers.py:498
+#: part/serializers.py:506
msgid "Select manufacturer (or leave blank to skip)"
msgstr "Válassz gyártót (hagyd üresen ha nem kell létrehozni)"
-#: part/serializers.py:508
+#: part/serializers.py:516
msgid "Manufacturer part number"
msgstr "Gyártói cikkszám"
-#: part/serializers.py:515
+#: part/serializers.py:523
msgid "Selected company is not a valid supplier"
msgstr "A kiválasztott cég nem érvényes beszállító"
-#: part/serializers.py:524
+#: part/serializers.py:532
msgid "Selected company is not a valid manufacturer"
msgstr "A kiválasztott cég nem érvényes gyártó"
-#: part/serializers.py:535
+#: part/serializers.py:543
msgid "Manufacturer part matching this MPN already exists"
msgstr "Van már ilyen gyártói alkatrész"
-#: part/serializers.py:542
+#: part/serializers.py:550
msgid "Supplier part matching this SKU already exists"
msgstr "Van már ilyen beszállítói alkatrész"
-#: part/serializers.py:815 part/templates/part/copy_part.html:9
+#: part/serializers.py:804
+#, fuzzy
+#| msgid "Exclude External Stock"
+msgid "External Stock"
+msgstr "Külső készlet nélkül"
+
+#: part/serializers.py:806
+#, fuzzy
+#| msgid "Allocated Stock"
+msgid "Unallocated Stock"
+msgstr "Lefoglalt készlet"
+
+#: part/serializers.py:808
+#, fuzzy
+#| msgid "Allow Variant Stock"
+msgid "Variant Stock"
+msgstr "Készlet változatok engedélyezése"
+
+#: part/serializers.py:833 part/templates/part/copy_part.html:9
#: templates/js/translated/part.js:471
msgid "Duplicate Part"
msgstr "Alkatrész másolása"
-#: part/serializers.py:816
+#: part/serializers.py:834
msgid "Copy initial data from another Part"
msgstr "Kezdeti adatok másolása egy másik alkatrészről"
-#: part/serializers.py:822 templates/js/translated/part.js:102
+#: part/serializers.py:840 templates/js/translated/part.js:102
msgid "Initial Stock"
msgstr "Kezdeti készlet"
-#: part/serializers.py:823
+#: part/serializers.py:841
msgid "Create Part with initial stock quantity"
msgstr "Kezdeti készlet mennyiség létrehozása"
-#: part/serializers.py:829
+#: part/serializers.py:847
msgid "Supplier Information"
msgstr "Beszállító információ"
-#: part/serializers.py:830
+#: part/serializers.py:848
msgid "Add initial supplier information for this part"
msgstr "Kezdeti beszállító adatok hozzáadása"
-#: part/serializers.py:838
+#: part/serializers.py:856
msgid "Copy Category Parameters"
msgstr "Kategória paraméterek másolása"
-#: part/serializers.py:839
+#: part/serializers.py:857
msgid "Copy parameter templates from selected part category"
msgstr "Paraméter sablonok másolása a kiválasztott alkatrész kategóriából"
-#: part/serializers.py:844
+#: part/serializers.py:862
msgid "Existing Image"
msgstr "Meglévő kép"
-#: part/serializers.py:845
+#: part/serializers.py:863
msgid "Filename of an existing part image"
msgstr "A meglévő alkatrész képfájl neve"
-#: part/serializers.py:862
+#: part/serializers.py:880
msgid "Image file does not exist"
msgstr "A képfájl nem létezik"
-#: part/serializers.py:1068
+#: part/serializers.py:1086
msgid "Limit stocktake report to a particular part, and any variant parts"
msgstr "Leltár riport korlátozása bizonyos alkatrészre és variánsra"
-#: part/serializers.py:1078
+#: part/serializers.py:1096
msgid "Limit stocktake report to a particular part category, and any child categories"
msgstr "Leltár riport korlátozása bizonyos alkatrész kategóriára és az alatta lévőkre"
-#: part/serializers.py:1088
+#: part/serializers.py:1106
msgid "Limit stocktake report to a particular stock location, and any child locations"
msgstr "Leltár riport korlátozása bizonyos készlethelyre és az alatta lévőkre"
-#: part/serializers.py:1094
+#: part/serializers.py:1112
msgid "Exclude External Stock"
msgstr "Külső készlet nélkül"
-#: part/serializers.py:1095
+#: part/serializers.py:1113
msgid "Exclude stock items in external locations"
msgstr "Külső helyeken lévő készlet nélkül"
-#: part/serializers.py:1100
+#: part/serializers.py:1118
msgid "Generate Report"
msgstr "Riport létrehozása"
-#: part/serializers.py:1101
+#: part/serializers.py:1119
msgid "Generate report file containing calculated stocktake data"
msgstr "Riport fájl létrehozása a számított leltár adatokkal"
-#: part/serializers.py:1106
+#: part/serializers.py:1124
msgid "Update Parts"
msgstr "Alaktrészek frissítése"
-#: part/serializers.py:1107
+#: part/serializers.py:1125
msgid "Update specified parts with calculated stocktake data"
msgstr "Megadott alkatrészek frissítése a számított leltár adatokkal"
-#: part/serializers.py:1115
+#: part/serializers.py:1133
msgid "Stocktake functionality is not enabled"
msgstr "Leltár funkció nincs engedélyezve"
-#: part/serializers.py:1221
+#: part/serializers.py:1239
msgid "Override calculated value for minimum price"
msgstr "Számított minimum ár felülbírálása"
-#: part/serializers.py:1228
+#: part/serializers.py:1246
msgid "Minimum price currency"
msgstr "Minimum ár pénzneme"
-#: part/serializers.py:1236
+#: part/serializers.py:1254
msgid "Override calculated value for maximum price"
msgstr "Számított maximum ár felülbírálása"
-#: part/serializers.py:1243
+#: part/serializers.py:1261
msgid "Maximum price currency"
msgstr "Maximum ár pénzneme"
-#: part/serializers.py:1272
+#: part/serializers.py:1290
msgid "Update"
msgstr "Frissítés"
-#: part/serializers.py:1273
+#: part/serializers.py:1291
msgid "Update pricing for this part"
msgstr "Alkatrész árak frissítése"
-#: part/serializers.py:1296
+#: part/serializers.py:1314
#, python-brace-format
msgid "Could not convert from provided currencies to {default_currency}"
msgstr "Megadott pénznem átváltása {default_currency}-re sikertelen"
-#: part/serializers.py:1303
+#: part/serializers.py:1321
msgid "Minimum price must not be greater than maximum price"
msgstr "A Minimum ár nem lehet nagyobb mint a Maximum ár"
-#: part/serializers.py:1306
+#: part/serializers.py:1324
msgid "Maximum price must not be less than minimum price"
msgstr "A Maximum ár nem lehet kisebb mint a Minimum ár"
-#: part/serializers.py:1632
+#: part/serializers.py:1660
msgid "Select part to copy BOM from"
msgstr "Válassz alkatrészt ahonnan az alkatrészjegyzéket másoljuk"
-#: part/serializers.py:1640
+#: part/serializers.py:1668
msgid "Remove Existing Data"
msgstr "Létező adat törlése"
-#: part/serializers.py:1641
+#: part/serializers.py:1669
msgid "Remove existing BOM items before copying"
msgstr "Meglévő alkatrészjegyzék tételek törlése a másolás előtt"
-#: part/serializers.py:1646
+#: part/serializers.py:1674
msgid "Include Inherited"
msgstr "Örököltekkel együtt"
-#: part/serializers.py:1647
+#: part/serializers.py:1675
msgid "Include BOM items which are inherited from templated parts"
msgstr "Sablon alkatrészektől örökölt alkatrészjegyzék tételek használata"
-#: part/serializers.py:1652
+#: part/serializers.py:1680
msgid "Skip Invalid Rows"
msgstr "Hibás sorok kihagyása"
-#: part/serializers.py:1653
+#: part/serializers.py:1681
msgid "Enable this option to skip invalid rows"
msgstr "Engedély a hibás sorok kihagyására"
-#: part/serializers.py:1658
+#: part/serializers.py:1686
msgid "Copy Substitute Parts"
msgstr "Helyettesítő alkatrészek másolása"
-#: part/serializers.py:1659
+#: part/serializers.py:1687
msgid "Copy substitute parts when duplicate BOM items"
msgstr "Helyettesítő alkatrészek másolása az alkatrészjegyzék tételek másolásakor"
-#: part/serializers.py:1693
+#: part/serializers.py:1721
msgid "Clear Existing BOM"
msgstr "Meglévő alkatrészjegyzék törlése"
-#: part/serializers.py:1694
+#: part/serializers.py:1722
msgid "Delete existing BOM items before uploading"
msgstr "Meglévő alkatrészjegyzék tételek törlése a feltöltés előtt"
-#: part/serializers.py:1724
+#: part/serializers.py:1752
msgid "No part column specified"
msgstr "Nincs megadva alkatrész oszlop"
-#: part/serializers.py:1768
+#: part/serializers.py:1796
msgid "Multiple matching parts found"
msgstr "Több egyező alkatrész is található"
-#: part/serializers.py:1771
+#: part/serializers.py:1799
msgid "No matching part found"
msgstr "Nincs egyező alkatrész"
-#: part/serializers.py:1774
+#: part/serializers.py:1802
msgid "Part is not designated as a component"
msgstr "Az alkatrész nem lett összetevőként jelölve"
-#: part/serializers.py:1783
+#: part/serializers.py:1811
msgid "Quantity not provided"
msgstr "Mennyiség nincs megadva"
-#: part/serializers.py:1791
+#: part/serializers.py:1819
msgid "Invalid quantity"
msgstr "Érvénytelen mennyiség"
-#: part/serializers.py:1812
+#: part/serializers.py:1840
msgid "At least one BOM item is required"
msgstr "Legalább egy alkatrészjegyzék tétel szükséges"
@@ -7222,7 +7255,7 @@ msgid "Validate BOM"
msgstr "Alkatrészjegyzék jóváhagyása"
#: part/templates/part/detail.html:283 part/templates/part/detail.html:284
-#: templates/js/translated/bom.js:1314 templates/js/translated/bom.js:1315
+#: templates/js/translated/bom.js:1320 templates/js/translated/bom.js:1321
msgid "Add BOM Item"
msgstr "Alkatrészjegyzék tétel hozzáadása"
@@ -7406,7 +7439,7 @@ msgstr "Gyártáshoz lefoglalva"
msgid "Allocated to Sales Orders"
msgstr "Vevő rendeléshez lefoglalva"
-#: part/templates/part/part_base.html:235 templates/js/translated/bom.js:1213
+#: part/templates/part/part_base.html:235 templates/js/translated/bom.js:1219
msgid "Can Build"
msgstr "Gyártható"
@@ -8785,7 +8818,7 @@ msgstr "Válassz egy egyező beszállítói alkatrészt ehhez a készlet tételh
msgid "Where is this stock item located?"
msgstr "Hol található ez az alkatrész?"
-#: stock/models.py:786 stock/serializers.py:1318
+#: stock/models.py:786 stock/serializers.py:1324
msgid "Packaging this stock item is stored in"
msgstr "A csomagolása ennek a készlet tételnek itt van tárolva"
@@ -8797,7 +8830,7 @@ msgstr "Ez a tétel be van építve egy másik tételbe?"
msgid "Serial number for this item"
msgstr "Sorozatszám ehhez a tételhez"
-#: stock/models.py:830 stock/serializers.py:1301
+#: stock/models.py:830 stock/serializers.py:1307
msgid "Batch code for this stock item"
msgstr "Batch kód ehhez a készlet tételhez"
@@ -8906,7 +8939,7 @@ msgstr "Készlet tétel gyártás alatt"
msgid "Serialized stock cannot be merged"
msgstr "Követésre kötelezett készlet nem vonható össze"
-#: stock/models.py:1639 stock/serializers.py:1207
+#: stock/models.py:1639 stock/serializers.py:1213
msgid "Duplicate stock items"
msgstr "Duplikált készlet tételek vannak"
@@ -8987,7 +9020,7 @@ msgstr "A mennyiség nem lépheti túl a rendelkezésre álló készletet ({q})"
msgid "Enter serial numbers for new items"
msgstr "Írd be a sorozatszámokat az új tételekhez"
-#: stock/serializers.py:473 stock/serializers.py:1164 stock/serializers.py:1420
+#: stock/serializers.py:473 stock/serializers.py:1170 stock/serializers.py:1426
msgid "Destination stock location"
msgstr "Cél készlet hely"
@@ -9060,77 +9093,78 @@ msgstr "Válaszd ki a státuszváltásra szánt készlet tételeket"
msgid "No stock items selected"
msgstr "Nincs készlet tétel kiválasztva"
-#: stock/serializers.py:863 stock/templates/stock/location.html:165
+#: stock/serializers.py:863 stock/serializers.py:926
+#: stock/templates/stock/location.html:165
#: stock/templates/stock/location.html:213
#: stock/templates/stock/location_sidebar.html:5
msgid "Sublocations"
msgstr "Alhelyek"
-#: stock/serializers.py:1036
+#: stock/serializers.py:1042
msgid "Part must be salable"
msgstr "Az alkatrésznek értékesíthetőnek kell lennie"
-#: stock/serializers.py:1040
+#: stock/serializers.py:1046
msgid "Item is allocated to a sales order"
msgstr "A tétel egy vevő rendeléshez foglalt"
-#: stock/serializers.py:1044
+#: stock/serializers.py:1050
msgid "Item is allocated to a build order"
msgstr "A tétel egy gyártási utasításhoz foglalt"
-#: stock/serializers.py:1068
+#: stock/serializers.py:1074
msgid "Customer to assign stock items"
msgstr "Vevő akihez rendeljük a készlet tételeket"
-#: stock/serializers.py:1074
+#: stock/serializers.py:1080
msgid "Selected company is not a customer"
msgstr "A kiválasztott cég nem egy vevő"
-#: stock/serializers.py:1082
+#: stock/serializers.py:1088
msgid "Stock assignment notes"
msgstr "Készlet hozzárendelés megjegyzései"
-#: stock/serializers.py:1092 stock/serializers.py:1346
+#: stock/serializers.py:1098 stock/serializers.py:1352
msgid "A list of stock items must be provided"
msgstr "A készlet tételek listáját meg kell adni"
-#: stock/serializers.py:1171
+#: stock/serializers.py:1177
msgid "Stock merging notes"
msgstr "Készlet összevonás megjegyzései"
-#: stock/serializers.py:1176
+#: stock/serializers.py:1182
msgid "Allow mismatched suppliers"
msgstr "Nem egyező beszállítók megengedése"
-#: stock/serializers.py:1177
+#: stock/serializers.py:1183
msgid "Allow stock items with different supplier parts to be merged"
msgstr "Különböző beszállítói alkatrészekből származó készletek összevonásának engedélyezése"
-#: stock/serializers.py:1182
+#: stock/serializers.py:1188
msgid "Allow mismatched status"
msgstr "Nem egyező állapotok megjelenítése"
-#: stock/serializers.py:1183
+#: stock/serializers.py:1189
msgid "Allow stock items with different status codes to be merged"
msgstr "Különböző állapotú készletek összevonásának engedélyezése"
-#: stock/serializers.py:1193
+#: stock/serializers.py:1199
msgid "At least two stock items must be provided"
msgstr "Legalább két készlet tételt meg kell adni"
-#: stock/serializers.py:1260
+#: stock/serializers.py:1266
msgid "No Change"
msgstr "Nincs változás"
-#: stock/serializers.py:1289
+#: stock/serializers.py:1295
msgid "StockItem primary key value"
msgstr "Készlet tétel elsődleges kulcs értéke"
-#: stock/serializers.py:1308
+#: stock/serializers.py:1314
msgid "Stock item status code"
msgstr "Készlet tétel státusz kódja"
-#: stock/serializers.py:1336
+#: stock/serializers.py:1342
msgid "Stock transaction notes"
msgstr "Készlet tranzakció megjegyzései"
@@ -10663,7 +10697,7 @@ msgid "The following parts are low on required stock"
msgstr "A következő alkatrészek szükséges készlete alacsony"
#: templates/email/build_order_required_stock.html:18
-#: templates/js/translated/bom.js:1668 templates/js/translated/build.js:2557
+#: templates/js/translated/bom.js:1674 templates/js/translated/build.js:2557
msgid "Required Quantity"
msgstr "Szükséges mennyiség"
@@ -10677,7 +10711,7 @@ msgid "Click on the following link to view this part"
msgstr "Klikk a következő linkre az alkatrész megjelenítéséhez"
#: templates/email/low_stock_notification.html:18
-#: templates/js/translated/part.js:3209
+#: templates/js/translated/part.js:3218
msgid "Minimum Quantity"
msgstr "Minimum mennyiség"
@@ -11052,62 +11086,68 @@ msgstr "Alkatrészjegyzék árazása nem teljes"
msgid "No pricing available"
msgstr "Nincsenek árak"
-#: templates/js/translated/bom.js:1182 templates/js/translated/build.js:2596
+#: templates/js/translated/bom.js:1184 templates/js/translated/build.js:2622
+#, fuzzy
+#| msgid "External Link"
+msgid "External stock"
+msgstr "Külső link"
+
+#: templates/js/translated/bom.js:1188 templates/js/translated/build.js:2596
#: templates/js/translated/sales_order.js:1910
msgid "No Stock Available"
msgstr "Nincs szabad"
-#: templates/js/translated/bom.js:1187 templates/js/translated/build.js:2600
+#: templates/js/translated/bom.js:1193 templates/js/translated/build.js:2600
msgid "Includes variant and substitute stock"
msgstr "Változatokkal és helyettesítőkkel együtt"
-#: templates/js/translated/bom.js:1189 templates/js/translated/build.js:2602
+#: templates/js/translated/bom.js:1195 templates/js/translated/build.js:2602
#: templates/js/translated/part.js:1256
#: templates/js/translated/sales_order.js:1907
msgid "Includes variant stock"
msgstr "Változatokkal együtt"
-#: templates/js/translated/bom.js:1191 templates/js/translated/build.js:2604
+#: templates/js/translated/bom.js:1197 templates/js/translated/build.js:2604
msgid "Includes substitute stock"
msgstr "Helyettesítőkkel együtt"
-#: templates/js/translated/bom.js:1219 templates/js/translated/build.js:2587
+#: templates/js/translated/bom.js:1225 templates/js/translated/build.js:2587
msgid "Consumable item"
msgstr "Fogyóeszköz tétel"
-#: templates/js/translated/bom.js:1279
+#: templates/js/translated/bom.js:1285
msgid "Validate BOM Item"
msgstr "Alkatrészjegyzék tétel jóváhagyása"
-#: templates/js/translated/bom.js:1281
+#: templates/js/translated/bom.js:1287
msgid "This line has been validated"
msgstr "Ez a sor jóvá lett hagyva"
-#: templates/js/translated/bom.js:1283
+#: templates/js/translated/bom.js:1289
msgid "Edit substitute parts"
msgstr "Helyettesítő alkatrészek szerkesztése"
-#: templates/js/translated/bom.js:1285 templates/js/translated/bom.js:1480
+#: templates/js/translated/bom.js:1291 templates/js/translated/bom.js:1486
msgid "Edit BOM Item"
msgstr "Alkatrészjegyzék tétel szerkesztése"
-#: templates/js/translated/bom.js:1287
+#: templates/js/translated/bom.js:1293
msgid "Delete BOM Item"
msgstr "Alkatrészjegyzék tétel törlése"
-#: templates/js/translated/bom.js:1307
+#: templates/js/translated/bom.js:1313
msgid "View BOM"
msgstr "Alkatrészjegyzék megtekintése"
-#: templates/js/translated/bom.js:1391
+#: templates/js/translated/bom.js:1397
msgid "No BOM items found"
msgstr "Nem találhatók alkatrészjegyzék tételek"
-#: templates/js/translated/bom.js:1651 templates/js/translated/build.js:2486
+#: templates/js/translated/bom.js:1657 templates/js/translated/build.js:2486
msgid "Required Part"
msgstr "Szükséges alkatrész"
-#: templates/js/translated/bom.js:1677
+#: templates/js/translated/bom.js:1683
msgid "Inherited from parent BOM"
msgstr "Örökölve a szülő alkatrészjegyzéktől"
@@ -11450,29 +11490,29 @@ msgstr "Mennyiségi egység"
msgid "Sufficient stock available"
msgstr "Van elegendő"
-#: templates/js/translated/build.js:2643
+#: templates/js/translated/build.js:2647
msgid "Consumable Item"
msgstr "Fogyóeszköz tétel"
-#: templates/js/translated/build.js:2648
+#: templates/js/translated/build.js:2652
msgid "Tracked item"
msgstr "Követett tétel"
-#: templates/js/translated/build.js:2655
+#: templates/js/translated/build.js:2659
#: templates/js/translated/sales_order.js:2016
msgid "Build stock"
msgstr "Gyártási készlet"
-#: templates/js/translated/build.js:2660 templates/js/translated/stock.js:1829
+#: templates/js/translated/build.js:2664 templates/js/translated/stock.js:1829
msgid "Order stock"
msgstr "Készlet rendelés"
-#: templates/js/translated/build.js:2664
+#: templates/js/translated/build.js:2668
#: templates/js/translated/sales_order.js:2010
msgid "Allocate stock"
msgstr "Lefoglalt készlet"
-#: templates/js/translated/build.js:2668
+#: templates/js/translated/build.js:2672
msgid "Remove stock allocation"
msgstr "Készlet foglalások törlése"
@@ -12314,64 +12354,64 @@ msgstr "Alkategóriák betöltése"
msgid "Subscribed category"
msgstr "Értesítésre beállított kategória"
-#: templates/js/translated/part.js:2855
+#: templates/js/translated/part.js:2864
msgid "No test templates matching query"
msgstr "Nincs a lekérdezéssel egyező teszt sablon"
-#: templates/js/translated/part.js:2877 templates/js/translated/search.js:342
+#: templates/js/translated/part.js:2886 templates/js/translated/search.js:342
msgid "results"
msgstr "találat"
-#: templates/js/translated/part.js:2927 templates/js/translated/stock.js:1446
+#: templates/js/translated/part.js:2936 templates/js/translated/stock.js:1446
msgid "Edit test result"
msgstr "Teszt eredmény szerkesztése"
-#: templates/js/translated/part.js:2928 templates/js/translated/stock.js:1447
+#: templates/js/translated/part.js:2937 templates/js/translated/stock.js:1447
#: templates/js/translated/stock.js:1692
msgid "Delete test result"
msgstr "Teszt eredmény törlése"
-#: templates/js/translated/part.js:2932
+#: templates/js/translated/part.js:2941
msgid "This test is defined for a parent part"
msgstr "Ez a teszt a szülő alkatrészhez lett felvéve"
-#: templates/js/translated/part.js:2948
+#: templates/js/translated/part.js:2957
msgid "Edit Test Result Template"
msgstr "Teszt eredmény sablon szerkesztése"
-#: templates/js/translated/part.js:2962
+#: templates/js/translated/part.js:2971
msgid "Delete Test Result Template"
msgstr "Teszt eredmény sablon törlése"
-#: templates/js/translated/part.js:3041 templates/js/translated/part.js:3042
+#: templates/js/translated/part.js:3050 templates/js/translated/part.js:3051
msgid "No date specified"
msgstr "Nincs megadva dátum"
-#: templates/js/translated/part.js:3044
+#: templates/js/translated/part.js:3053
msgid "Specified date is in the past"
msgstr "A megadott dátum a múltban van"
-#: templates/js/translated/part.js:3050
+#: templates/js/translated/part.js:3059
msgid "Speculative"
msgstr "Spekulatív"
-#: templates/js/translated/part.js:3100
+#: templates/js/translated/part.js:3109
msgid "No scheduling information available for this part"
msgstr "Az alkatrészhez nem áll rendelkezésre ütemezési információ"
-#: templates/js/translated/part.js:3106
+#: templates/js/translated/part.js:3115
msgid "Error fetching scheduling information for this part"
msgstr "Hiba az alkatrész ütemezési információinak betöltésekor"
-#: templates/js/translated/part.js:3202
+#: templates/js/translated/part.js:3211
msgid "Scheduled Stock Quantities"
msgstr "Ütemezett készlet mennyiség"
-#: templates/js/translated/part.js:3218
+#: templates/js/translated/part.js:3227
msgid "Maximum Quantity"
msgstr "Maximum mennyiség"
-#: templates/js/translated/part.js:3263
+#: templates/js/translated/part.js:3272
msgid "Minimum Stock Level"
msgstr "Minimális készlet"
@@ -14053,4 +14093,3 @@ msgstr "Jogosultság tételek szerkesztéséhez"
#: users/models.py:413
msgid "Permission to delete items"
msgstr "Jogosultság tételek törléséhez"
-
diff --git a/InvenTree/locale/id/LC_MESSAGES/django.po b/InvenTree/locale/id/LC_MESSAGES/django.po
index be27e826e6..c788eee3cf 100644
--- a/InvenTree/locale/id/LC_MESSAGES/django.po
+++ b/InvenTree/locale/id/LC_MESSAGES/django.po
@@ -2,7 +2,7 @@ msgid ""
msgstr ""
"Project-Id-Version: inventree\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2024-02-28 04:05+0000\n"
+"POT-Creation-Date: 2024-03-05 00:41+0000\n"
"PO-Revision-Date: 2024-02-28 07:23\n"
"Last-Translator: \n"
"Language-Team: Indonesian\n"
@@ -66,9 +66,9 @@ msgstr "Masukkan tanggal"
#: report/templates/report/inventree_build_order_base.html:172
#: stock/admin.py:226 stock/models.py:2335 stock/models.py:2451
#: stock/serializers.py:479 stock/serializers.py:632 stock/serializers.py:728
-#: stock/serializers.py:778 stock/serializers.py:1081 stock/serializers.py:1170
-#: stock/serializers.py:1335 stock/templates/stock/stock_sidebar.html:25
-#: templates/js/translated/barcode.js:143 templates/js/translated/bom.js:1259
+#: stock/serializers.py:778 stock/serializers.py:1087 stock/serializers.py:1176
+#: stock/serializers.py:1341 stock/templates/stock/stock_sidebar.html:25
+#: templates/js/translated/barcode.js:143 templates/js/translated/bom.js:1265
#: templates/js/translated/company.js:1674 templates/js/translated/order.js:347
#: templates/js/translated/part.js:1080
#: templates/js/translated/purchase_order.js:2201
@@ -523,7 +523,7 @@ msgstr "Nama"
#: templates/js/translated/order.js:298 templates/js/translated/part.js:1238
#: templates/js/translated/part.js:1483 templates/js/translated/part.js:1621
#: templates/js/translated/part.js:1958 templates/js/translated/part.js:2355
-#: templates/js/translated/part.js:2785 templates/js/translated/part.js:2887
+#: templates/js/translated/part.js:2785 templates/js/translated/part.js:2896
#: templates/js/translated/plugin.js:80
#: templates/js/translated/purchase_order.js:1707
#: templates/js/translated/purchase_order.js:1850
@@ -678,7 +678,7 @@ msgstr "URL file gambar external"
msgid "Downloading images from remote URL is not enabled"
msgstr "Unduhan gambar dari URL external tidak aktif"
-#: InvenTree/status.py:66 part/serializers.py:1120
+#: InvenTree/status.py:66 part/serializers.py:1138
msgid "Background worker check failed"
msgstr ""
@@ -960,7 +960,7 @@ msgid "Tracked"
msgstr ""
#: build/api.py:285 part/admin.py:144 templates/js/translated/build.js:1741
-#: templates/js/translated/build.js:2626
+#: templates/js/translated/build.js:2630
#: templates/js/translated/sales_order.js:1929
#: templates/js/translated/table_filters.js:571
msgid "Allocated"
@@ -1044,11 +1044,11 @@ msgstr "Produksi induk dari produksi ini"
#: build/models.py:199 build/templates/build/build_base.html:97
#: build/templates/build/detail.html:29 company/models.py:1044
#: order/models.py:1389 order/models.py:1532 order/models.py:1533
-#: part/api.py:1528 part/models.py:389 part/models.py:3003 part/models.py:3147
-#: part/models.py:3291 part/models.py:3314 part/models.py:3335
-#: part/models.py:3357 part/models.py:3458 part/models.py:3754
-#: part/models.py:3885 part/models.py:3978 part/models.py:4339
-#: part/serializers.py:1066 part/serializers.py:1631
+#: part/api.py:1528 part/api.py:1820 part/models.py:389 part/models.py:3003
+#: part/models.py:3147 part/models.py:3291 part/models.py:3314
+#: part/models.py:3335 part/models.py:3357 part/models.py:3458
+#: part/models.py:3754 part/models.py:3885 part/models.py:3978
+#: part/models.py:4339 part/serializers.py:1084 part/serializers.py:1659
#: part/templates/part/part_app_base.html:8
#: part/templates/part/part_pricing.html:12
#: part/templates/part/upload_bom.html:52
@@ -1147,7 +1147,7 @@ msgid "Build status code"
msgstr "Kode status pembuatan"
#: build/models.py:264 build/serializers.py:280 order/serializers.py:549
-#: stock/models.py:826 stock/serializers.py:1300
+#: stock/models.py:826 stock/serializers.py:1306
#: templates/js/translated/purchase_order.js:1129
msgid "Batch Code"
msgstr "Kode Kelompok"
@@ -1242,48 +1242,48 @@ msgstr ""
msgid "Project code for this build order"
msgstr ""
-#: build/models.py:559
+#: build/models.py:575
#, python-brace-format
msgid "Build order {build} has been completed"
msgstr ""
-#: build/models.py:565
+#: build/models.py:581
msgid "A build order has been completed"
msgstr ""
-#: build/models.py:783 build/models.py:858
+#: build/models.py:799 build/models.py:874
msgid "No build output specified"
msgstr "Tidak ada hasil produksi yang ditentukan"
-#: build/models.py:786
+#: build/models.py:802
msgid "Build output is already completed"
msgstr "Hasil produksi sudah selesai"
-#: build/models.py:789
+#: build/models.py:805
msgid "Build output does not match Build Order"
msgstr "Hasil produksi tidak sesuai dengan order produksi"
-#: build/models.py:862 build/serializers.py:223 build/serializers.py:262
+#: build/models.py:878 build/serializers.py:223 build/serializers.py:262
#: build/serializers.py:831 order/models.py:526 order/serializers.py:401
-#: order/serializers.py:544 part/serializers.py:1423 part/serializers.py:1789
+#: order/serializers.py:544 part/serializers.py:1442 part/serializers.py:1817
#: stock/models.py:665 stock/models.py:1477 stock/serializers.py:450
msgid "Quantity must be greater than zero"
msgstr "Jumlah harus lebih besar daripada nol"
-#: build/models.py:867 build/serializers.py:228
+#: build/models.py:883 build/serializers.py:228
msgid "Quantity cannot be greater than the output quantity"
msgstr ""
-#: build/models.py:924 build/serializers.py:533
+#: build/models.py:940 build/serializers.py:533
#, python-brace-format
msgid "Build output {serial} has not passed all required tests"
msgstr ""
-#: build/models.py:1286
+#: build/models.py:1302
msgid "Build object"
msgstr ""
-#: build/models.py:1300 build/models.py:1558 build/serializers.py:210
+#: build/models.py:1316 build/models.py:1574 build/serializers.py:210
#: build/serializers.py:247 build/templates/build/build_base.html:102
#: build/templates/build/detail.html:34 common/models.py:2432
#: order/models.py:1247 order/models.py:1902 order/serializers.py:1306
@@ -1310,7 +1310,7 @@ msgstr ""
#: templates/js/translated/company.js:1808
#: templates/js/translated/model_renderers.js:230
#: templates/js/translated/order.js:304 templates/js/translated/part.js:961
-#: templates/js/translated/part.js:1811 templates/js/translated/part.js:3332
+#: templates/js/translated/part.js:1811 templates/js/translated/part.js:3341
#: templates/js/translated/pricing.js:381
#: templates/js/translated/pricing.js:474
#: templates/js/translated/pricing.js:522
@@ -1330,38 +1330,38 @@ msgstr ""
msgid "Quantity"
msgstr "Jumlah"
-#: build/models.py:1301
+#: build/models.py:1317
msgid "Required quantity for build order"
msgstr ""
-#: build/models.py:1381
+#: build/models.py:1397
msgid "Build item must specify a build output, as master part is marked as trackable"
msgstr "Item produksi harus menentukan hasil produksi karena bagian utama telah ditandai sebagai dapat dilacak"
-#: build/models.py:1390
+#: build/models.py:1406
#, python-brace-format
msgid "Allocated quantity ({q}) must not exceed available stock quantity ({a})"
msgstr ""
-#: build/models.py:1400 order/models.py:1853
+#: build/models.py:1416 order/models.py:1853
msgid "Stock item is over-allocated"
msgstr "Item stok teralokasikan terlalu banyak"
-#: build/models.py:1406 order/models.py:1856
+#: build/models.py:1422 order/models.py:1856
msgid "Allocation quantity must be greater than zero"
msgstr "Jumlah yang dialokasikan harus lebih dari nol"
-#: build/models.py:1412
+#: build/models.py:1428
msgid "Quantity must be 1 for serialized stock"
msgstr "Jumlah harus 1 untuk stok dengan nomor seri"
-#: build/models.py:1473
+#: build/models.py:1489
msgid "Selected stock item does not match BOM line"
msgstr ""
-#: build/models.py:1545 build/serializers.py:811 order/serializers.py:1150
-#: order/serializers.py:1171 stock/serializers.py:544 stock/serializers.py:1019
-#: stock/serializers.py:1131 stock/templates/stock/item_base.html:10
+#: build/models.py:1561 build/serializers.py:811 order/serializers.py:1150
+#: order/serializers.py:1171 stock/serializers.py:544 stock/serializers.py:1025
+#: stock/serializers.py:1137 stock/templates/stock/item_base.html:10
#: stock/templates/stock/item_base.html:23
#: stock/templates/stock/item_base.html:194
#: templates/js/translated/build.js:1742
@@ -1376,19 +1376,19 @@ msgstr ""
msgid "Stock Item"
msgstr "Stok Item"
-#: build/models.py:1546
+#: build/models.py:1562
msgid "Source stock item"
msgstr "Sumber stok item"
-#: build/models.py:1559
+#: build/models.py:1575
msgid "Stock quantity to allocate to build"
msgstr "Jumlah stok yang dialokasikan ke produksi"
-#: build/models.py:1567
+#: build/models.py:1583
msgid "Install into"
msgstr "Pasang ke"
-#: build/models.py:1568
+#: build/models.py:1584
msgid "Destination stock item"
msgstr "Tujuan stok item"
@@ -1452,9 +1452,9 @@ msgid "A list of build outputs must be provided"
msgstr "Daftar hasil pesanan harus disediakan"
#: build/serializers.py:426 build/serializers.py:498 order/serializers.py:533
-#: order/serializers.py:641 order/serializers.py:1646 part/serializers.py:1086
+#: order/serializers.py:641 order/serializers.py:1646 part/serializers.py:1104
#: stock/serializers.py:472 stock/serializers.py:627 stock/serializers.py:723
-#: stock/serializers.py:1163 stock/serializers.py:1419
+#: stock/serializers.py:1169 stock/serializers.py:1425
#: stock/templates/stock/item_base.html:394
#: templates/js/translated/barcode.js:547
#: templates/js/translated/barcode.js:795 templates/js/translated/build.js:999
@@ -1494,7 +1494,7 @@ msgstr "Lokasi hasil pesanan yang selesai"
#: build/serializers.py:505 build/templates/build/build_base.html:151
#: build/templates/build/detail.html:62 order/models.py:910
#: order/models.py:2005 order/serializers.py:565 stock/admin.py:165
-#: stock/serializers.py:774 stock/serializers.py:1307
+#: stock/serializers.py:774 stock/serializers.py:1313
#: stock/templates/stock/item_base.html:427
#: templates/js/translated/barcode.js:252 templates/js/translated/build.js:2189
#: templates/js/translated/purchase_order.js:1308
@@ -1602,7 +1602,7 @@ msgstr ""
msgid "bom_item.part must point to the same part as the build order"
msgstr "bom_item.part harus mengarah ke bagian yang sesuai dengan order produksi"
-#: build/serializers.py:817 stock/serializers.py:1032
+#: build/serializers.py:817 stock/serializers.py:1038
msgid "Item must be in stock"
msgstr "Item harus tersedia dalam stok"
@@ -1659,44 +1659,45 @@ msgstr ""
msgid "Allocate optional BOM items to build order"
msgstr ""
-#: build/serializers.py:1096 part/models.py:3895 part/models.py:4331
+#: build/serializers.py:1097 part/models.py:3895 part/models.py:4331
#: stock/api.py:745
msgid "BOM Item"
msgstr "Item tagihan material"
-#: build/serializers.py:1105 templates/js/translated/index.js:130
+#: build/serializers.py:1106 templates/js/translated/index.js:130
msgid "Allocated Stock"
msgstr ""
-#: build/serializers.py:1110 part/admin.py:132 part/bom.py:173
-#: part/serializers.py:1441 part/templates/part/part_base.html:210
-#: templates/js/translated/bom.js:1202 templates/js/translated/build.js:2614
-#: templates/js/translated/part.js:709 templates/js/translated/part.js:2148
+#: build/serializers.py:1111 part/admin.py:132 part/bom.py:173
+#: part/serializers.py:798 part/serializers.py:1460
+#: part/templates/part/part_base.html:210 templates/js/translated/bom.js:1208
+#: templates/js/translated/build.js:2614 templates/js/translated/part.js:709
+#: templates/js/translated/part.js:2148
#: templates/js/translated/table_filters.js:170
msgid "On Order"
msgstr ""
-#: build/serializers.py:1115 part/serializers.py:1443
+#: build/serializers.py:1116 part/serializers.py:1462
#: templates/js/translated/build.js:2618
#: templates/js/translated/table_filters.js:360
msgid "In Production"
msgstr ""
-#: build/serializers.py:1120 part/bom.py:172 part/serializers.py:1454
+#: build/serializers.py:1121 part/bom.py:172 part/serializers.py:1473
#: part/templates/part/part_base.html:192
#: templates/js/translated/sales_order.js:1893
msgid "Available Stock"
msgstr ""
-#: build/tasks.py:149
+#: build/tasks.py:171
msgid "Stock required for build order"
msgstr "Stok dibutuhkan untuk order produksi"
-#: build/tasks.py:166
+#: build/tasks.py:188
msgid "Overdue Build Order"
msgstr ""
-#: build/tasks.py:171
+#: build/tasks.py:193
#, python-brace-format
msgid "Build order {bo} is now overdue"
msgstr ""
@@ -1990,27 +1991,31 @@ msgstr ""
msgid "Order Parts"
msgstr ""
-#: build/templates/build/detail.html:210
-msgid "Incomplete Build Outputs"
-msgstr ""
-
-#: build/templates/build/detail.html:214
-msgid "Create new build output"
+#: build/templates/build/detail.html:205
+msgid "Available stock has been filtered based on specified source location for this build order"
msgstr ""
#: build/templates/build/detail.html:215
+msgid "Incomplete Build Outputs"
+msgstr ""
+
+#: build/templates/build/detail.html:219
+msgid "Create new build output"
+msgstr ""
+
+#: build/templates/build/detail.html:220
msgid "New Build Output"
msgstr ""
-#: build/templates/build/detail.html:232 build/templates/build/sidebar.html:15
+#: build/templates/build/detail.html:237 build/templates/build/sidebar.html:15
msgid "Consumed Stock"
msgstr ""
-#: build/templates/build/detail.html:244
+#: build/templates/build/detail.html:249
msgid "Completed Build Outputs"
msgstr ""
-#: build/templates/build/detail.html:256 build/templates/build/sidebar.html:19
+#: build/templates/build/detail.html:261 build/templates/build/sidebar.html:19
#: company/templates/company/detail.html:229
#: company/templates/company/manufacturer_part.html:141
#: company/templates/company/manufacturer_part_sidebar.html:9
@@ -2026,15 +2031,15 @@ msgstr ""
msgid "Attachments"
msgstr ""
-#: build/templates/build/detail.html:271
+#: build/templates/build/detail.html:276
msgid "Build Notes"
msgstr ""
-#: build/templates/build/detail.html:426
+#: build/templates/build/detail.html:434
msgid "Allocation Complete"
msgstr ""
-#: build/templates/build/detail.html:427
+#: build/templates/build/detail.html:435
msgid "All lines have been fully allocated"
msgstr ""
@@ -2436,7 +2441,7 @@ msgid "Parts are templates by default"
msgstr ""
#: common/models.py:1456 part/admin.py:91 part/admin.py:431 part/models.py:1015
-#: templates/js/translated/bom.js:1633
+#: templates/js/translated/bom.js:1639
#: templates/js/translated/table_filters.js:330
#: templates/js/translated/table_filters.js:721
msgid "Assembly"
@@ -3495,7 +3500,7 @@ msgstr ""
msgid "Price break quantity"
msgstr ""
-#: common/models.py:2440 company/serializers.py:484 order/admin.py:42
+#: common/models.py:2440 company/serializers.py:486 order/admin.py:42
#: order/models.py:1321 order/models.py:2226
#: templates/js/translated/company.js:1813 templates/js/translated/part.js:1885
#: templates/js/translated/pricing.js:621
@@ -3972,7 +3977,7 @@ msgstr ""
#: company/models.py:495 company/templates/company/company_base.html:76
#: company/templates/company/manufacturer_part.html:90
-#: company/templates/company/supplier_part.html:145 part/serializers.py:497
+#: company/templates/company/supplier_part.html:145 part/serializers.py:505
#: stock/templates/stock/item_base.html:207
#: templates/js/translated/company.js:506
#: templates/js/translated/company.js:1108
@@ -3987,7 +3992,7 @@ msgid "Select manufacturer"
msgstr ""
#: company/models.py:502 company/templates/company/manufacturer_part.html:101
-#: company/templates/company/supplier_part.html:153 part/serializers.py:507
+#: company/templates/company/supplier_part.html:153 part/serializers.py:515
#: templates/js/translated/company.js:351
#: templates/js/translated/company.js:1107
#: templates/js/translated/company.js:1302
@@ -4059,7 +4064,7 @@ msgstr ""
#: company/models.py:795 company/templates/company/company_base.html:81
#: company/templates/company/supplier_part.html:129 order/models.py:453
#: order/templates/order/order_base.html:136 part/bom.py:272 part/bom.py:310
-#: part/serializers.py:481 plugin/builtin/suppliers/digikey.py:25
+#: part/serializers.py:489 plugin/builtin/suppliers/digikey.py:25
#: plugin/builtin/suppliers/lcsc.py:26 plugin/builtin/suppliers/mouser.py:24
#: plugin/builtin/suppliers/tme.py:26 stock/templates/stock/item_base.html:224
#: templates/email/overdue_purchase_order.html:16
@@ -4076,7 +4081,7 @@ msgstr ""
msgid "Select supplier"
msgstr ""
-#: company/models.py:802 part/serializers.py:492
+#: company/models.py:802 part/serializers.py:500
msgid "Supplier stock keeping unit"
msgstr ""
@@ -4112,7 +4117,7 @@ msgid "Minimum charge (e.g. stocking fee)"
msgstr ""
#: company/models.py:851 company/templates/company/supplier_part.html:160
-#: stock/admin.py:224 stock/models.py:785 stock/serializers.py:1317
+#: stock/admin.py:224 stock/models.py:785 stock/serializers.py:1323
#: stock/templates/stock/item_base.html:240
#: templates/js/translated/company.js:1636
#: templates/js/translated/stock.js:2387
@@ -4157,7 +4162,7 @@ msgstr ""
msgid "Date of last update of availability data"
msgstr ""
-#: company/serializers.py:153
+#: company/serializers.py:155
msgid "Default currency used for this supplier"
msgstr ""
@@ -4218,7 +4223,7 @@ msgstr ""
#: company/templates/company/company_base.html:86 order/models.py:898
#: order/models.py:1993 order/templates/order/return_order_base.html:131
#: order/templates/order/sales_order_base.html:144 stock/models.py:807
-#: stock/models.py:808 stock/serializers.py:1067
+#: stock/models.py:808 stock/serializers.py:1073
#: stock/templates/stock/item_base.html:405
#: templates/email/overdue_sales_order.html:16
#: templates/js/translated/company.js:502
@@ -4429,8 +4434,9 @@ msgstr ""
#: company/templates/company/manufacturer_part.html:119
#: company/templates/company/supplier_part.html:15 company/views.py:31
-#: part/admin.py:122 part/templates/part/part_sidebar.html:33
-#: templates/InvenTree/search.html:190 templates/navbar.html:48
+#: part/admin.py:122 part/serializers.py:802
+#: part/templates/part/part_sidebar.html:33 templates/InvenTree/search.html:190
+#: templates/navbar.html:48
msgid "Suppliers"
msgstr ""
@@ -4528,7 +4534,7 @@ msgid "No supplier information available"
msgstr ""
#: company/templates/company/supplier_part.html:139 part/bom.py:279
-#: part/bom.py:311 part/serializers.py:491
+#: part/bom.py:311 part/serializers.py:499
#: templates/js/translated/company.js:349 templates/js/translated/part.js:1786
#: templates/js/translated/pricing.js:510
#: templates/js/translated/purchase_order.js:1851
@@ -4577,10 +4583,12 @@ msgstr ""
msgid "Update Part Availability"
msgstr ""
-#: company/templates/company/supplier_part_sidebar.html:5 part/stocktake.py:223
+#: company/templates/company/supplier_part_sidebar.html:5
+#: part/serializers.py:801 part/stocktake.py:223
#: part/templates/part/category.html:183
#: part/templates/part/category_sidebar.html:17 stock/admin.py:69
-#: stock/serializers.py:760 stock/templates/stock/location.html:170
+#: stock/serializers.py:760 stock/serializers.py:924
+#: stock/templates/stock/location.html:170
#: stock/templates/stock/location.html:184
#: stock/templates/stock/location.html:196
#: stock/templates/stock/location_sidebar.html:7
@@ -4640,7 +4648,7 @@ msgid "Label template file"
msgstr ""
#: label/models.py:143 part/models.py:3484 report/models.py:322
-#: templates/js/translated/part.js:2891
+#: templates/js/translated/part.js:2900
#: templates/js/translated/table_filters.js:481
msgid "Enabled"
msgstr ""
@@ -5733,7 +5741,7 @@ msgid "Pending Shipments"
msgstr ""
#: order/templates/order/sales_order_detail.html:71
-#: templates/js/translated/bom.js:1271 templates/js/translated/filters.js:296
+#: templates/js/translated/bom.js:1277 templates/js/translated/filters.js:296
msgid "Actions"
msgstr ""
@@ -5861,10 +5869,10 @@ msgstr ""
msgid "Category Path"
msgstr ""
-#: part/admin.py:323 part/models.py:390 part/serializers.py:259
-#: part/serializers.py:373 part/templates/part/cat_link.html:3
-#: part/templates/part/category.html:23 part/templates/part/category.html:141
-#: part/templates/part/category.html:161
+#: part/admin.py:323 part/models.py:390 part/serializers.py:112
+#: part/serializers.py:265 part/serializers.py:381
+#: part/templates/part/cat_link.html:3 part/templates/part/category.html:23
+#: part/templates/part/category.html:141 part/templates/part/category.html:161
#: part/templates/part/category_sidebar.html:9
#: templates/InvenTree/index.html:36 templates/InvenTree/search.html:84
#: templates/InvenTree/settings/sidebar.html:47
@@ -5889,13 +5897,13 @@ msgstr ""
msgid "Part IPN"
msgstr ""
-#: part/admin.py:421 part/serializers.py:1220
+#: part/admin.py:421 part/serializers.py:1238
#: templates/js/translated/pricing.js:358
#: templates/js/translated/pricing.js:1024
msgid "Minimum Price"
msgstr ""
-#: part/admin.py:426 part/serializers.py:1235
+#: part/admin.py:426 part/serializers.py:1253
#: templates/js/translated/pricing.js:353
#: templates/js/translated/pricing.js:1032
msgid "Maximum Price"
@@ -5974,7 +5982,7 @@ msgid "This option must be selected"
msgstr ""
#: part/api.py:1541 part/models.py:895 part/models.py:3385 part/models.py:3831
-#: part/serializers.py:388 part/serializers.py:1076
+#: part/serializers.py:396 part/serializers.py:1094
#: part/templates/part/part_base.html:260 stock/api.py:733
#: templates/InvenTree/settings/settings_staff_js.html:300
#: templates/js/translated/notification.js:60
@@ -5982,12 +5990,17 @@ msgstr ""
msgid "Category"
msgstr ""
+#: part/api.py:1828
+msgid "Uses"
+msgstr ""
+
#: part/bom.py:170 part/models.py:100 part/models.py:938
#: part/templates/part/category.html:116 part/templates/part/part_base.html:367
msgid "Default Location"
msgstr ""
-#: part/bom.py:171 templates/email/low_stock_notification.html:16
+#: part/bom.py:171 part/serializers.py:803
+#: templates/email/low_stock_notification.html:16
msgid "Total Stock"
msgstr ""
@@ -6010,7 +6023,8 @@ msgstr ""
msgid "Default location for parts in this category"
msgstr ""
-#: part/models.py:106 stock/models.py:165 templates/js/translated/stock.js:2736
+#: part/models.py:106 stock/models.py:165 templates/js/translated/part.js:2810
+#: templates/js/translated/stock.js:2736
#: templates/js/translated/table_filters.js:239
#: templates/js/translated/table_filters.js:283
msgid "Structural"
@@ -6418,7 +6432,7 @@ msgstr ""
msgid "Test with this name already exists for this part"
msgstr ""
-#: part/models.py:3464 templates/js/translated/part.js:2870
+#: part/models.py:3464 templates/js/translated/part.js:2879
msgid "Test Name"
msgstr ""
@@ -6446,7 +6460,7 @@ msgstr ""
msgid "Is this test enabled?"
msgstr ""
-#: part/models.py:3489 templates/js/translated/part.js:2899
+#: part/models.py:3489 templates/js/translated/part.js:2908
#: templates/js/translated/table_filters.js:477
msgid "Required"
msgstr ""
@@ -6455,7 +6469,7 @@ msgstr ""
msgid "Is this test required to pass?"
msgstr ""
-#: part/models.py:3495 templates/js/translated/part.js:2907
+#: part/models.py:3495 templates/js/translated/part.js:2916
msgid "Requires Value"
msgstr ""
@@ -6463,7 +6477,7 @@ msgstr ""
msgid "Does this test require a value when adding a test result?"
msgstr ""
-#: part/models.py:3501 templates/js/translated/part.js:2914
+#: part/models.py:3501 templates/js/translated/part.js:2923
msgid "Requires Attachment"
msgstr ""
@@ -6685,311 +6699,327 @@ msgstr ""
msgid "Duplicate relationship already exists"
msgstr ""
-#: part/serializers.py:128 part/templates/part/category.html:122
-#: part/templates/part/category.html:207
+#: part/serializers.py:114 part/serializers.py:134
+#: part/templates/part/category.html:122 part/templates/part/category.html:207
#: part/templates/part/category_sidebar.html:7
msgid "Subcategories"
msgstr ""
-#: part/serializers.py:172
+#: part/serializers.py:178
msgid "Results"
msgstr ""
-#: part/serializers.py:173
+#: part/serializers.py:179
msgid "Number of results recorded against this template"
msgstr ""
-#: part/serializers.py:197 part/serializers.py:215 stock/serializers.py:384
+#: part/serializers.py:203 part/serializers.py:221 stock/serializers.py:384
msgid "Purchase currency of this stock item"
msgstr ""
-#: part/serializers.py:260
+#: part/serializers.py:266
msgid "Number of parts using this template"
msgstr ""
-#: part/serializers.py:379
+#: part/serializers.py:387
msgid "No parts selected"
msgstr ""
-#: part/serializers.py:389
+#: part/serializers.py:397
msgid "Select category"
msgstr ""
-#: part/serializers.py:419
+#: part/serializers.py:427
msgid "Original Part"
msgstr ""
-#: part/serializers.py:420
+#: part/serializers.py:428
msgid "Select original part to duplicate"
msgstr ""
-#: part/serializers.py:425
+#: part/serializers.py:433
msgid "Copy Image"
msgstr ""
-#: part/serializers.py:426
+#: part/serializers.py:434
msgid "Copy image from original part"
msgstr ""
-#: part/serializers.py:432 part/templates/part/detail.html:277
+#: part/serializers.py:440 part/templates/part/detail.html:277
msgid "Copy BOM"
msgstr ""
-#: part/serializers.py:433
+#: part/serializers.py:441
msgid "Copy bill of materials from original part"
msgstr ""
-#: part/serializers.py:439
+#: part/serializers.py:447
msgid "Copy Parameters"
msgstr ""
-#: part/serializers.py:440
+#: part/serializers.py:448
msgid "Copy parameter data from original part"
msgstr ""
-#: part/serializers.py:446
+#: part/serializers.py:454
msgid "Copy Notes"
msgstr ""
-#: part/serializers.py:447
+#: part/serializers.py:455
msgid "Copy notes from original part"
msgstr ""
-#: part/serializers.py:460
+#: part/serializers.py:468
msgid "Initial Stock Quantity"
msgstr ""
-#: part/serializers.py:462
+#: part/serializers.py:470
msgid "Specify initial stock quantity for this Part. If quantity is zero, no stock is added."
msgstr ""
-#: part/serializers.py:469
+#: part/serializers.py:477
msgid "Initial Stock Location"
msgstr ""
-#: part/serializers.py:470
+#: part/serializers.py:478
msgid "Specify initial stock location for this Part"
msgstr ""
-#: part/serializers.py:482
+#: part/serializers.py:490
msgid "Select supplier (or leave blank to skip)"
msgstr ""
-#: part/serializers.py:498
+#: part/serializers.py:506
msgid "Select manufacturer (or leave blank to skip)"
msgstr ""
-#: part/serializers.py:508
+#: part/serializers.py:516
msgid "Manufacturer part number"
msgstr ""
-#: part/serializers.py:515
+#: part/serializers.py:523
msgid "Selected company is not a valid supplier"
msgstr ""
-#: part/serializers.py:524
+#: part/serializers.py:532
msgid "Selected company is not a valid manufacturer"
msgstr ""
-#: part/serializers.py:535
+#: part/serializers.py:543
msgid "Manufacturer part matching this MPN already exists"
msgstr ""
-#: part/serializers.py:542
+#: part/serializers.py:550
msgid "Supplier part matching this SKU already exists"
msgstr ""
-#: part/serializers.py:815 part/templates/part/copy_part.html:9
+#: part/serializers.py:804
+#, fuzzy
+#| msgid "External Link"
+msgid "External Stock"
+msgstr "Tautan eksternal"
+
+#: part/serializers.py:806
+#, fuzzy
+#| msgid "Accept Unallocated"
+msgid "Unallocated Stock"
+msgstr "Terima Tidak Teralokasikan"
+
+#: part/serializers.py:808
+msgid "Variant Stock"
+msgstr ""
+
+#: part/serializers.py:833 part/templates/part/copy_part.html:9
#: templates/js/translated/part.js:471
msgid "Duplicate Part"
msgstr ""
-#: part/serializers.py:816
+#: part/serializers.py:834
msgid "Copy initial data from another Part"
msgstr ""
-#: part/serializers.py:822 templates/js/translated/part.js:102
+#: part/serializers.py:840 templates/js/translated/part.js:102
msgid "Initial Stock"
msgstr ""
-#: part/serializers.py:823
+#: part/serializers.py:841
msgid "Create Part with initial stock quantity"
msgstr ""
-#: part/serializers.py:829
+#: part/serializers.py:847
msgid "Supplier Information"
msgstr ""
-#: part/serializers.py:830
+#: part/serializers.py:848
msgid "Add initial supplier information for this part"
msgstr ""
-#: part/serializers.py:838
+#: part/serializers.py:856
msgid "Copy Category Parameters"
msgstr ""
-#: part/serializers.py:839
+#: part/serializers.py:857
msgid "Copy parameter templates from selected part category"
msgstr ""
-#: part/serializers.py:844
+#: part/serializers.py:862
msgid "Existing Image"
msgstr ""
-#: part/serializers.py:845
+#: part/serializers.py:863
msgid "Filename of an existing part image"
msgstr ""
-#: part/serializers.py:862
+#: part/serializers.py:880
msgid "Image file does not exist"
msgstr ""
-#: part/serializers.py:1068
+#: part/serializers.py:1086
msgid "Limit stocktake report to a particular part, and any variant parts"
msgstr ""
-#: part/serializers.py:1078
+#: part/serializers.py:1096
msgid "Limit stocktake report to a particular part category, and any child categories"
msgstr ""
-#: part/serializers.py:1088
+#: part/serializers.py:1106
msgid "Limit stocktake report to a particular stock location, and any child locations"
msgstr ""
-#: part/serializers.py:1094
+#: part/serializers.py:1112
msgid "Exclude External Stock"
msgstr ""
-#: part/serializers.py:1095
+#: part/serializers.py:1113
msgid "Exclude stock items in external locations"
msgstr ""
-#: part/serializers.py:1100
+#: part/serializers.py:1118
msgid "Generate Report"
msgstr ""
-#: part/serializers.py:1101
+#: part/serializers.py:1119
msgid "Generate report file containing calculated stocktake data"
msgstr ""
-#: part/serializers.py:1106
+#: part/serializers.py:1124
msgid "Update Parts"
msgstr ""
-#: part/serializers.py:1107
+#: part/serializers.py:1125
msgid "Update specified parts with calculated stocktake data"
msgstr ""
-#: part/serializers.py:1115
+#: part/serializers.py:1133
msgid "Stocktake functionality is not enabled"
msgstr ""
-#: part/serializers.py:1221
+#: part/serializers.py:1239
msgid "Override calculated value for minimum price"
msgstr ""
-#: part/serializers.py:1228
+#: part/serializers.py:1246
msgid "Minimum price currency"
msgstr ""
-#: part/serializers.py:1236
+#: part/serializers.py:1254
msgid "Override calculated value for maximum price"
msgstr ""
-#: part/serializers.py:1243
+#: part/serializers.py:1261
msgid "Maximum price currency"
msgstr ""
-#: part/serializers.py:1272
+#: part/serializers.py:1290
msgid "Update"
msgstr ""
-#: part/serializers.py:1273
+#: part/serializers.py:1291
msgid "Update pricing for this part"
msgstr ""
-#: part/serializers.py:1296
+#: part/serializers.py:1314
#, python-brace-format
msgid "Could not convert from provided currencies to {default_currency}"
msgstr ""
-#: part/serializers.py:1303
+#: part/serializers.py:1321
msgid "Minimum price must not be greater than maximum price"
msgstr ""
-#: part/serializers.py:1306
+#: part/serializers.py:1324
msgid "Maximum price must not be less than minimum price"
msgstr ""
-#: part/serializers.py:1632
+#: part/serializers.py:1660
msgid "Select part to copy BOM from"
msgstr ""
-#: part/serializers.py:1640
+#: part/serializers.py:1668
msgid "Remove Existing Data"
msgstr ""
-#: part/serializers.py:1641
+#: part/serializers.py:1669
msgid "Remove existing BOM items before copying"
msgstr ""
-#: part/serializers.py:1646
+#: part/serializers.py:1674
msgid "Include Inherited"
msgstr ""
-#: part/serializers.py:1647
+#: part/serializers.py:1675
msgid "Include BOM items which are inherited from templated parts"
msgstr ""
-#: part/serializers.py:1652
+#: part/serializers.py:1680
msgid "Skip Invalid Rows"
msgstr ""
-#: part/serializers.py:1653
+#: part/serializers.py:1681
msgid "Enable this option to skip invalid rows"
msgstr ""
-#: part/serializers.py:1658
+#: part/serializers.py:1686
msgid "Copy Substitute Parts"
msgstr ""
-#: part/serializers.py:1659
+#: part/serializers.py:1687
msgid "Copy substitute parts when duplicate BOM items"
msgstr ""
-#: part/serializers.py:1693
+#: part/serializers.py:1721
msgid "Clear Existing BOM"
msgstr ""
-#: part/serializers.py:1694
+#: part/serializers.py:1722
msgid "Delete existing BOM items before uploading"
msgstr ""
-#: part/serializers.py:1724
+#: part/serializers.py:1752
msgid "No part column specified"
msgstr ""
-#: part/serializers.py:1768
+#: part/serializers.py:1796
msgid "Multiple matching parts found"
msgstr ""
-#: part/serializers.py:1771
+#: part/serializers.py:1799
msgid "No matching part found"
msgstr ""
-#: part/serializers.py:1774
+#: part/serializers.py:1802
msgid "Part is not designated as a component"
msgstr ""
-#: part/serializers.py:1783
+#: part/serializers.py:1811
msgid "Quantity not provided"
msgstr ""
-#: part/serializers.py:1791
+#: part/serializers.py:1819
msgid "Invalid quantity"
msgstr ""
-#: part/serializers.py:1812
+#: part/serializers.py:1840
msgid "At least one BOM item is required"
msgstr ""
@@ -7221,7 +7251,7 @@ msgid "Validate BOM"
msgstr ""
#: part/templates/part/detail.html:283 part/templates/part/detail.html:284
-#: templates/js/translated/bom.js:1314 templates/js/translated/bom.js:1315
+#: templates/js/translated/bom.js:1320 templates/js/translated/bom.js:1321
msgid "Add BOM Item"
msgstr ""
@@ -7405,7 +7435,7 @@ msgstr ""
msgid "Allocated to Sales Orders"
msgstr ""
-#: part/templates/part/part_base.html:235 templates/js/translated/bom.js:1213
+#: part/templates/part/part_base.html:235 templates/js/translated/bom.js:1219
msgid "Can Build"
msgstr ""
@@ -8784,7 +8814,7 @@ msgstr ""
msgid "Where is this stock item located?"
msgstr ""
-#: stock/models.py:786 stock/serializers.py:1318
+#: stock/models.py:786 stock/serializers.py:1324
msgid "Packaging this stock item is stored in"
msgstr ""
@@ -8796,7 +8826,7 @@ msgstr ""
msgid "Serial number for this item"
msgstr ""
-#: stock/models.py:830 stock/serializers.py:1301
+#: stock/models.py:830 stock/serializers.py:1307
msgid "Batch code for this stock item"
msgstr ""
@@ -8905,7 +8935,7 @@ msgstr ""
msgid "Serialized stock cannot be merged"
msgstr ""
-#: stock/models.py:1639 stock/serializers.py:1207
+#: stock/models.py:1639 stock/serializers.py:1213
msgid "Duplicate stock items"
msgstr ""
@@ -8986,7 +9016,7 @@ msgstr ""
msgid "Enter serial numbers for new items"
msgstr ""
-#: stock/serializers.py:473 stock/serializers.py:1164 stock/serializers.py:1420
+#: stock/serializers.py:473 stock/serializers.py:1170 stock/serializers.py:1426
msgid "Destination stock location"
msgstr ""
@@ -9059,77 +9089,78 @@ msgstr ""
msgid "No stock items selected"
msgstr ""
-#: stock/serializers.py:863 stock/templates/stock/location.html:165
+#: stock/serializers.py:863 stock/serializers.py:926
+#: stock/templates/stock/location.html:165
#: stock/templates/stock/location.html:213
#: stock/templates/stock/location_sidebar.html:5
msgid "Sublocations"
msgstr ""
-#: stock/serializers.py:1036
+#: stock/serializers.py:1042
msgid "Part must be salable"
msgstr ""
-#: stock/serializers.py:1040
+#: stock/serializers.py:1046
msgid "Item is allocated to a sales order"
msgstr ""
-#: stock/serializers.py:1044
+#: stock/serializers.py:1050
msgid "Item is allocated to a build order"
msgstr ""
-#: stock/serializers.py:1068
+#: stock/serializers.py:1074
msgid "Customer to assign stock items"
msgstr ""
-#: stock/serializers.py:1074
+#: stock/serializers.py:1080
msgid "Selected company is not a customer"
msgstr ""
-#: stock/serializers.py:1082
+#: stock/serializers.py:1088
msgid "Stock assignment notes"
msgstr ""
-#: stock/serializers.py:1092 stock/serializers.py:1346
+#: stock/serializers.py:1098 stock/serializers.py:1352
msgid "A list of stock items must be provided"
msgstr ""
-#: stock/serializers.py:1171
+#: stock/serializers.py:1177
msgid "Stock merging notes"
msgstr ""
-#: stock/serializers.py:1176
+#: stock/serializers.py:1182
msgid "Allow mismatched suppliers"
msgstr ""
-#: stock/serializers.py:1177
+#: stock/serializers.py:1183
msgid "Allow stock items with different supplier parts to be merged"
msgstr ""
-#: stock/serializers.py:1182
+#: stock/serializers.py:1188
msgid "Allow mismatched status"
msgstr ""
-#: stock/serializers.py:1183
+#: stock/serializers.py:1189
msgid "Allow stock items with different status codes to be merged"
msgstr ""
-#: stock/serializers.py:1193
+#: stock/serializers.py:1199
msgid "At least two stock items must be provided"
msgstr ""
-#: stock/serializers.py:1260
+#: stock/serializers.py:1266
msgid "No Change"
msgstr ""
-#: stock/serializers.py:1289
+#: stock/serializers.py:1295
msgid "StockItem primary key value"
msgstr ""
-#: stock/serializers.py:1308
+#: stock/serializers.py:1314
msgid "Stock item status code"
msgstr ""
-#: stock/serializers.py:1336
+#: stock/serializers.py:1342
msgid "Stock transaction notes"
msgstr ""
@@ -10662,7 +10693,7 @@ msgid "The following parts are low on required stock"
msgstr ""
#: templates/email/build_order_required_stock.html:18
-#: templates/js/translated/bom.js:1668 templates/js/translated/build.js:2557
+#: templates/js/translated/bom.js:1674 templates/js/translated/build.js:2557
msgid "Required Quantity"
msgstr ""
@@ -10676,7 +10707,7 @@ msgid "Click on the following link to view this part"
msgstr ""
#: templates/email/low_stock_notification.html:18
-#: templates/js/translated/part.js:3209
+#: templates/js/translated/part.js:3218
msgid "Minimum Quantity"
msgstr ""
@@ -11051,62 +11082,68 @@ msgstr ""
msgid "No pricing available"
msgstr ""
-#: templates/js/translated/bom.js:1182 templates/js/translated/build.js:2596
+#: templates/js/translated/bom.js:1184 templates/js/translated/build.js:2622
+#, fuzzy
+#| msgid "External Link"
+msgid "External stock"
+msgstr "Tautan eksternal"
+
+#: templates/js/translated/bom.js:1188 templates/js/translated/build.js:2596
#: templates/js/translated/sales_order.js:1910
msgid "No Stock Available"
msgstr ""
-#: templates/js/translated/bom.js:1187 templates/js/translated/build.js:2600
+#: templates/js/translated/bom.js:1193 templates/js/translated/build.js:2600
msgid "Includes variant and substitute stock"
msgstr ""
-#: templates/js/translated/bom.js:1189 templates/js/translated/build.js:2602
+#: templates/js/translated/bom.js:1195 templates/js/translated/build.js:2602
#: templates/js/translated/part.js:1256
#: templates/js/translated/sales_order.js:1907
msgid "Includes variant stock"
msgstr ""
-#: templates/js/translated/bom.js:1191 templates/js/translated/build.js:2604
+#: templates/js/translated/bom.js:1197 templates/js/translated/build.js:2604
msgid "Includes substitute stock"
msgstr ""
-#: templates/js/translated/bom.js:1219 templates/js/translated/build.js:2587
+#: templates/js/translated/bom.js:1225 templates/js/translated/build.js:2587
msgid "Consumable item"
msgstr ""
-#: templates/js/translated/bom.js:1279
+#: templates/js/translated/bom.js:1285
msgid "Validate BOM Item"
msgstr ""
-#: templates/js/translated/bom.js:1281
+#: templates/js/translated/bom.js:1287
msgid "This line has been validated"
msgstr ""
-#: templates/js/translated/bom.js:1283
+#: templates/js/translated/bom.js:1289
msgid "Edit substitute parts"
msgstr ""
-#: templates/js/translated/bom.js:1285 templates/js/translated/bom.js:1480
+#: templates/js/translated/bom.js:1291 templates/js/translated/bom.js:1486
msgid "Edit BOM Item"
msgstr ""
-#: templates/js/translated/bom.js:1287
+#: templates/js/translated/bom.js:1293
msgid "Delete BOM Item"
msgstr ""
-#: templates/js/translated/bom.js:1307
+#: templates/js/translated/bom.js:1313
msgid "View BOM"
msgstr ""
-#: templates/js/translated/bom.js:1391
+#: templates/js/translated/bom.js:1397
msgid "No BOM items found"
msgstr ""
-#: templates/js/translated/bom.js:1651 templates/js/translated/build.js:2486
+#: templates/js/translated/bom.js:1657 templates/js/translated/build.js:2486
msgid "Required Part"
msgstr ""
-#: templates/js/translated/bom.js:1677
+#: templates/js/translated/bom.js:1683
msgid "Inherited from parent BOM"
msgstr ""
@@ -11449,29 +11486,29 @@ msgstr ""
msgid "Sufficient stock available"
msgstr ""
-#: templates/js/translated/build.js:2643
+#: templates/js/translated/build.js:2647
msgid "Consumable Item"
msgstr ""
-#: templates/js/translated/build.js:2648
+#: templates/js/translated/build.js:2652
msgid "Tracked item"
msgstr ""
-#: templates/js/translated/build.js:2655
+#: templates/js/translated/build.js:2659
#: templates/js/translated/sales_order.js:2016
msgid "Build stock"
msgstr ""
-#: templates/js/translated/build.js:2660 templates/js/translated/stock.js:1829
+#: templates/js/translated/build.js:2664 templates/js/translated/stock.js:1829
msgid "Order stock"
msgstr ""
-#: templates/js/translated/build.js:2664
+#: templates/js/translated/build.js:2668
#: templates/js/translated/sales_order.js:2010
msgid "Allocate stock"
msgstr ""
-#: templates/js/translated/build.js:2668
+#: templates/js/translated/build.js:2672
msgid "Remove stock allocation"
msgstr ""
@@ -12313,64 +12350,64 @@ msgstr ""
msgid "Subscribed category"
msgstr ""
-#: templates/js/translated/part.js:2855
+#: templates/js/translated/part.js:2864
msgid "No test templates matching query"
msgstr ""
-#: templates/js/translated/part.js:2877 templates/js/translated/search.js:342
+#: templates/js/translated/part.js:2886 templates/js/translated/search.js:342
msgid "results"
msgstr ""
-#: templates/js/translated/part.js:2927 templates/js/translated/stock.js:1446
+#: templates/js/translated/part.js:2936 templates/js/translated/stock.js:1446
msgid "Edit test result"
msgstr ""
-#: templates/js/translated/part.js:2928 templates/js/translated/stock.js:1447
+#: templates/js/translated/part.js:2937 templates/js/translated/stock.js:1447
#: templates/js/translated/stock.js:1692
msgid "Delete test result"
msgstr ""
-#: templates/js/translated/part.js:2932
+#: templates/js/translated/part.js:2941
msgid "This test is defined for a parent part"
msgstr ""
-#: templates/js/translated/part.js:2948
+#: templates/js/translated/part.js:2957
msgid "Edit Test Result Template"
msgstr ""
-#: templates/js/translated/part.js:2962
+#: templates/js/translated/part.js:2971
msgid "Delete Test Result Template"
msgstr ""
-#: templates/js/translated/part.js:3041 templates/js/translated/part.js:3042
+#: templates/js/translated/part.js:3050 templates/js/translated/part.js:3051
msgid "No date specified"
msgstr ""
-#: templates/js/translated/part.js:3044
+#: templates/js/translated/part.js:3053
msgid "Specified date is in the past"
msgstr ""
-#: templates/js/translated/part.js:3050
+#: templates/js/translated/part.js:3059
msgid "Speculative"
msgstr ""
-#: templates/js/translated/part.js:3100
+#: templates/js/translated/part.js:3109
msgid "No scheduling information available for this part"
msgstr ""
-#: templates/js/translated/part.js:3106
+#: templates/js/translated/part.js:3115
msgid "Error fetching scheduling information for this part"
msgstr ""
-#: templates/js/translated/part.js:3202
+#: templates/js/translated/part.js:3211
msgid "Scheduled Stock Quantities"
msgstr ""
-#: templates/js/translated/part.js:3218
+#: templates/js/translated/part.js:3227
msgid "Maximum Quantity"
msgstr ""
-#: templates/js/translated/part.js:3263
+#: templates/js/translated/part.js:3272
msgid "Minimum Stock Level"
msgstr ""
@@ -14052,4 +14089,3 @@ msgstr ""
#: users/models.py:413
msgid "Permission to delete items"
msgstr ""
-
diff --git a/InvenTree/locale/it/LC_MESSAGES/django.po b/InvenTree/locale/it/LC_MESSAGES/django.po
index a4087e5bd8..03e78a1721 100644
--- a/InvenTree/locale/it/LC_MESSAGES/django.po
+++ b/InvenTree/locale/it/LC_MESSAGES/django.po
@@ -2,7 +2,7 @@ msgid ""
msgstr ""
"Project-Id-Version: inventree\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2024-02-28 04:05+0000\n"
+"POT-Creation-Date: 2024-03-05 00:41+0000\n"
"PO-Revision-Date: 2024-02-28 07:23\n"
"Last-Translator: \n"
"Language-Team: Italian\n"
@@ -66,9 +66,9 @@ msgstr "Inserisci la data"
#: report/templates/report/inventree_build_order_base.html:172
#: stock/admin.py:226 stock/models.py:2335 stock/models.py:2451
#: stock/serializers.py:479 stock/serializers.py:632 stock/serializers.py:728
-#: stock/serializers.py:778 stock/serializers.py:1081 stock/serializers.py:1170
-#: stock/serializers.py:1335 stock/templates/stock/stock_sidebar.html:25
-#: templates/js/translated/barcode.js:143 templates/js/translated/bom.js:1259
+#: stock/serializers.py:778 stock/serializers.py:1087 stock/serializers.py:1176
+#: stock/serializers.py:1341 stock/templates/stock/stock_sidebar.html:25
+#: templates/js/translated/barcode.js:143 templates/js/translated/bom.js:1265
#: templates/js/translated/company.js:1674 templates/js/translated/order.js:347
#: templates/js/translated/part.js:1080
#: templates/js/translated/purchase_order.js:2201
@@ -523,7 +523,7 @@ msgstr "Nome"
#: templates/js/translated/order.js:298 templates/js/translated/part.js:1238
#: templates/js/translated/part.js:1483 templates/js/translated/part.js:1621
#: templates/js/translated/part.js:1958 templates/js/translated/part.js:2355
-#: templates/js/translated/part.js:2785 templates/js/translated/part.js:2887
+#: templates/js/translated/part.js:2785 templates/js/translated/part.js:2896
#: templates/js/translated/plugin.js:80
#: templates/js/translated/purchase_order.js:1707
#: templates/js/translated/purchase_order.js:1850
@@ -678,7 +678,7 @@ msgstr "URL del file immagine remota"
msgid "Downloading images from remote URL is not enabled"
msgstr "Il download delle immagini da URL remoto non è abilitato"
-#: InvenTree/status.py:66 part/serializers.py:1120
+#: InvenTree/status.py:66 part/serializers.py:1138
msgid "Background worker check failed"
msgstr "Controllo in background non riuscito"
@@ -960,7 +960,7 @@ msgid "Tracked"
msgstr "Monitorato"
#: build/api.py:285 part/admin.py:144 templates/js/translated/build.js:1741
-#: templates/js/translated/build.js:2626
+#: templates/js/translated/build.js:2630
#: templates/js/translated/sales_order.js:1929
#: templates/js/translated/table_filters.js:571
msgid "Allocated"
@@ -1044,11 +1044,11 @@ msgstr "Ordine di produzione a cui questa produzione viene assegnata"
#: build/models.py:199 build/templates/build/build_base.html:97
#: build/templates/build/detail.html:29 company/models.py:1044
#: order/models.py:1389 order/models.py:1532 order/models.py:1533
-#: part/api.py:1528 part/models.py:389 part/models.py:3003 part/models.py:3147
-#: part/models.py:3291 part/models.py:3314 part/models.py:3335
-#: part/models.py:3357 part/models.py:3458 part/models.py:3754
-#: part/models.py:3885 part/models.py:3978 part/models.py:4339
-#: part/serializers.py:1066 part/serializers.py:1631
+#: part/api.py:1528 part/api.py:1820 part/models.py:389 part/models.py:3003
+#: part/models.py:3147 part/models.py:3291 part/models.py:3314
+#: part/models.py:3335 part/models.py:3357 part/models.py:3458
+#: part/models.py:3754 part/models.py:3885 part/models.py:3978
+#: part/models.py:4339 part/serializers.py:1084 part/serializers.py:1659
#: part/templates/part/part_app_base.html:8
#: part/templates/part/part_pricing.html:12
#: part/templates/part/upload_bom.html:52
@@ -1147,7 +1147,7 @@ msgid "Build status code"
msgstr "Codice stato di produzione"
#: build/models.py:264 build/serializers.py:280 order/serializers.py:549
-#: stock/models.py:826 stock/serializers.py:1300
+#: stock/models.py:826 stock/serializers.py:1306
#: templates/js/translated/purchase_order.js:1129
msgid "Batch Code"
msgstr "Codice Lotto"
@@ -1242,48 +1242,48 @@ msgstr "Codice del progetto"
msgid "Project code for this build order"
msgstr "Codice del progetto per questo ordine di produzione"
-#: build/models.py:559
+#: build/models.py:575
#, python-brace-format
msgid "Build order {build} has been completed"
msgstr "L'ordine di produzione {build} è stato completato"
-#: build/models.py:565
+#: build/models.py:581
msgid "A build order has been completed"
msgstr "L'ordine di produzione è stato completato"
-#: build/models.py:783 build/models.py:858
+#: build/models.py:799 build/models.py:874
msgid "No build output specified"
msgstr "Nessun output di produzione specificato"
-#: build/models.py:786
+#: build/models.py:802
msgid "Build output is already completed"
msgstr "La produzione è stata completata"
-#: build/models.py:789
+#: build/models.py:805
msgid "Build output does not match Build Order"
msgstr "L'output della produzione non corrisponde all'ordine di compilazione"
-#: build/models.py:862 build/serializers.py:223 build/serializers.py:262
+#: build/models.py:878 build/serializers.py:223 build/serializers.py:262
#: build/serializers.py:831 order/models.py:526 order/serializers.py:401
-#: order/serializers.py:544 part/serializers.py:1423 part/serializers.py:1789
+#: order/serializers.py:544 part/serializers.py:1442 part/serializers.py:1817
#: stock/models.py:665 stock/models.py:1477 stock/serializers.py:450
msgid "Quantity must be greater than zero"
msgstr "La quantità deve essere maggiore di zero"
-#: build/models.py:867 build/serializers.py:228
+#: build/models.py:883 build/serializers.py:228
msgid "Quantity cannot be greater than the output quantity"
msgstr "La quantità non può essere maggiore della quantità in uscita"
-#: build/models.py:924 build/serializers.py:533
+#: build/models.py:940 build/serializers.py:533
#, python-brace-format
msgid "Build output {serial} has not passed all required tests"
msgstr ""
-#: build/models.py:1286
+#: build/models.py:1302
msgid "Build object"
msgstr "Crea oggetto"
-#: build/models.py:1300 build/models.py:1558 build/serializers.py:210
+#: build/models.py:1316 build/models.py:1574 build/serializers.py:210
#: build/serializers.py:247 build/templates/build/build_base.html:102
#: build/templates/build/detail.html:34 common/models.py:2432
#: order/models.py:1247 order/models.py:1902 order/serializers.py:1306
@@ -1310,7 +1310,7 @@ msgstr "Crea oggetto"
#: templates/js/translated/company.js:1808
#: templates/js/translated/model_renderers.js:230
#: templates/js/translated/order.js:304 templates/js/translated/part.js:961
-#: templates/js/translated/part.js:1811 templates/js/translated/part.js:3332
+#: templates/js/translated/part.js:1811 templates/js/translated/part.js:3341
#: templates/js/translated/pricing.js:381
#: templates/js/translated/pricing.js:474
#: templates/js/translated/pricing.js:522
@@ -1330,38 +1330,38 @@ msgstr "Crea oggetto"
msgid "Quantity"
msgstr "Quantità"
-#: build/models.py:1301
+#: build/models.py:1317
msgid "Required quantity for build order"
msgstr "Quantità richiesta per l'ordine di costruzione"
-#: build/models.py:1381
+#: build/models.py:1397
msgid "Build item must specify a build output, as master part is marked as trackable"
msgstr "L'elemento di compilazione deve specificare un output poiché la parte principale è contrassegnata come rintracciabile"
-#: build/models.py:1390
+#: build/models.py:1406
#, python-brace-format
msgid "Allocated quantity ({q}) must not exceed available stock quantity ({a})"
msgstr "La quantità assegnata ({q}) non deve essere maggiore della quantità disponibile ({a})"
-#: build/models.py:1400 order/models.py:1853
+#: build/models.py:1416 order/models.py:1853
msgid "Stock item is over-allocated"
msgstr "L'articolo in giacenza è sovrallocato"
-#: build/models.py:1406 order/models.py:1856
+#: build/models.py:1422 order/models.py:1856
msgid "Allocation quantity must be greater than zero"
msgstr "La quantità di assegnazione deve essere maggiore di zero"
-#: build/models.py:1412
+#: build/models.py:1428
msgid "Quantity must be 1 for serialized stock"
msgstr "La quantità deve essere 1 per lo stock serializzato"
-#: build/models.py:1473
+#: build/models.py:1489
msgid "Selected stock item does not match BOM line"
msgstr "L'articolo in stock selezionato non corrisponde alla voce nella BOM"
-#: build/models.py:1545 build/serializers.py:811 order/serializers.py:1150
-#: order/serializers.py:1171 stock/serializers.py:544 stock/serializers.py:1019
-#: stock/serializers.py:1131 stock/templates/stock/item_base.html:10
+#: build/models.py:1561 build/serializers.py:811 order/serializers.py:1150
+#: order/serializers.py:1171 stock/serializers.py:544 stock/serializers.py:1025
+#: stock/serializers.py:1137 stock/templates/stock/item_base.html:10
#: stock/templates/stock/item_base.html:23
#: stock/templates/stock/item_base.html:194
#: templates/js/translated/build.js:1742
@@ -1376,19 +1376,19 @@ msgstr "L'articolo in stock selezionato non corrisponde alla voce nella BOM"
msgid "Stock Item"
msgstr "Articoli in magazzino"
-#: build/models.py:1546
+#: build/models.py:1562
msgid "Source stock item"
msgstr "Origine giacenza articolo"
-#: build/models.py:1559
+#: build/models.py:1575
msgid "Stock quantity to allocate to build"
msgstr "Quantità di magazzino da assegnare per la produzione"
-#: build/models.py:1567
+#: build/models.py:1583
msgid "Install into"
msgstr "Installa in"
-#: build/models.py:1568
+#: build/models.py:1584
msgid "Destination stock item"
msgstr "Destinazione articolo in giacenza"
@@ -1452,9 +1452,9 @@ msgid "A list of build outputs must be provided"
msgstr "Deve essere fornito un elenco dei risultati di produzione"
#: build/serializers.py:426 build/serializers.py:498 order/serializers.py:533
-#: order/serializers.py:641 order/serializers.py:1646 part/serializers.py:1086
+#: order/serializers.py:641 order/serializers.py:1646 part/serializers.py:1104
#: stock/serializers.py:472 stock/serializers.py:627 stock/serializers.py:723
-#: stock/serializers.py:1163 stock/serializers.py:1419
+#: stock/serializers.py:1169 stock/serializers.py:1425
#: stock/templates/stock/item_base.html:394
#: templates/js/translated/barcode.js:547
#: templates/js/translated/barcode.js:795 templates/js/translated/build.js:999
@@ -1494,7 +1494,7 @@ msgstr "Posizione per gli output di build completati"
#: build/serializers.py:505 build/templates/build/build_base.html:151
#: build/templates/build/detail.html:62 order/models.py:910
#: order/models.py:2005 order/serializers.py:565 stock/admin.py:165
-#: stock/serializers.py:774 stock/serializers.py:1307
+#: stock/serializers.py:774 stock/serializers.py:1313
#: stock/templates/stock/item_base.html:427
#: templates/js/translated/barcode.js:252 templates/js/translated/build.js:2189
#: templates/js/translated/purchase_order.js:1308
@@ -1602,7 +1602,7 @@ msgstr "Articolo linea di produzione"
msgid "bom_item.part must point to the same part as the build order"
msgstr "gli elementi degli articoli della distinta base devono puntare alla stessa parte dell'ordine di produzione"
-#: build/serializers.py:817 stock/serializers.py:1032
+#: build/serializers.py:817 stock/serializers.py:1038
msgid "Item must be in stock"
msgstr "L'articolo deve essere disponibile"
@@ -1659,44 +1659,45 @@ msgstr "Articoli Opzionali"
msgid "Allocate optional BOM items to build order"
msgstr "Assegna gli elementi opzionali della distinta base all'ordine di produzione"
-#: build/serializers.py:1096 part/models.py:3895 part/models.py:4331
+#: build/serializers.py:1097 part/models.py:3895 part/models.py:4331
#: stock/api.py:745
msgid "BOM Item"
msgstr "Distinta base (Bom)"
-#: build/serializers.py:1105 templates/js/translated/index.js:130
+#: build/serializers.py:1106 templates/js/translated/index.js:130
msgid "Allocated Stock"
msgstr ""
-#: build/serializers.py:1110 part/admin.py:132 part/bom.py:173
-#: part/serializers.py:1441 part/templates/part/part_base.html:210
-#: templates/js/translated/bom.js:1202 templates/js/translated/build.js:2614
-#: templates/js/translated/part.js:709 templates/js/translated/part.js:2148
+#: build/serializers.py:1111 part/admin.py:132 part/bom.py:173
+#: part/serializers.py:798 part/serializers.py:1460
+#: part/templates/part/part_base.html:210 templates/js/translated/bom.js:1208
+#: templates/js/translated/build.js:2614 templates/js/translated/part.js:709
+#: templates/js/translated/part.js:2148
#: templates/js/translated/table_filters.js:170
msgid "On Order"
msgstr "Ordinato"
-#: build/serializers.py:1115 part/serializers.py:1443
+#: build/serializers.py:1116 part/serializers.py:1462
#: templates/js/translated/build.js:2618
#: templates/js/translated/table_filters.js:360
msgid "In Production"
msgstr ""
-#: build/serializers.py:1120 part/bom.py:172 part/serializers.py:1454
+#: build/serializers.py:1121 part/bom.py:172 part/serializers.py:1473
#: part/templates/part/part_base.html:192
#: templates/js/translated/sales_order.js:1893
msgid "Available Stock"
msgstr "Disponibilità in magazzino"
-#: build/tasks.py:149
+#: build/tasks.py:171
msgid "Stock required for build order"
msgstr "Giacenza richiesta per l'ordine di produzione"
-#: build/tasks.py:166
+#: build/tasks.py:188
msgid "Overdue Build Order"
msgstr "Ordine di produzione in ritardo"
-#: build/tasks.py:171
+#: build/tasks.py:193
#, python-brace-format
msgid "Build order {bo} is now overdue"
msgstr "L'ordine di produzione {bo} è in ritardo"
@@ -1990,27 +1991,31 @@ msgstr "Ordina articoli richiesti"
msgid "Order Parts"
msgstr "Ordine Articoli"
-#: build/templates/build/detail.html:210
+#: build/templates/build/detail.html:205
+msgid "Available stock has been filtered based on specified source location for this build order"
+msgstr ""
+
+#: build/templates/build/detail.html:215
msgid "Incomplete Build Outputs"
msgstr "Produzione Incompleta"
-#: build/templates/build/detail.html:214
+#: build/templates/build/detail.html:219
msgid "Create new build output"
msgstr "Crea nuova produzione"
-#: build/templates/build/detail.html:215
+#: build/templates/build/detail.html:220
msgid "New Build Output"
msgstr "Nuova Produzione"
-#: build/templates/build/detail.html:232 build/templates/build/sidebar.html:15
+#: build/templates/build/detail.html:237 build/templates/build/sidebar.html:15
msgid "Consumed Stock"
msgstr ""
-#: build/templates/build/detail.html:244
+#: build/templates/build/detail.html:249
msgid "Completed Build Outputs"
msgstr "Produzioni Completate"
-#: build/templates/build/detail.html:256 build/templates/build/sidebar.html:19
+#: build/templates/build/detail.html:261 build/templates/build/sidebar.html:19
#: company/templates/company/detail.html:229
#: company/templates/company/manufacturer_part.html:141
#: company/templates/company/manufacturer_part_sidebar.html:9
@@ -2026,15 +2031,15 @@ msgstr "Produzioni Completate"
msgid "Attachments"
msgstr "Allegati"
-#: build/templates/build/detail.html:271
+#: build/templates/build/detail.html:276
msgid "Build Notes"
msgstr "Genera Note"
-#: build/templates/build/detail.html:426
+#: build/templates/build/detail.html:434
msgid "Allocation Complete"
msgstr ""
-#: build/templates/build/detail.html:427
+#: build/templates/build/detail.html:435
msgid "All lines have been fully allocated"
msgstr ""
@@ -2436,7 +2441,7 @@ msgid "Parts are templates by default"
msgstr "Gli articoli sono modelli per impostazione predefinita"
#: common/models.py:1456 part/admin.py:91 part/admin.py:431 part/models.py:1015
-#: templates/js/translated/bom.js:1633
+#: templates/js/translated/bom.js:1639
#: templates/js/translated/table_filters.js:330
#: templates/js/translated/table_filters.js:721
msgid "Assembly"
@@ -3495,7 +3500,7 @@ msgstr ""
msgid "Price break quantity"
msgstr "Quantità prezzo limite"
-#: common/models.py:2440 company/serializers.py:484 order/admin.py:42
+#: common/models.py:2440 company/serializers.py:486 order/admin.py:42
#: order/models.py:1321 order/models.py:2226
#: templates/js/translated/company.js:1813 templates/js/translated/part.js:1885
#: templates/js/translated/pricing.js:621
@@ -3972,7 +3977,7 @@ msgstr "Seleziona articolo"
#: company/models.py:495 company/templates/company/company_base.html:76
#: company/templates/company/manufacturer_part.html:90
-#: company/templates/company/supplier_part.html:145 part/serializers.py:497
+#: company/templates/company/supplier_part.html:145 part/serializers.py:505
#: stock/templates/stock/item_base.html:207
#: templates/js/translated/company.js:506
#: templates/js/translated/company.js:1108
@@ -3987,7 +3992,7 @@ msgid "Select manufacturer"
msgstr "Seleziona Produttore"
#: company/models.py:502 company/templates/company/manufacturer_part.html:101
-#: company/templates/company/supplier_part.html:153 part/serializers.py:507
+#: company/templates/company/supplier_part.html:153 part/serializers.py:515
#: templates/js/translated/company.js:351
#: templates/js/translated/company.js:1107
#: templates/js/translated/company.js:1302
@@ -4059,7 +4064,7 @@ msgstr "L'articolo del costruttore collegato deve riferirsi alla stesso articolo
#: company/models.py:795 company/templates/company/company_base.html:81
#: company/templates/company/supplier_part.html:129 order/models.py:453
#: order/templates/order/order_base.html:136 part/bom.py:272 part/bom.py:310
-#: part/serializers.py:481 plugin/builtin/suppliers/digikey.py:25
+#: part/serializers.py:489 plugin/builtin/suppliers/digikey.py:25
#: plugin/builtin/suppliers/lcsc.py:26 plugin/builtin/suppliers/mouser.py:24
#: plugin/builtin/suppliers/tme.py:26 stock/templates/stock/item_base.html:224
#: templates/email/overdue_purchase_order.html:16
@@ -4076,7 +4081,7 @@ msgstr "Fornitore"
msgid "Select supplier"
msgstr "Seleziona fornitore"
-#: company/models.py:802 part/serializers.py:492
+#: company/models.py:802 part/serializers.py:500
msgid "Supplier stock keeping unit"
msgstr "Unità di giacenza magazzino fornitore"
@@ -4112,7 +4117,7 @@ msgid "Minimum charge (e.g. stocking fee)"
msgstr "Onere minimo (ad esempio tassa di stoccaggio)"
#: company/models.py:851 company/templates/company/supplier_part.html:160
-#: stock/admin.py:224 stock/models.py:785 stock/serializers.py:1317
+#: stock/admin.py:224 stock/models.py:785 stock/serializers.py:1323
#: stock/templates/stock/item_base.html:240
#: templates/js/translated/company.js:1636
#: templates/js/translated/stock.js:2387
@@ -4157,7 +4162,7 @@ msgstr "Disponibilità Aggiornata"
msgid "Date of last update of availability data"
msgstr "Data dell’ultimo aggiornamento dei dati sulla disponibilità"
-#: company/serializers.py:153
+#: company/serializers.py:155
msgid "Default currency used for this supplier"
msgstr "Valuta predefinita utilizzata per questo fornitore"
@@ -4218,7 +4223,7 @@ msgstr "Elimina immagine"
#: company/templates/company/company_base.html:86 order/models.py:898
#: order/models.py:1993 order/templates/order/return_order_base.html:131
#: order/templates/order/sales_order_base.html:144 stock/models.py:807
-#: stock/models.py:808 stock/serializers.py:1067
+#: stock/models.py:808 stock/serializers.py:1073
#: stock/templates/stock/item_base.html:405
#: templates/email/overdue_sales_order.html:16
#: templates/js/translated/company.js:502
@@ -4429,8 +4434,9 @@ msgstr "Nessuna informazione sul produttore disponibile"
#: company/templates/company/manufacturer_part.html:119
#: company/templates/company/supplier_part.html:15 company/views.py:31
-#: part/admin.py:122 part/templates/part/part_sidebar.html:33
-#: templates/InvenTree/search.html:190 templates/navbar.html:48
+#: part/admin.py:122 part/serializers.py:802
+#: part/templates/part/part_sidebar.html:33 templates/InvenTree/search.html:190
+#: templates/navbar.html:48
msgid "Suppliers"
msgstr "Fornitori"
@@ -4528,7 +4534,7 @@ msgid "No supplier information available"
msgstr "Nessuna informazione sul fornitore disponibile"
#: company/templates/company/supplier_part.html:139 part/bom.py:279
-#: part/bom.py:311 part/serializers.py:491
+#: part/bom.py:311 part/serializers.py:499
#: templates/js/translated/company.js:349 templates/js/translated/part.js:1786
#: templates/js/translated/pricing.js:510
#: templates/js/translated/purchase_order.js:1851
@@ -4577,10 +4583,12 @@ msgstr ""
msgid "Update Part Availability"
msgstr ""
-#: company/templates/company/supplier_part_sidebar.html:5 part/stocktake.py:223
+#: company/templates/company/supplier_part_sidebar.html:5
+#: part/serializers.py:801 part/stocktake.py:223
#: part/templates/part/category.html:183
#: part/templates/part/category_sidebar.html:17 stock/admin.py:69
-#: stock/serializers.py:760 stock/templates/stock/location.html:170
+#: stock/serializers.py:760 stock/serializers.py:924
+#: stock/templates/stock/location.html:170
#: stock/templates/stock/location.html:184
#: stock/templates/stock/location.html:196
#: stock/templates/stock/location_sidebar.html:7
@@ -4640,7 +4648,7 @@ msgid "Label template file"
msgstr "File modello etichetta"
#: label/models.py:143 part/models.py:3484 report/models.py:322
-#: templates/js/translated/part.js:2891
+#: templates/js/translated/part.js:2900
#: templates/js/translated/table_filters.js:481
msgid "Enabled"
msgstr "Abilitato"
@@ -5733,7 +5741,7 @@ msgid "Pending Shipments"
msgstr "Spedizione in sospeso"
#: order/templates/order/sales_order_detail.html:71
-#: templates/js/translated/bom.js:1271 templates/js/translated/filters.js:296
+#: templates/js/translated/bom.js:1277 templates/js/translated/filters.js:296
msgid "Actions"
msgstr "Azioni"
@@ -5861,10 +5869,10 @@ msgstr "Nome Principale"
msgid "Category Path"
msgstr "Percorso Categoria"
-#: part/admin.py:323 part/models.py:390 part/serializers.py:259
-#: part/serializers.py:373 part/templates/part/cat_link.html:3
-#: part/templates/part/category.html:23 part/templates/part/category.html:141
-#: part/templates/part/category.html:161
+#: part/admin.py:323 part/models.py:390 part/serializers.py:112
+#: part/serializers.py:265 part/serializers.py:381
+#: part/templates/part/cat_link.html:3 part/templates/part/category.html:23
+#: part/templates/part/category.html:141 part/templates/part/category.html:161
#: part/templates/part/category_sidebar.html:9
#: templates/InvenTree/index.html:36 templates/InvenTree/search.html:84
#: templates/InvenTree/settings/sidebar.html:47
@@ -5889,13 +5897,13 @@ msgstr "IPN Principale"
msgid "Part IPN"
msgstr "IPN Articolo"
-#: part/admin.py:421 part/serializers.py:1220
+#: part/admin.py:421 part/serializers.py:1238
#: templates/js/translated/pricing.js:358
#: templates/js/translated/pricing.js:1024
msgid "Minimum Price"
msgstr "Prezzo Minimo"
-#: part/admin.py:426 part/serializers.py:1235
+#: part/admin.py:426 part/serializers.py:1253
#: templates/js/translated/pricing.js:353
#: templates/js/translated/pricing.js:1032
msgid "Maximum Price"
@@ -5974,7 +5982,7 @@ msgid "This option must be selected"
msgstr "Questa opzione deve essere selezionata"
#: part/api.py:1541 part/models.py:895 part/models.py:3385 part/models.py:3831
-#: part/serializers.py:388 part/serializers.py:1076
+#: part/serializers.py:396 part/serializers.py:1094
#: part/templates/part/part_base.html:260 stock/api.py:733
#: templates/InvenTree/settings/settings_staff_js.html:300
#: templates/js/translated/notification.js:60
@@ -5982,12 +5990,17 @@ msgstr "Questa opzione deve essere selezionata"
msgid "Category"
msgstr "Categoria"
+#: part/api.py:1828
+msgid "Uses"
+msgstr ""
+
#: part/bom.py:170 part/models.py:100 part/models.py:938
#: part/templates/part/category.html:116 part/templates/part/part_base.html:367
msgid "Default Location"
msgstr "Posizione Predefinita"
-#: part/bom.py:171 templates/email/low_stock_notification.html:16
+#: part/bom.py:171 part/serializers.py:803
+#: templates/email/low_stock_notification.html:16
msgid "Total Stock"
msgstr "Giacenze Totali"
@@ -6010,7 +6023,8 @@ msgstr "Categorie Articolo"
msgid "Default location for parts in this category"
msgstr "Posizione predefinita per gli articoli di questa categoria"
-#: part/models.py:106 stock/models.py:165 templates/js/translated/stock.js:2736
+#: part/models.py:106 stock/models.py:165 templates/js/translated/part.js:2810
+#: templates/js/translated/stock.js:2736
#: templates/js/translated/table_filters.js:239
#: templates/js/translated/table_filters.js:283
msgid "Structural"
@@ -6418,7 +6432,7 @@ msgstr "Il modello di prova può essere creato solo per gli articoli rintracciab
msgid "Test with this name already exists for this part"
msgstr "Una prova con questo nome esiste già per questo articolo"
-#: part/models.py:3464 templates/js/translated/part.js:2870
+#: part/models.py:3464 templates/js/translated/part.js:2879
msgid "Test Name"
msgstr "Nome Test"
@@ -6446,7 +6460,7 @@ msgstr "Inserisci descrizione per questa prova"
msgid "Is this test enabled?"
msgstr ""
-#: part/models.py:3489 templates/js/translated/part.js:2899
+#: part/models.py:3489 templates/js/translated/part.js:2908
#: templates/js/translated/table_filters.js:477
msgid "Required"
msgstr "Richiesto"
@@ -6455,7 +6469,7 @@ msgstr "Richiesto"
msgid "Is this test required to pass?"
msgstr "Questa prova è necessaria per passare?"
-#: part/models.py:3495 templates/js/translated/part.js:2907
+#: part/models.py:3495 templates/js/translated/part.js:2916
msgid "Requires Value"
msgstr "Valore richiesto"
@@ -6463,7 +6477,7 @@ msgstr "Valore richiesto"
msgid "Does this test require a value when adding a test result?"
msgstr "Questa prova richiede un valore quando si aggiunge un risultato di prova?"
-#: part/models.py:3501 templates/js/translated/part.js:2914
+#: part/models.py:3501 templates/js/translated/part.js:2923
msgid "Requires Attachment"
msgstr "Allegato Richiesto"
@@ -6685,311 +6699,329 @@ msgstr "Non si può creare una relazione tra l'articolo e sé stesso"
msgid "Duplicate relationship already exists"
msgstr "La relazione duplicata esiste già"
-#: part/serializers.py:128 part/templates/part/category.html:122
-#: part/templates/part/category.html:207
+#: part/serializers.py:114 part/serializers.py:134
+#: part/templates/part/category.html:122 part/templates/part/category.html:207
#: part/templates/part/category_sidebar.html:7
msgid "Subcategories"
msgstr "Sottocategorie"
-#: part/serializers.py:172
+#: part/serializers.py:178
msgid "Results"
msgstr ""
-#: part/serializers.py:173
+#: part/serializers.py:179
msgid "Number of results recorded against this template"
msgstr ""
-#: part/serializers.py:197 part/serializers.py:215 stock/serializers.py:384
+#: part/serializers.py:203 part/serializers.py:221 stock/serializers.py:384
msgid "Purchase currency of this stock item"
msgstr "Valuta di acquisto di questo articolo in stock"
-#: part/serializers.py:260
+#: part/serializers.py:266
msgid "Number of parts using this template"
msgstr ""
-#: part/serializers.py:379
+#: part/serializers.py:387
msgid "No parts selected"
msgstr ""
-#: part/serializers.py:389
+#: part/serializers.py:397
msgid "Select category"
msgstr ""
-#: part/serializers.py:419
+#: part/serializers.py:427
msgid "Original Part"
msgstr "Articolo Originale"
-#: part/serializers.py:420
+#: part/serializers.py:428
msgid "Select original part to duplicate"
msgstr "Seleziona l'articolo originale da duplicare"
-#: part/serializers.py:425
+#: part/serializers.py:433
msgid "Copy Image"
msgstr "Copia immagine"
-#: part/serializers.py:426
+#: part/serializers.py:434
msgid "Copy image from original part"
msgstr "Copia immagine dall'articolo originale"
-#: part/serializers.py:432 part/templates/part/detail.html:277
+#: part/serializers.py:440 part/templates/part/detail.html:277
msgid "Copy BOM"
msgstr "Copia Distinta Base"
-#: part/serializers.py:433
+#: part/serializers.py:441
msgid "Copy bill of materials from original part"
msgstr "Copia fattura dei materiali dall'articolo originale"
-#: part/serializers.py:439
+#: part/serializers.py:447
msgid "Copy Parameters"
msgstr "Copia parametri"
-#: part/serializers.py:440
+#: part/serializers.py:448
msgid "Copy parameter data from original part"
msgstr "Copia i dati dei parametri dall'articolo originale"
-#: part/serializers.py:446
+#: part/serializers.py:454
msgid "Copy Notes"
msgstr ""
-#: part/serializers.py:447
+#: part/serializers.py:455
msgid "Copy notes from original part"
msgstr ""
-#: part/serializers.py:460
+#: part/serializers.py:468
msgid "Initial Stock Quantity"
msgstr "Quantità iniziale"
-#: part/serializers.py:462
+#: part/serializers.py:470
msgid "Specify initial stock quantity for this Part. If quantity is zero, no stock is added."
msgstr "Specificare la quantità iniziale disponibile per questo Articolo. Se la quantità è zero, non viene aggiunta alcuna quantità."
-#: part/serializers.py:469
+#: part/serializers.py:477
msgid "Initial Stock Location"
msgstr "Ubicazione Iniziale Magazzino"
-#: part/serializers.py:470
+#: part/serializers.py:478
msgid "Specify initial stock location for this Part"
msgstr "Specificare l'ubicazione iniziale del magazzino per questo Articolo"
-#: part/serializers.py:482
+#: part/serializers.py:490
msgid "Select supplier (or leave blank to skip)"
msgstr "Seleziona il fornitore (o lascia vuoto per saltare)"
-#: part/serializers.py:498
+#: part/serializers.py:506
msgid "Select manufacturer (or leave blank to skip)"
msgstr "Seleziona il produttore (o lascia vuoto per saltare)"
-#: part/serializers.py:508
+#: part/serializers.py:516
msgid "Manufacturer part number"
msgstr "Codice articolo Produttore"
-#: part/serializers.py:515
+#: part/serializers.py:523
msgid "Selected company is not a valid supplier"
msgstr "L'azienda selezionata non è un fornitore valido"
-#: part/serializers.py:524
+#: part/serializers.py:532
msgid "Selected company is not a valid manufacturer"
msgstr "L'azienda selezionata non è un produttore valido"
-#: part/serializers.py:535
+#: part/serializers.py:543
msgid "Manufacturer part matching this MPN already exists"
msgstr "L'articolo del produttore che corrisponde a questo MPN esiste già"
-#: part/serializers.py:542
+#: part/serializers.py:550
msgid "Supplier part matching this SKU already exists"
msgstr "L'articolo del fornitore che corrisponde a questo SKU esiste già"
-#: part/serializers.py:815 part/templates/part/copy_part.html:9
+#: part/serializers.py:804
+#, fuzzy
+#| msgid "External Link"
+msgid "External Stock"
+msgstr "Collegamento esterno"
+
+#: part/serializers.py:806
+#, fuzzy
+#| msgid "Allocate Stock"
+msgid "Unallocated Stock"
+msgstr "Assegna Scorte"
+
+#: part/serializers.py:808
+#, fuzzy
+#| msgid "Part Stock"
+msgid "Variant Stock"
+msgstr "Articolo Stock"
+
+#: part/serializers.py:833 part/templates/part/copy_part.html:9
#: templates/js/translated/part.js:471
msgid "Duplicate Part"
msgstr "Duplica articolo"
-#: part/serializers.py:816
+#: part/serializers.py:834
msgid "Copy initial data from another Part"
msgstr "Copia i dati iniziali da un altro Articolo"
-#: part/serializers.py:822 templates/js/translated/part.js:102
+#: part/serializers.py:840 templates/js/translated/part.js:102
msgid "Initial Stock"
msgstr "Stock iniziale"
-#: part/serializers.py:823
+#: part/serializers.py:841
msgid "Create Part with initial stock quantity"
msgstr "Crea Articolo con quantità di scorta iniziale"
-#: part/serializers.py:829
+#: part/serializers.py:847
msgid "Supplier Information"
msgstr "Informazioni Fornitore"
-#: part/serializers.py:830
+#: part/serializers.py:848
msgid "Add initial supplier information for this part"
msgstr "Aggiungi le informazioni iniziali del fornitore per questo articolo"
-#: part/serializers.py:838
+#: part/serializers.py:856
msgid "Copy Category Parameters"
msgstr "Copia Parametri Categoria"
-#: part/serializers.py:839
+#: part/serializers.py:857
msgid "Copy parameter templates from selected part category"
msgstr "Copia i parametri dai modelli della categoria articolo selezionata"
-#: part/serializers.py:844
+#: part/serializers.py:862
msgid "Existing Image"
msgstr ""
-#: part/serializers.py:845
+#: part/serializers.py:863
msgid "Filename of an existing part image"
msgstr ""
-#: part/serializers.py:862
+#: part/serializers.py:880
msgid "Image file does not exist"
msgstr ""
-#: part/serializers.py:1068
+#: part/serializers.py:1086
msgid "Limit stocktake report to a particular part, and any variant parts"
msgstr "Limitare il report d'inventario ad un articolo particolare e a eventuali articoli varianti"
-#: part/serializers.py:1078
+#: part/serializers.py:1096
msgid "Limit stocktake report to a particular part category, and any child categories"
msgstr "Limita il report d'inventario ad una particolare categoria articolo, e a eventuali categorie secondarie"
-#: part/serializers.py:1088
+#: part/serializers.py:1106
msgid "Limit stocktake report to a particular stock location, and any child locations"
msgstr "Limita il report d'inventario ad una particolare ubicazione di magazzino, e a eventuali ubicazioni secondarie"
-#: part/serializers.py:1094
+#: part/serializers.py:1112
msgid "Exclude External Stock"
msgstr ""
-#: part/serializers.py:1095
+#: part/serializers.py:1113
msgid "Exclude stock items in external locations"
msgstr ""
-#: part/serializers.py:1100
+#: part/serializers.py:1118
msgid "Generate Report"
msgstr "Genera Report"
-#: part/serializers.py:1101
+#: part/serializers.py:1119
msgid "Generate report file containing calculated stocktake data"
msgstr "Genera file di report contenente dati di inventario calcolati"
-#: part/serializers.py:1106
+#: part/serializers.py:1124
msgid "Update Parts"
msgstr "Aggiorna Articoli"
-#: part/serializers.py:1107
+#: part/serializers.py:1125
msgid "Update specified parts with calculated stocktake data"
msgstr "Aggiorna gli articoli specificati con i dati calcolati di inventario"
-#: part/serializers.py:1115
+#: part/serializers.py:1133
msgid "Stocktake functionality is not enabled"
msgstr "La funzione Inventario non è abilitata"
-#: part/serializers.py:1221
+#: part/serializers.py:1239
msgid "Override calculated value for minimum price"
msgstr ""
-#: part/serializers.py:1228
+#: part/serializers.py:1246
msgid "Minimum price currency"
msgstr ""
-#: part/serializers.py:1236
+#: part/serializers.py:1254
msgid "Override calculated value for maximum price"
msgstr ""
-#: part/serializers.py:1243
+#: part/serializers.py:1261
msgid "Maximum price currency"
msgstr ""
-#: part/serializers.py:1272
+#: part/serializers.py:1290
msgid "Update"
msgstr "Aggiorna"
-#: part/serializers.py:1273
+#: part/serializers.py:1291
msgid "Update pricing for this part"
msgstr "Aggiorna i prezzi per questo articolo"
-#: part/serializers.py:1296
+#: part/serializers.py:1314
#, python-brace-format
msgid "Could not convert from provided currencies to {default_currency}"
msgstr ""
-#: part/serializers.py:1303
+#: part/serializers.py:1321
msgid "Minimum price must not be greater than maximum price"
msgstr ""
-#: part/serializers.py:1306
+#: part/serializers.py:1324
msgid "Maximum price must not be less than minimum price"
msgstr ""
-#: part/serializers.py:1632
+#: part/serializers.py:1660
msgid "Select part to copy BOM from"
msgstr "Seleziona l'articolo da cui copiare la distinta base"
-#: part/serializers.py:1640
+#: part/serializers.py:1668
msgid "Remove Existing Data"
msgstr "Rimuovi Dati Esistenti"
-#: part/serializers.py:1641
+#: part/serializers.py:1669
msgid "Remove existing BOM items before copying"
msgstr "Rimuovi elementi distinta base esistenti prima di copiare"
-#: part/serializers.py:1646
+#: part/serializers.py:1674
msgid "Include Inherited"
msgstr "Includi Ereditato"
-#: part/serializers.py:1647
+#: part/serializers.py:1675
msgid "Include BOM items which are inherited from templated parts"
msgstr "Includi gli elementi Distinta Base ereditati da prodotti template"
-#: part/serializers.py:1652
+#: part/serializers.py:1680
msgid "Skip Invalid Rows"
msgstr "Salta Righe Non Valide"
-#: part/serializers.py:1653
+#: part/serializers.py:1681
msgid "Enable this option to skip invalid rows"
msgstr "Abilita questa opzione per saltare le righe non valide"
-#: part/serializers.py:1658
+#: part/serializers.py:1686
msgid "Copy Substitute Parts"
msgstr "Copia Articoli sostitutivi"
-#: part/serializers.py:1659
+#: part/serializers.py:1687
msgid "Copy substitute parts when duplicate BOM items"
msgstr "Copia articoli sostitutivi quando duplichi gli elementi distinta base"
-#: part/serializers.py:1693
+#: part/serializers.py:1721
msgid "Clear Existing BOM"
msgstr "Cancella Distinta Base esistente"
-#: part/serializers.py:1694
+#: part/serializers.py:1722
msgid "Delete existing BOM items before uploading"
msgstr "Rimuovi elementi distinta base esistenti prima del caricamento"
-#: part/serializers.py:1724
+#: part/serializers.py:1752
msgid "No part column specified"
msgstr "Nessuna colonna articolo specificata"
-#: part/serializers.py:1768
+#: part/serializers.py:1796
msgid "Multiple matching parts found"
msgstr "Trovati più articoli corrispondenti"
-#: part/serializers.py:1771
+#: part/serializers.py:1799
msgid "No matching part found"
msgstr "Nessun articolo corrispondente trovato"
-#: part/serializers.py:1774
+#: part/serializers.py:1802
msgid "Part is not designated as a component"
msgstr "L'articolo non è indicato come componente"
-#: part/serializers.py:1783
+#: part/serializers.py:1811
msgid "Quantity not provided"
msgstr "Quantità non fornita"
-#: part/serializers.py:1791
+#: part/serializers.py:1819
msgid "Invalid quantity"
msgstr "Quantità non valida"
-#: part/serializers.py:1812
+#: part/serializers.py:1840
msgid "At least one BOM item is required"
msgstr "Almeno un elemento della distinta base è richiesto"
@@ -7221,7 +7253,7 @@ msgid "Validate BOM"
msgstr "Valida Distinta Base"
#: part/templates/part/detail.html:283 part/templates/part/detail.html:284
-#: templates/js/translated/bom.js:1314 templates/js/translated/bom.js:1315
+#: templates/js/translated/bom.js:1320 templates/js/translated/bom.js:1321
msgid "Add BOM Item"
msgstr "Aggiungi elemento Distinta Base"
@@ -7405,7 +7437,7 @@ msgstr "Assegnato agli Ordini di Produzione"
msgid "Allocated to Sales Orders"
msgstr "Assegnato agli Ordini di Vendita"
-#: part/templates/part/part_base.html:235 templates/js/translated/bom.js:1213
+#: part/templates/part/part_base.html:235 templates/js/translated/bom.js:1219
msgid "Can Build"
msgstr "Puoi produrre"
@@ -8784,7 +8816,7 @@ msgstr "Seleziona un fornitore articolo corrispondente per questo elemento di ma
msgid "Where is this stock item located?"
msgstr "Dove si trova questo articolo di magazzino?"
-#: stock/models.py:786 stock/serializers.py:1318
+#: stock/models.py:786 stock/serializers.py:1324
msgid "Packaging this stock item is stored in"
msgstr "Imballaggio di questo articolo di magazzino è collocato in"
@@ -8796,7 +8828,7 @@ msgstr "Questo elemento è stato installato su un altro elemento?"
msgid "Serial number for this item"
msgstr "Numero di serie per questo elemento"
-#: stock/models.py:830 stock/serializers.py:1301
+#: stock/models.py:830 stock/serializers.py:1307
msgid "Batch code for this stock item"
msgstr "Codice lotto per questo elemento di magazzino"
@@ -8905,7 +8937,7 @@ msgstr "L'elemento di magazzino è attualmente in produzione"
msgid "Serialized stock cannot be merged"
msgstr "Il magazzino serializzato non può essere unito"
-#: stock/models.py:1639 stock/serializers.py:1207
+#: stock/models.py:1639 stock/serializers.py:1213
msgid "Duplicate stock items"
msgstr "Duplica elementi di magazzino"
@@ -8986,7 +9018,7 @@ msgstr "La quantità non deve superare la quantità disponibile ({q})"
msgid "Enter serial numbers for new items"
msgstr "Inserisci i numeri di serie per i nuovi elementi"
-#: stock/serializers.py:473 stock/serializers.py:1164 stock/serializers.py:1420
+#: stock/serializers.py:473 stock/serializers.py:1170 stock/serializers.py:1426
msgid "Destination stock location"
msgstr "Posizione magazzino di destinazione"
@@ -9059,77 +9091,78 @@ msgstr ""
msgid "No stock items selected"
msgstr ""
-#: stock/serializers.py:863 stock/templates/stock/location.html:165
+#: stock/serializers.py:863 stock/serializers.py:926
+#: stock/templates/stock/location.html:165
#: stock/templates/stock/location.html:213
#: stock/templates/stock/location_sidebar.html:5
msgid "Sublocations"
msgstr "Sottoallocazioni"
-#: stock/serializers.py:1036
+#: stock/serializers.py:1042
msgid "Part must be salable"
msgstr "L'articolo deve essere vendibile"
-#: stock/serializers.py:1040
+#: stock/serializers.py:1046
msgid "Item is allocated to a sales order"
msgstr "L'elemento è assegnato a un ordine di vendita"
-#: stock/serializers.py:1044
+#: stock/serializers.py:1050
msgid "Item is allocated to a build order"
msgstr "Elemento assegnato a un ordine di costruzione"
-#: stock/serializers.py:1068
+#: stock/serializers.py:1074
msgid "Customer to assign stock items"
msgstr "Cliente a cui assegnare elementi di magazzino"
-#: stock/serializers.py:1074
+#: stock/serializers.py:1080
msgid "Selected company is not a customer"
msgstr "L'azienda selezionata non è un cliente"
-#: stock/serializers.py:1082
+#: stock/serializers.py:1088
msgid "Stock assignment notes"
msgstr "Note sull'assegnazione delle scorte"
-#: stock/serializers.py:1092 stock/serializers.py:1346
+#: stock/serializers.py:1098 stock/serializers.py:1352
msgid "A list of stock items must be provided"
msgstr "Deve essere fornito un elenco degli elementi di magazzino"
-#: stock/serializers.py:1171
+#: stock/serializers.py:1177
msgid "Stock merging notes"
msgstr "Note di fusione di magazzino"
-#: stock/serializers.py:1176
+#: stock/serializers.py:1182
msgid "Allow mismatched suppliers"
msgstr "Consenti fornitori non corrispondenti"
-#: stock/serializers.py:1177
+#: stock/serializers.py:1183
msgid "Allow stock items with different supplier parts to be merged"
msgstr "Consenti di unire gli elementi di magazzino che hanno fornitori diversi"
-#: stock/serializers.py:1182
+#: stock/serializers.py:1188
msgid "Allow mismatched status"
msgstr "Consenti stato non corrispondente"
-#: stock/serializers.py:1183
+#: stock/serializers.py:1189
msgid "Allow stock items with different status codes to be merged"
msgstr "Consenti di unire gli elementi di magazzino con diversi codici di stato"
-#: stock/serializers.py:1193
+#: stock/serializers.py:1199
msgid "At least two stock items must be provided"
msgstr "Devono essere riforniti almeno due elementi in magazzino"
-#: stock/serializers.py:1260
+#: stock/serializers.py:1266
msgid "No Change"
msgstr ""
-#: stock/serializers.py:1289
+#: stock/serializers.py:1295
msgid "StockItem primary key value"
msgstr "Valore di chiave primaria StockItem"
-#: stock/serializers.py:1308
+#: stock/serializers.py:1314
msgid "Stock item status code"
msgstr ""
-#: stock/serializers.py:1336
+#: stock/serializers.py:1342
msgid "Stock transaction notes"
msgstr "Note sugli spostamenti di magazzino"
@@ -10662,7 +10695,7 @@ msgid "The following parts are low on required stock"
msgstr "I seguenti articoli sono pochi nel magazzino richiesto"
#: templates/email/build_order_required_stock.html:18
-#: templates/js/translated/bom.js:1668 templates/js/translated/build.js:2557
+#: templates/js/translated/bom.js:1674 templates/js/translated/build.js:2557
msgid "Required Quantity"
msgstr "Quantità richiesta"
@@ -10676,7 +10709,7 @@ msgid "Click on the following link to view this part"
msgstr "Clicca il seguente link per visualizzare questo articolo"
#: templates/email/low_stock_notification.html:18
-#: templates/js/translated/part.js:3209
+#: templates/js/translated/part.js:3218
msgid "Minimum Quantity"
msgstr "Quantità minima"
@@ -11051,62 +11084,68 @@ msgstr ""
msgid "No pricing available"
msgstr ""
-#: templates/js/translated/bom.js:1182 templates/js/translated/build.js:2596
+#: templates/js/translated/bom.js:1184 templates/js/translated/build.js:2622
+#, fuzzy
+#| msgid "External Link"
+msgid "External stock"
+msgstr "Collegamento esterno"
+
+#: templates/js/translated/bom.js:1188 templates/js/translated/build.js:2596
#: templates/js/translated/sales_order.js:1910
msgid "No Stock Available"
msgstr ""
-#: templates/js/translated/bom.js:1187 templates/js/translated/build.js:2600
+#: templates/js/translated/bom.js:1193 templates/js/translated/build.js:2600
msgid "Includes variant and substitute stock"
msgstr ""
-#: templates/js/translated/bom.js:1189 templates/js/translated/build.js:2602
+#: templates/js/translated/bom.js:1195 templates/js/translated/build.js:2602
#: templates/js/translated/part.js:1256
#: templates/js/translated/sales_order.js:1907
msgid "Includes variant stock"
msgstr ""
-#: templates/js/translated/bom.js:1191 templates/js/translated/build.js:2604
+#: templates/js/translated/bom.js:1197 templates/js/translated/build.js:2604
msgid "Includes substitute stock"
msgstr ""
-#: templates/js/translated/bom.js:1219 templates/js/translated/build.js:2587
+#: templates/js/translated/bom.js:1225 templates/js/translated/build.js:2587
msgid "Consumable item"
msgstr ""
-#: templates/js/translated/bom.js:1279
+#: templates/js/translated/bom.js:1285
msgid "Validate BOM Item"
msgstr ""
-#: templates/js/translated/bom.js:1281
+#: templates/js/translated/bom.js:1287
msgid "This line has been validated"
msgstr ""
-#: templates/js/translated/bom.js:1283
+#: templates/js/translated/bom.js:1289
msgid "Edit substitute parts"
msgstr ""
-#: templates/js/translated/bom.js:1285 templates/js/translated/bom.js:1480
+#: templates/js/translated/bom.js:1291 templates/js/translated/bom.js:1486
msgid "Edit BOM Item"
msgstr ""
-#: templates/js/translated/bom.js:1287
+#: templates/js/translated/bom.js:1293
msgid "Delete BOM Item"
msgstr ""
-#: templates/js/translated/bom.js:1307
+#: templates/js/translated/bom.js:1313
msgid "View BOM"
msgstr ""
-#: templates/js/translated/bom.js:1391
+#: templates/js/translated/bom.js:1397
msgid "No BOM items found"
msgstr ""
-#: templates/js/translated/bom.js:1651 templates/js/translated/build.js:2486
+#: templates/js/translated/bom.js:1657 templates/js/translated/build.js:2486
msgid "Required Part"
msgstr ""
-#: templates/js/translated/bom.js:1677
+#: templates/js/translated/bom.js:1683
msgid "Inherited from parent BOM"
msgstr ""
@@ -11449,29 +11488,29 @@ msgstr ""
msgid "Sufficient stock available"
msgstr ""
-#: templates/js/translated/build.js:2643
+#: templates/js/translated/build.js:2647
msgid "Consumable Item"
msgstr ""
-#: templates/js/translated/build.js:2648
+#: templates/js/translated/build.js:2652
msgid "Tracked item"
msgstr ""
-#: templates/js/translated/build.js:2655
+#: templates/js/translated/build.js:2659
#: templates/js/translated/sales_order.js:2016
msgid "Build stock"
msgstr ""
-#: templates/js/translated/build.js:2660 templates/js/translated/stock.js:1829
+#: templates/js/translated/build.js:2664 templates/js/translated/stock.js:1829
msgid "Order stock"
msgstr ""
-#: templates/js/translated/build.js:2664
+#: templates/js/translated/build.js:2668
#: templates/js/translated/sales_order.js:2010
msgid "Allocate stock"
msgstr ""
-#: templates/js/translated/build.js:2668
+#: templates/js/translated/build.js:2672
msgid "Remove stock allocation"
msgstr ""
@@ -12313,64 +12352,64 @@ msgstr ""
msgid "Subscribed category"
msgstr ""
-#: templates/js/translated/part.js:2855
+#: templates/js/translated/part.js:2864
msgid "No test templates matching query"
msgstr ""
-#: templates/js/translated/part.js:2877 templates/js/translated/search.js:342
+#: templates/js/translated/part.js:2886 templates/js/translated/search.js:342
msgid "results"
msgstr ""
-#: templates/js/translated/part.js:2927 templates/js/translated/stock.js:1446
+#: templates/js/translated/part.js:2936 templates/js/translated/stock.js:1446
msgid "Edit test result"
msgstr ""
-#: templates/js/translated/part.js:2928 templates/js/translated/stock.js:1447
+#: templates/js/translated/part.js:2937 templates/js/translated/stock.js:1447
#: templates/js/translated/stock.js:1692
msgid "Delete test result"
msgstr ""
-#: templates/js/translated/part.js:2932
+#: templates/js/translated/part.js:2941
msgid "This test is defined for a parent part"
msgstr ""
-#: templates/js/translated/part.js:2948
+#: templates/js/translated/part.js:2957
msgid "Edit Test Result Template"
msgstr ""
-#: templates/js/translated/part.js:2962
+#: templates/js/translated/part.js:2971
msgid "Delete Test Result Template"
msgstr ""
-#: templates/js/translated/part.js:3041 templates/js/translated/part.js:3042
+#: templates/js/translated/part.js:3050 templates/js/translated/part.js:3051
msgid "No date specified"
msgstr ""
-#: templates/js/translated/part.js:3044
+#: templates/js/translated/part.js:3053
msgid "Specified date is in the past"
msgstr ""
-#: templates/js/translated/part.js:3050
+#: templates/js/translated/part.js:3059
msgid "Speculative"
msgstr ""
-#: templates/js/translated/part.js:3100
+#: templates/js/translated/part.js:3109
msgid "No scheduling information available for this part"
msgstr ""
-#: templates/js/translated/part.js:3106
+#: templates/js/translated/part.js:3115
msgid "Error fetching scheduling information for this part"
msgstr ""
-#: templates/js/translated/part.js:3202
+#: templates/js/translated/part.js:3211
msgid "Scheduled Stock Quantities"
msgstr ""
-#: templates/js/translated/part.js:3218
+#: templates/js/translated/part.js:3227
msgid "Maximum Quantity"
msgstr ""
-#: templates/js/translated/part.js:3263
+#: templates/js/translated/part.js:3272
msgid "Minimum Stock Level"
msgstr ""
@@ -14052,4 +14091,3 @@ msgstr "Permessi per modificare gli elementi"
#: users/models.py:413
msgid "Permission to delete items"
msgstr "Autorizzazione ad eliminare gli elementi"
-
diff --git a/InvenTree/locale/ja/LC_MESSAGES/django.po b/InvenTree/locale/ja/LC_MESSAGES/django.po
index 241084973d..4899f61711 100644
--- a/InvenTree/locale/ja/LC_MESSAGES/django.po
+++ b/InvenTree/locale/ja/LC_MESSAGES/django.po
@@ -2,7 +2,7 @@ msgid ""
msgstr ""
"Project-Id-Version: inventree\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2024-02-28 04:05+0000\n"
+"POT-Creation-Date: 2024-03-05 00:41+0000\n"
"PO-Revision-Date: 2024-02-28 07:23\n"
"Last-Translator: \n"
"Language-Team: Japanese\n"
@@ -66,9 +66,9 @@ msgstr "日付を入力する"
#: report/templates/report/inventree_build_order_base.html:172
#: stock/admin.py:226 stock/models.py:2335 stock/models.py:2451
#: stock/serializers.py:479 stock/serializers.py:632 stock/serializers.py:728
-#: stock/serializers.py:778 stock/serializers.py:1081 stock/serializers.py:1170
-#: stock/serializers.py:1335 stock/templates/stock/stock_sidebar.html:25
-#: templates/js/translated/barcode.js:143 templates/js/translated/bom.js:1259
+#: stock/serializers.py:778 stock/serializers.py:1087 stock/serializers.py:1176
+#: stock/serializers.py:1341 stock/templates/stock/stock_sidebar.html:25
+#: templates/js/translated/barcode.js:143 templates/js/translated/bom.js:1265
#: templates/js/translated/company.js:1674 templates/js/translated/order.js:347
#: templates/js/translated/part.js:1080
#: templates/js/translated/purchase_order.js:2201
@@ -523,7 +523,7 @@ msgstr "お名前"
#: templates/js/translated/order.js:298 templates/js/translated/part.js:1238
#: templates/js/translated/part.js:1483 templates/js/translated/part.js:1621
#: templates/js/translated/part.js:1958 templates/js/translated/part.js:2355
-#: templates/js/translated/part.js:2785 templates/js/translated/part.js:2887
+#: templates/js/translated/part.js:2785 templates/js/translated/part.js:2896
#: templates/js/translated/plugin.js:80
#: templates/js/translated/purchase_order.js:1707
#: templates/js/translated/purchase_order.js:1850
@@ -678,7 +678,7 @@ msgstr "外部画像ファイルのURL"
msgid "Downloading images from remote URL is not enabled"
msgstr "外部URLからの画像ダウンロードは許可されていません"
-#: InvenTree/status.py:66 part/serializers.py:1120
+#: InvenTree/status.py:66 part/serializers.py:1138
msgid "Background worker check failed"
msgstr "バックグラウンドワーカーのチェックに失敗しました"
@@ -960,7 +960,7 @@ msgid "Tracked"
msgstr ""
#: build/api.py:285 part/admin.py:144 templates/js/translated/build.js:1741
-#: templates/js/translated/build.js:2626
+#: templates/js/translated/build.js:2630
#: templates/js/translated/sales_order.js:1929
#: templates/js/translated/table_filters.js:571
msgid "Allocated"
@@ -1044,11 +1044,11 @@ msgstr ""
#: build/models.py:199 build/templates/build/build_base.html:97
#: build/templates/build/detail.html:29 company/models.py:1044
#: order/models.py:1389 order/models.py:1532 order/models.py:1533
-#: part/api.py:1528 part/models.py:389 part/models.py:3003 part/models.py:3147
-#: part/models.py:3291 part/models.py:3314 part/models.py:3335
-#: part/models.py:3357 part/models.py:3458 part/models.py:3754
-#: part/models.py:3885 part/models.py:3978 part/models.py:4339
-#: part/serializers.py:1066 part/serializers.py:1631
+#: part/api.py:1528 part/api.py:1820 part/models.py:389 part/models.py:3003
+#: part/models.py:3147 part/models.py:3291 part/models.py:3314
+#: part/models.py:3335 part/models.py:3357 part/models.py:3458
+#: part/models.py:3754 part/models.py:3885 part/models.py:3978
+#: part/models.py:4339 part/serializers.py:1084 part/serializers.py:1659
#: part/templates/part/part_app_base.html:8
#: part/templates/part/part_pricing.html:12
#: part/templates/part/upload_bom.html:52
@@ -1147,7 +1147,7 @@ msgid "Build status code"
msgstr ""
#: build/models.py:264 build/serializers.py:280 order/serializers.py:549
-#: stock/models.py:826 stock/serializers.py:1300
+#: stock/models.py:826 stock/serializers.py:1306
#: templates/js/translated/purchase_order.js:1129
msgid "Batch Code"
msgstr ""
@@ -1242,48 +1242,48 @@ msgstr ""
msgid "Project code for this build order"
msgstr ""
-#: build/models.py:559
+#: build/models.py:575
#, python-brace-format
msgid "Build order {build} has been completed"
msgstr ""
-#: build/models.py:565
+#: build/models.py:581
msgid "A build order has been completed"
msgstr ""
-#: build/models.py:783 build/models.py:858
+#: build/models.py:799 build/models.py:874
msgid "No build output specified"
msgstr ""
-#: build/models.py:786
+#: build/models.py:802
msgid "Build output is already completed"
msgstr ""
-#: build/models.py:789
+#: build/models.py:805
msgid "Build output does not match Build Order"
msgstr ""
-#: build/models.py:862 build/serializers.py:223 build/serializers.py:262
+#: build/models.py:878 build/serializers.py:223 build/serializers.py:262
#: build/serializers.py:831 order/models.py:526 order/serializers.py:401
-#: order/serializers.py:544 part/serializers.py:1423 part/serializers.py:1789
+#: order/serializers.py:544 part/serializers.py:1442 part/serializers.py:1817
#: stock/models.py:665 stock/models.py:1477 stock/serializers.py:450
msgid "Quantity must be greater than zero"
msgstr ""
-#: build/models.py:867 build/serializers.py:228
+#: build/models.py:883 build/serializers.py:228
msgid "Quantity cannot be greater than the output quantity"
msgstr ""
-#: build/models.py:924 build/serializers.py:533
+#: build/models.py:940 build/serializers.py:533
#, python-brace-format
msgid "Build output {serial} has not passed all required tests"
msgstr ""
-#: build/models.py:1286
+#: build/models.py:1302
msgid "Build object"
msgstr ""
-#: build/models.py:1300 build/models.py:1558 build/serializers.py:210
+#: build/models.py:1316 build/models.py:1574 build/serializers.py:210
#: build/serializers.py:247 build/templates/build/build_base.html:102
#: build/templates/build/detail.html:34 common/models.py:2432
#: order/models.py:1247 order/models.py:1902 order/serializers.py:1306
@@ -1310,7 +1310,7 @@ msgstr ""
#: templates/js/translated/company.js:1808
#: templates/js/translated/model_renderers.js:230
#: templates/js/translated/order.js:304 templates/js/translated/part.js:961
-#: templates/js/translated/part.js:1811 templates/js/translated/part.js:3332
+#: templates/js/translated/part.js:1811 templates/js/translated/part.js:3341
#: templates/js/translated/pricing.js:381
#: templates/js/translated/pricing.js:474
#: templates/js/translated/pricing.js:522
@@ -1330,38 +1330,38 @@ msgstr ""
msgid "Quantity"
msgstr "数量"
-#: build/models.py:1301
+#: build/models.py:1317
msgid "Required quantity for build order"
msgstr ""
-#: build/models.py:1381
+#: build/models.py:1397
msgid "Build item must specify a build output, as master part is marked as trackable"
msgstr ""
-#: build/models.py:1390
+#: build/models.py:1406
#, python-brace-format
msgid "Allocated quantity ({q}) must not exceed available stock quantity ({a})"
msgstr ""
-#: build/models.py:1400 order/models.py:1853
+#: build/models.py:1416 order/models.py:1853
msgid "Stock item is over-allocated"
msgstr ""
-#: build/models.py:1406 order/models.py:1856
+#: build/models.py:1422 order/models.py:1856
msgid "Allocation quantity must be greater than zero"
msgstr ""
-#: build/models.py:1412
+#: build/models.py:1428
msgid "Quantity must be 1 for serialized stock"
msgstr ""
-#: build/models.py:1473
+#: build/models.py:1489
msgid "Selected stock item does not match BOM line"
msgstr ""
-#: build/models.py:1545 build/serializers.py:811 order/serializers.py:1150
-#: order/serializers.py:1171 stock/serializers.py:544 stock/serializers.py:1019
-#: stock/serializers.py:1131 stock/templates/stock/item_base.html:10
+#: build/models.py:1561 build/serializers.py:811 order/serializers.py:1150
+#: order/serializers.py:1171 stock/serializers.py:544 stock/serializers.py:1025
+#: stock/serializers.py:1137 stock/templates/stock/item_base.html:10
#: stock/templates/stock/item_base.html:23
#: stock/templates/stock/item_base.html:194
#: templates/js/translated/build.js:1742
@@ -1376,19 +1376,19 @@ msgstr ""
msgid "Stock Item"
msgstr "在庫商品"
-#: build/models.py:1546
+#: build/models.py:1562
msgid "Source stock item"
msgstr ""
-#: build/models.py:1559
+#: build/models.py:1575
msgid "Stock quantity to allocate to build"
msgstr ""
-#: build/models.py:1567
+#: build/models.py:1583
msgid "Install into"
msgstr ""
-#: build/models.py:1568
+#: build/models.py:1584
msgid "Destination stock item"
msgstr ""
@@ -1452,9 +1452,9 @@ msgid "A list of build outputs must be provided"
msgstr ""
#: build/serializers.py:426 build/serializers.py:498 order/serializers.py:533
-#: order/serializers.py:641 order/serializers.py:1646 part/serializers.py:1086
+#: order/serializers.py:641 order/serializers.py:1646 part/serializers.py:1104
#: stock/serializers.py:472 stock/serializers.py:627 stock/serializers.py:723
-#: stock/serializers.py:1163 stock/serializers.py:1419
+#: stock/serializers.py:1169 stock/serializers.py:1425
#: stock/templates/stock/item_base.html:394
#: templates/js/translated/barcode.js:547
#: templates/js/translated/barcode.js:795 templates/js/translated/build.js:999
@@ -1494,7 +1494,7 @@ msgstr ""
#: build/serializers.py:505 build/templates/build/build_base.html:151
#: build/templates/build/detail.html:62 order/models.py:910
#: order/models.py:2005 order/serializers.py:565 stock/admin.py:165
-#: stock/serializers.py:774 stock/serializers.py:1307
+#: stock/serializers.py:774 stock/serializers.py:1313
#: stock/templates/stock/item_base.html:427
#: templates/js/translated/barcode.js:252 templates/js/translated/build.js:2189
#: templates/js/translated/purchase_order.js:1308
@@ -1602,7 +1602,7 @@ msgstr ""
msgid "bom_item.part must point to the same part as the build order"
msgstr ""
-#: build/serializers.py:817 stock/serializers.py:1032
+#: build/serializers.py:817 stock/serializers.py:1038
msgid "Item must be in stock"
msgstr ""
@@ -1659,44 +1659,45 @@ msgstr ""
msgid "Allocate optional BOM items to build order"
msgstr ""
-#: build/serializers.py:1096 part/models.py:3895 part/models.py:4331
+#: build/serializers.py:1097 part/models.py:3895 part/models.py:4331
#: stock/api.py:745
msgid "BOM Item"
msgstr ""
-#: build/serializers.py:1105 templates/js/translated/index.js:130
+#: build/serializers.py:1106 templates/js/translated/index.js:130
msgid "Allocated Stock"
msgstr ""
-#: build/serializers.py:1110 part/admin.py:132 part/bom.py:173
-#: part/serializers.py:1441 part/templates/part/part_base.html:210
-#: templates/js/translated/bom.js:1202 templates/js/translated/build.js:2614
-#: templates/js/translated/part.js:709 templates/js/translated/part.js:2148
+#: build/serializers.py:1111 part/admin.py:132 part/bom.py:173
+#: part/serializers.py:798 part/serializers.py:1460
+#: part/templates/part/part_base.html:210 templates/js/translated/bom.js:1208
+#: templates/js/translated/build.js:2614 templates/js/translated/part.js:709
+#: templates/js/translated/part.js:2148
#: templates/js/translated/table_filters.js:170
msgid "On Order"
msgstr ""
-#: build/serializers.py:1115 part/serializers.py:1443
+#: build/serializers.py:1116 part/serializers.py:1462
#: templates/js/translated/build.js:2618
#: templates/js/translated/table_filters.js:360
msgid "In Production"
msgstr ""
-#: build/serializers.py:1120 part/bom.py:172 part/serializers.py:1454
+#: build/serializers.py:1121 part/bom.py:172 part/serializers.py:1473
#: part/templates/part/part_base.html:192
#: templates/js/translated/sales_order.js:1893
msgid "Available Stock"
msgstr ""
-#: build/tasks.py:149
+#: build/tasks.py:171
msgid "Stock required for build order"
msgstr ""
-#: build/tasks.py:166
+#: build/tasks.py:188
msgid "Overdue Build Order"
msgstr ""
-#: build/tasks.py:171
+#: build/tasks.py:193
#, python-brace-format
msgid "Build order {bo} is now overdue"
msgstr ""
@@ -1990,27 +1991,31 @@ msgstr "注文必須パーツ"
msgid "Order Parts"
msgstr "パーツの注文"
-#: build/templates/build/detail.html:210
-msgid "Incomplete Build Outputs"
-msgstr ""
-
-#: build/templates/build/detail.html:214
-msgid "Create new build output"
+#: build/templates/build/detail.html:205
+msgid "Available stock has been filtered based on specified source location for this build order"
msgstr ""
#: build/templates/build/detail.html:215
+msgid "Incomplete Build Outputs"
+msgstr ""
+
+#: build/templates/build/detail.html:219
+msgid "Create new build output"
+msgstr ""
+
+#: build/templates/build/detail.html:220
msgid "New Build Output"
msgstr ""
-#: build/templates/build/detail.html:232 build/templates/build/sidebar.html:15
+#: build/templates/build/detail.html:237 build/templates/build/sidebar.html:15
msgid "Consumed Stock"
msgstr ""
-#: build/templates/build/detail.html:244
+#: build/templates/build/detail.html:249
msgid "Completed Build Outputs"
msgstr ""
-#: build/templates/build/detail.html:256 build/templates/build/sidebar.html:19
+#: build/templates/build/detail.html:261 build/templates/build/sidebar.html:19
#: company/templates/company/detail.html:229
#: company/templates/company/manufacturer_part.html:141
#: company/templates/company/manufacturer_part_sidebar.html:9
@@ -2026,15 +2031,15 @@ msgstr ""
msgid "Attachments"
msgstr ""
-#: build/templates/build/detail.html:271
+#: build/templates/build/detail.html:276
msgid "Build Notes"
msgstr ""
-#: build/templates/build/detail.html:426
+#: build/templates/build/detail.html:434
msgid "Allocation Complete"
msgstr ""
-#: build/templates/build/detail.html:427
+#: build/templates/build/detail.html:435
msgid "All lines have been fully allocated"
msgstr ""
@@ -2436,7 +2441,7 @@ msgid "Parts are templates by default"
msgstr "パーツはデフォルトのテンプレートです"
#: common/models.py:1456 part/admin.py:91 part/admin.py:431 part/models.py:1015
-#: templates/js/translated/bom.js:1633
+#: templates/js/translated/bom.js:1639
#: templates/js/translated/table_filters.js:330
#: templates/js/translated/table_filters.js:721
msgid "Assembly"
@@ -3495,7 +3500,7 @@ msgstr ""
msgid "Price break quantity"
msgstr ""
-#: common/models.py:2440 company/serializers.py:484 order/admin.py:42
+#: common/models.py:2440 company/serializers.py:486 order/admin.py:42
#: order/models.py:1321 order/models.py:2226
#: templates/js/translated/company.js:1813 templates/js/translated/part.js:1885
#: templates/js/translated/pricing.js:621
@@ -3972,7 +3977,7 @@ msgstr ""
#: company/models.py:495 company/templates/company/company_base.html:76
#: company/templates/company/manufacturer_part.html:90
-#: company/templates/company/supplier_part.html:145 part/serializers.py:497
+#: company/templates/company/supplier_part.html:145 part/serializers.py:505
#: stock/templates/stock/item_base.html:207
#: templates/js/translated/company.js:506
#: templates/js/translated/company.js:1108
@@ -3987,7 +3992,7 @@ msgid "Select manufacturer"
msgstr ""
#: company/models.py:502 company/templates/company/manufacturer_part.html:101
-#: company/templates/company/supplier_part.html:153 part/serializers.py:507
+#: company/templates/company/supplier_part.html:153 part/serializers.py:515
#: templates/js/translated/company.js:351
#: templates/js/translated/company.js:1107
#: templates/js/translated/company.js:1302
@@ -4059,7 +4064,7 @@ msgstr ""
#: company/models.py:795 company/templates/company/company_base.html:81
#: company/templates/company/supplier_part.html:129 order/models.py:453
#: order/templates/order/order_base.html:136 part/bom.py:272 part/bom.py:310
-#: part/serializers.py:481 plugin/builtin/suppliers/digikey.py:25
+#: part/serializers.py:489 plugin/builtin/suppliers/digikey.py:25
#: plugin/builtin/suppliers/lcsc.py:26 plugin/builtin/suppliers/mouser.py:24
#: plugin/builtin/suppliers/tme.py:26 stock/templates/stock/item_base.html:224
#: templates/email/overdue_purchase_order.html:16
@@ -4076,7 +4081,7 @@ msgstr "仕入先"
msgid "Select supplier"
msgstr ""
-#: company/models.py:802 part/serializers.py:492
+#: company/models.py:802 part/serializers.py:500
msgid "Supplier stock keeping unit"
msgstr ""
@@ -4112,7 +4117,7 @@ msgid "Minimum charge (e.g. stocking fee)"
msgstr ""
#: company/models.py:851 company/templates/company/supplier_part.html:160
-#: stock/admin.py:224 stock/models.py:785 stock/serializers.py:1317
+#: stock/admin.py:224 stock/models.py:785 stock/serializers.py:1323
#: stock/templates/stock/item_base.html:240
#: templates/js/translated/company.js:1636
#: templates/js/translated/stock.js:2387
@@ -4157,7 +4162,7 @@ msgstr ""
msgid "Date of last update of availability data"
msgstr ""
-#: company/serializers.py:153
+#: company/serializers.py:155
msgid "Default currency used for this supplier"
msgstr ""
@@ -4218,7 +4223,7 @@ msgstr ""
#: company/templates/company/company_base.html:86 order/models.py:898
#: order/models.py:1993 order/templates/order/return_order_base.html:131
#: order/templates/order/sales_order_base.html:144 stock/models.py:807
-#: stock/models.py:808 stock/serializers.py:1067
+#: stock/models.py:808 stock/serializers.py:1073
#: stock/templates/stock/item_base.html:405
#: templates/email/overdue_sales_order.html:16
#: templates/js/translated/company.js:502
@@ -4429,8 +4434,9 @@ msgstr ""
#: company/templates/company/manufacturer_part.html:119
#: company/templates/company/supplier_part.html:15 company/views.py:31
-#: part/admin.py:122 part/templates/part/part_sidebar.html:33
-#: templates/InvenTree/search.html:190 templates/navbar.html:48
+#: part/admin.py:122 part/serializers.py:802
+#: part/templates/part/part_sidebar.html:33 templates/InvenTree/search.html:190
+#: templates/navbar.html:48
msgid "Suppliers"
msgstr "仕入先"
@@ -4528,7 +4534,7 @@ msgid "No supplier information available"
msgstr ""
#: company/templates/company/supplier_part.html:139 part/bom.py:279
-#: part/bom.py:311 part/serializers.py:491
+#: part/bom.py:311 part/serializers.py:499
#: templates/js/translated/company.js:349 templates/js/translated/part.js:1786
#: templates/js/translated/pricing.js:510
#: templates/js/translated/purchase_order.js:1851
@@ -4577,10 +4583,12 @@ msgstr ""
msgid "Update Part Availability"
msgstr ""
-#: company/templates/company/supplier_part_sidebar.html:5 part/stocktake.py:223
+#: company/templates/company/supplier_part_sidebar.html:5
+#: part/serializers.py:801 part/stocktake.py:223
#: part/templates/part/category.html:183
#: part/templates/part/category_sidebar.html:17 stock/admin.py:69
-#: stock/serializers.py:760 stock/templates/stock/location.html:170
+#: stock/serializers.py:760 stock/serializers.py:924
+#: stock/templates/stock/location.html:170
#: stock/templates/stock/location.html:184
#: stock/templates/stock/location.html:196
#: stock/templates/stock/location_sidebar.html:7
@@ -4640,7 +4648,7 @@ msgid "Label template file"
msgstr ""
#: label/models.py:143 part/models.py:3484 report/models.py:322
-#: templates/js/translated/part.js:2891
+#: templates/js/translated/part.js:2900
#: templates/js/translated/table_filters.js:481
msgid "Enabled"
msgstr ""
@@ -5733,7 +5741,7 @@ msgid "Pending Shipments"
msgstr ""
#: order/templates/order/sales_order_detail.html:71
-#: templates/js/translated/bom.js:1271 templates/js/translated/filters.js:296
+#: templates/js/translated/bom.js:1277 templates/js/translated/filters.js:296
msgid "Actions"
msgstr ""
@@ -5861,10 +5869,10 @@ msgstr ""
msgid "Category Path"
msgstr ""
-#: part/admin.py:323 part/models.py:390 part/serializers.py:259
-#: part/serializers.py:373 part/templates/part/cat_link.html:3
-#: part/templates/part/category.html:23 part/templates/part/category.html:141
-#: part/templates/part/category.html:161
+#: part/admin.py:323 part/models.py:390 part/serializers.py:112
+#: part/serializers.py:265 part/serializers.py:381
+#: part/templates/part/cat_link.html:3 part/templates/part/category.html:23
+#: part/templates/part/category.html:141 part/templates/part/category.html:161
#: part/templates/part/category_sidebar.html:9
#: templates/InvenTree/index.html:36 templates/InvenTree/search.html:84
#: templates/InvenTree/settings/sidebar.html:47
@@ -5889,13 +5897,13 @@ msgstr ""
msgid "Part IPN"
msgstr ""
-#: part/admin.py:421 part/serializers.py:1220
+#: part/admin.py:421 part/serializers.py:1238
#: templates/js/translated/pricing.js:358
#: templates/js/translated/pricing.js:1024
msgid "Minimum Price"
msgstr ""
-#: part/admin.py:426 part/serializers.py:1235
+#: part/admin.py:426 part/serializers.py:1253
#: templates/js/translated/pricing.js:353
#: templates/js/translated/pricing.js:1032
msgid "Maximum Price"
@@ -5974,7 +5982,7 @@ msgid "This option must be selected"
msgstr ""
#: part/api.py:1541 part/models.py:895 part/models.py:3385 part/models.py:3831
-#: part/serializers.py:388 part/serializers.py:1076
+#: part/serializers.py:396 part/serializers.py:1094
#: part/templates/part/part_base.html:260 stock/api.py:733
#: templates/InvenTree/settings/settings_staff_js.html:300
#: templates/js/translated/notification.js:60
@@ -5982,12 +5990,17 @@ msgstr ""
msgid "Category"
msgstr "カテゴリ"
+#: part/api.py:1828
+msgid "Uses"
+msgstr ""
+
#: part/bom.py:170 part/models.py:100 part/models.py:938
#: part/templates/part/category.html:116 part/templates/part/part_base.html:367
msgid "Default Location"
msgstr ""
-#: part/bom.py:171 templates/email/low_stock_notification.html:16
+#: part/bom.py:171 part/serializers.py:803
+#: templates/email/low_stock_notification.html:16
msgid "Total Stock"
msgstr ""
@@ -6010,7 +6023,8 @@ msgstr "パーツカテゴリ"
msgid "Default location for parts in this category"
msgstr ""
-#: part/models.py:106 stock/models.py:165 templates/js/translated/stock.js:2736
+#: part/models.py:106 stock/models.py:165 templates/js/translated/part.js:2810
+#: templates/js/translated/stock.js:2736
#: templates/js/translated/table_filters.js:239
#: templates/js/translated/table_filters.js:283
msgid "Structural"
@@ -6418,7 +6432,7 @@ msgstr ""
msgid "Test with this name already exists for this part"
msgstr ""
-#: part/models.py:3464 templates/js/translated/part.js:2870
+#: part/models.py:3464 templates/js/translated/part.js:2879
msgid "Test Name"
msgstr ""
@@ -6446,7 +6460,7 @@ msgstr ""
msgid "Is this test enabled?"
msgstr ""
-#: part/models.py:3489 templates/js/translated/part.js:2899
+#: part/models.py:3489 templates/js/translated/part.js:2908
#: templates/js/translated/table_filters.js:477
msgid "Required"
msgstr ""
@@ -6455,7 +6469,7 @@ msgstr ""
msgid "Is this test required to pass?"
msgstr ""
-#: part/models.py:3495 templates/js/translated/part.js:2907
+#: part/models.py:3495 templates/js/translated/part.js:2916
msgid "Requires Value"
msgstr ""
@@ -6463,7 +6477,7 @@ msgstr ""
msgid "Does this test require a value when adding a test result?"
msgstr ""
-#: part/models.py:3501 templates/js/translated/part.js:2914
+#: part/models.py:3501 templates/js/translated/part.js:2923
msgid "Requires Attachment"
msgstr ""
@@ -6685,311 +6699,325 @@ msgstr ""
msgid "Duplicate relationship already exists"
msgstr ""
-#: part/serializers.py:128 part/templates/part/category.html:122
-#: part/templates/part/category.html:207
+#: part/serializers.py:114 part/serializers.py:134
+#: part/templates/part/category.html:122 part/templates/part/category.html:207
#: part/templates/part/category_sidebar.html:7
msgid "Subcategories"
msgstr "サブカテゴリ"
-#: part/serializers.py:172
+#: part/serializers.py:178
msgid "Results"
msgstr ""
-#: part/serializers.py:173
+#: part/serializers.py:179
msgid "Number of results recorded against this template"
msgstr ""
-#: part/serializers.py:197 part/serializers.py:215 stock/serializers.py:384
+#: part/serializers.py:203 part/serializers.py:221 stock/serializers.py:384
msgid "Purchase currency of this stock item"
msgstr ""
-#: part/serializers.py:260
+#: part/serializers.py:266
msgid "Number of parts using this template"
msgstr ""
-#: part/serializers.py:379
+#: part/serializers.py:387
msgid "No parts selected"
msgstr ""
-#: part/serializers.py:389
+#: part/serializers.py:397
msgid "Select category"
msgstr "カテゴリを選択"
-#: part/serializers.py:419
+#: part/serializers.py:427
msgid "Original Part"
msgstr ""
-#: part/serializers.py:420
+#: part/serializers.py:428
msgid "Select original part to duplicate"
msgstr ""
-#: part/serializers.py:425
+#: part/serializers.py:433
msgid "Copy Image"
msgstr ""
-#: part/serializers.py:426
+#: part/serializers.py:434
msgid "Copy image from original part"
msgstr ""
-#: part/serializers.py:432 part/templates/part/detail.html:277
+#: part/serializers.py:440 part/templates/part/detail.html:277
msgid "Copy BOM"
msgstr ""
-#: part/serializers.py:433
+#: part/serializers.py:441
msgid "Copy bill of materials from original part"
msgstr ""
-#: part/serializers.py:439
+#: part/serializers.py:447
msgid "Copy Parameters"
msgstr ""
-#: part/serializers.py:440
+#: part/serializers.py:448
msgid "Copy parameter data from original part"
msgstr ""
-#: part/serializers.py:446
+#: part/serializers.py:454
msgid "Copy Notes"
msgstr ""
-#: part/serializers.py:447
+#: part/serializers.py:455
msgid "Copy notes from original part"
msgstr ""
-#: part/serializers.py:460
+#: part/serializers.py:468
msgid "Initial Stock Quantity"
msgstr ""
-#: part/serializers.py:462
+#: part/serializers.py:470
msgid "Specify initial stock quantity for this Part. If quantity is zero, no stock is added."
msgstr ""
-#: part/serializers.py:469
+#: part/serializers.py:477
msgid "Initial Stock Location"
msgstr ""
-#: part/serializers.py:470
+#: part/serializers.py:478
msgid "Specify initial stock location for this Part"
msgstr ""
-#: part/serializers.py:482
+#: part/serializers.py:490
msgid "Select supplier (or leave blank to skip)"
msgstr ""
-#: part/serializers.py:498
+#: part/serializers.py:506
msgid "Select manufacturer (or leave blank to skip)"
msgstr ""
-#: part/serializers.py:508
+#: part/serializers.py:516
msgid "Manufacturer part number"
msgstr ""
-#: part/serializers.py:515
+#: part/serializers.py:523
msgid "Selected company is not a valid supplier"
msgstr ""
-#: part/serializers.py:524
+#: part/serializers.py:532
msgid "Selected company is not a valid manufacturer"
msgstr ""
-#: part/serializers.py:535
+#: part/serializers.py:543
msgid "Manufacturer part matching this MPN already exists"
msgstr ""
-#: part/serializers.py:542
+#: part/serializers.py:550
msgid "Supplier part matching this SKU already exists"
msgstr ""
-#: part/serializers.py:815 part/templates/part/copy_part.html:9
+#: part/serializers.py:804
+#, fuzzy
+#| msgid "External Link"
+msgid "External Stock"
+msgstr "外部リンク"
+
+#: part/serializers.py:806
+msgid "Unallocated Stock"
+msgstr ""
+
+#: part/serializers.py:808
+msgid "Variant Stock"
+msgstr ""
+
+#: part/serializers.py:833 part/templates/part/copy_part.html:9
#: templates/js/translated/part.js:471
msgid "Duplicate Part"
msgstr ""
-#: part/serializers.py:816
+#: part/serializers.py:834
msgid "Copy initial data from another Part"
msgstr ""
-#: part/serializers.py:822 templates/js/translated/part.js:102
+#: part/serializers.py:840 templates/js/translated/part.js:102
msgid "Initial Stock"
msgstr ""
-#: part/serializers.py:823
+#: part/serializers.py:841
msgid "Create Part with initial stock quantity"
msgstr ""
-#: part/serializers.py:829
+#: part/serializers.py:847
msgid "Supplier Information"
msgstr ""
-#: part/serializers.py:830
+#: part/serializers.py:848
msgid "Add initial supplier information for this part"
msgstr ""
-#: part/serializers.py:838
+#: part/serializers.py:856
msgid "Copy Category Parameters"
msgstr ""
-#: part/serializers.py:839
+#: part/serializers.py:857
msgid "Copy parameter templates from selected part category"
msgstr ""
-#: part/serializers.py:844
+#: part/serializers.py:862
msgid "Existing Image"
msgstr ""
-#: part/serializers.py:845
+#: part/serializers.py:863
msgid "Filename of an existing part image"
msgstr ""
-#: part/serializers.py:862
+#: part/serializers.py:880
msgid "Image file does not exist"
msgstr ""
-#: part/serializers.py:1068
+#: part/serializers.py:1086
msgid "Limit stocktake report to a particular part, and any variant parts"
msgstr ""
-#: part/serializers.py:1078
+#: part/serializers.py:1096
msgid "Limit stocktake report to a particular part category, and any child categories"
msgstr ""
-#: part/serializers.py:1088
+#: part/serializers.py:1106
msgid "Limit stocktake report to a particular stock location, and any child locations"
msgstr ""
-#: part/serializers.py:1094
+#: part/serializers.py:1112
msgid "Exclude External Stock"
msgstr ""
-#: part/serializers.py:1095
+#: part/serializers.py:1113
msgid "Exclude stock items in external locations"
msgstr ""
-#: part/serializers.py:1100
+#: part/serializers.py:1118
msgid "Generate Report"
msgstr ""
-#: part/serializers.py:1101
+#: part/serializers.py:1119
msgid "Generate report file containing calculated stocktake data"
msgstr ""
-#: part/serializers.py:1106
+#: part/serializers.py:1124
msgid "Update Parts"
msgstr ""
-#: part/serializers.py:1107
+#: part/serializers.py:1125
msgid "Update specified parts with calculated stocktake data"
msgstr ""
-#: part/serializers.py:1115
+#: part/serializers.py:1133
msgid "Stocktake functionality is not enabled"
msgstr ""
-#: part/serializers.py:1221
+#: part/serializers.py:1239
msgid "Override calculated value for minimum price"
msgstr ""
-#: part/serializers.py:1228
+#: part/serializers.py:1246
msgid "Minimum price currency"
msgstr ""
-#: part/serializers.py:1236
+#: part/serializers.py:1254
msgid "Override calculated value for maximum price"
msgstr ""
-#: part/serializers.py:1243
+#: part/serializers.py:1261
msgid "Maximum price currency"
msgstr ""
-#: part/serializers.py:1272
+#: part/serializers.py:1290
msgid "Update"
msgstr ""
-#: part/serializers.py:1273
+#: part/serializers.py:1291
msgid "Update pricing for this part"
msgstr ""
-#: part/serializers.py:1296
+#: part/serializers.py:1314
#, python-brace-format
msgid "Could not convert from provided currencies to {default_currency}"
msgstr ""
-#: part/serializers.py:1303
+#: part/serializers.py:1321
msgid "Minimum price must not be greater than maximum price"
msgstr ""
-#: part/serializers.py:1306
+#: part/serializers.py:1324
msgid "Maximum price must not be less than minimum price"
msgstr ""
-#: part/serializers.py:1632
+#: part/serializers.py:1660
msgid "Select part to copy BOM from"
msgstr ""
-#: part/serializers.py:1640
+#: part/serializers.py:1668
msgid "Remove Existing Data"
msgstr ""
-#: part/serializers.py:1641
+#: part/serializers.py:1669
msgid "Remove existing BOM items before copying"
msgstr ""
-#: part/serializers.py:1646
+#: part/serializers.py:1674
msgid "Include Inherited"
msgstr ""
-#: part/serializers.py:1647
+#: part/serializers.py:1675
msgid "Include BOM items which are inherited from templated parts"
msgstr ""
-#: part/serializers.py:1652
+#: part/serializers.py:1680
msgid "Skip Invalid Rows"
msgstr ""
-#: part/serializers.py:1653
+#: part/serializers.py:1681
msgid "Enable this option to skip invalid rows"
msgstr ""
-#: part/serializers.py:1658
+#: part/serializers.py:1686
msgid "Copy Substitute Parts"
msgstr ""
-#: part/serializers.py:1659
+#: part/serializers.py:1687
msgid "Copy substitute parts when duplicate BOM items"
msgstr ""
-#: part/serializers.py:1693
+#: part/serializers.py:1721
msgid "Clear Existing BOM"
msgstr ""
-#: part/serializers.py:1694
+#: part/serializers.py:1722
msgid "Delete existing BOM items before uploading"
msgstr ""
-#: part/serializers.py:1724
+#: part/serializers.py:1752
msgid "No part column specified"
msgstr ""
-#: part/serializers.py:1768
+#: part/serializers.py:1796
msgid "Multiple matching parts found"
msgstr ""
-#: part/serializers.py:1771
+#: part/serializers.py:1799
msgid "No matching part found"
msgstr ""
-#: part/serializers.py:1774
+#: part/serializers.py:1802
msgid "Part is not designated as a component"
msgstr ""
-#: part/serializers.py:1783
+#: part/serializers.py:1811
msgid "Quantity not provided"
msgstr ""
-#: part/serializers.py:1791
+#: part/serializers.py:1819
msgid "Invalid quantity"
msgstr ""
-#: part/serializers.py:1812
+#: part/serializers.py:1840
msgid "At least one BOM item is required"
msgstr ""
@@ -7221,7 +7249,7 @@ msgid "Validate BOM"
msgstr ""
#: part/templates/part/detail.html:283 part/templates/part/detail.html:284
-#: templates/js/translated/bom.js:1314 templates/js/translated/bom.js:1315
+#: templates/js/translated/bom.js:1320 templates/js/translated/bom.js:1321
msgid "Add BOM Item"
msgstr ""
@@ -7405,7 +7433,7 @@ msgstr ""
msgid "Allocated to Sales Orders"
msgstr ""
-#: part/templates/part/part_base.html:235 templates/js/translated/bom.js:1213
+#: part/templates/part/part_base.html:235 templates/js/translated/bom.js:1219
msgid "Can Build"
msgstr ""
@@ -8784,7 +8812,7 @@ msgstr ""
msgid "Where is this stock item located?"
msgstr ""
-#: stock/models.py:786 stock/serializers.py:1318
+#: stock/models.py:786 stock/serializers.py:1324
msgid "Packaging this stock item is stored in"
msgstr ""
@@ -8796,7 +8824,7 @@ msgstr ""
msgid "Serial number for this item"
msgstr ""
-#: stock/models.py:830 stock/serializers.py:1301
+#: stock/models.py:830 stock/serializers.py:1307
msgid "Batch code for this stock item"
msgstr ""
@@ -8905,7 +8933,7 @@ msgstr ""
msgid "Serialized stock cannot be merged"
msgstr ""
-#: stock/models.py:1639 stock/serializers.py:1207
+#: stock/models.py:1639 stock/serializers.py:1213
msgid "Duplicate stock items"
msgstr ""
@@ -8986,7 +9014,7 @@ msgstr ""
msgid "Enter serial numbers for new items"
msgstr ""
-#: stock/serializers.py:473 stock/serializers.py:1164 stock/serializers.py:1420
+#: stock/serializers.py:473 stock/serializers.py:1170 stock/serializers.py:1426
msgid "Destination stock location"
msgstr ""
@@ -9059,77 +9087,78 @@ msgstr ""
msgid "No stock items selected"
msgstr ""
-#: stock/serializers.py:863 stock/templates/stock/location.html:165
+#: stock/serializers.py:863 stock/serializers.py:926
+#: stock/templates/stock/location.html:165
#: stock/templates/stock/location.html:213
#: stock/templates/stock/location_sidebar.html:5
msgid "Sublocations"
msgstr ""
-#: stock/serializers.py:1036
+#: stock/serializers.py:1042
msgid "Part must be salable"
msgstr "パーツは販売可能でなければなりません"
-#: stock/serializers.py:1040
+#: stock/serializers.py:1046
msgid "Item is allocated to a sales order"
msgstr ""
-#: stock/serializers.py:1044
+#: stock/serializers.py:1050
msgid "Item is allocated to a build order"
msgstr ""
-#: stock/serializers.py:1068
+#: stock/serializers.py:1074
msgid "Customer to assign stock items"
msgstr ""
-#: stock/serializers.py:1074
+#: stock/serializers.py:1080
msgid "Selected company is not a customer"
msgstr ""
-#: stock/serializers.py:1082
+#: stock/serializers.py:1088
msgid "Stock assignment notes"
msgstr ""
-#: stock/serializers.py:1092 stock/serializers.py:1346
+#: stock/serializers.py:1098 stock/serializers.py:1352
msgid "A list of stock items must be provided"
msgstr ""
-#: stock/serializers.py:1171
+#: stock/serializers.py:1177
msgid "Stock merging notes"
msgstr ""
-#: stock/serializers.py:1176
+#: stock/serializers.py:1182
msgid "Allow mismatched suppliers"
msgstr ""
-#: stock/serializers.py:1177
+#: stock/serializers.py:1183
msgid "Allow stock items with different supplier parts to be merged"
msgstr ""
-#: stock/serializers.py:1182
+#: stock/serializers.py:1188
msgid "Allow mismatched status"
msgstr ""
-#: stock/serializers.py:1183
+#: stock/serializers.py:1189
msgid "Allow stock items with different status codes to be merged"
msgstr ""
-#: stock/serializers.py:1193
+#: stock/serializers.py:1199
msgid "At least two stock items must be provided"
msgstr ""
-#: stock/serializers.py:1260
+#: stock/serializers.py:1266
msgid "No Change"
msgstr ""
-#: stock/serializers.py:1289
+#: stock/serializers.py:1295
msgid "StockItem primary key value"
msgstr ""
-#: stock/serializers.py:1308
+#: stock/serializers.py:1314
msgid "Stock item status code"
msgstr ""
-#: stock/serializers.py:1336
+#: stock/serializers.py:1342
msgid "Stock transaction notes"
msgstr ""
@@ -10662,7 +10691,7 @@ msgid "The following parts are low on required stock"
msgstr ""
#: templates/email/build_order_required_stock.html:18
-#: templates/js/translated/bom.js:1668 templates/js/translated/build.js:2557
+#: templates/js/translated/bom.js:1674 templates/js/translated/build.js:2557
msgid "Required Quantity"
msgstr ""
@@ -10676,7 +10705,7 @@ msgid "Click on the following link to view this part"
msgstr "このパーツを表示するには、次のリンクをクリックしてください"
#: templates/email/low_stock_notification.html:18
-#: templates/js/translated/part.js:3209
+#: templates/js/translated/part.js:3218
msgid "Minimum Quantity"
msgstr "最小在庫"
@@ -11051,62 +11080,68 @@ msgstr ""
msgid "No pricing available"
msgstr ""
-#: templates/js/translated/bom.js:1182 templates/js/translated/build.js:2596
+#: templates/js/translated/bom.js:1184 templates/js/translated/build.js:2622
+#, fuzzy
+#| msgid "External Link"
+msgid "External stock"
+msgstr "外部リンク"
+
+#: templates/js/translated/bom.js:1188 templates/js/translated/build.js:2596
#: templates/js/translated/sales_order.js:1910
msgid "No Stock Available"
msgstr ""
-#: templates/js/translated/bom.js:1187 templates/js/translated/build.js:2600
+#: templates/js/translated/bom.js:1193 templates/js/translated/build.js:2600
msgid "Includes variant and substitute stock"
msgstr ""
-#: templates/js/translated/bom.js:1189 templates/js/translated/build.js:2602
+#: templates/js/translated/bom.js:1195 templates/js/translated/build.js:2602
#: templates/js/translated/part.js:1256
#: templates/js/translated/sales_order.js:1907
msgid "Includes variant stock"
msgstr ""
-#: templates/js/translated/bom.js:1191 templates/js/translated/build.js:2604
+#: templates/js/translated/bom.js:1197 templates/js/translated/build.js:2604
msgid "Includes substitute stock"
msgstr ""
-#: templates/js/translated/bom.js:1219 templates/js/translated/build.js:2587
+#: templates/js/translated/bom.js:1225 templates/js/translated/build.js:2587
msgid "Consumable item"
msgstr ""
-#: templates/js/translated/bom.js:1279
+#: templates/js/translated/bom.js:1285
msgid "Validate BOM Item"
msgstr ""
-#: templates/js/translated/bom.js:1281
+#: templates/js/translated/bom.js:1287
msgid "This line has been validated"
msgstr ""
-#: templates/js/translated/bom.js:1283
+#: templates/js/translated/bom.js:1289
msgid "Edit substitute parts"
msgstr ""
-#: templates/js/translated/bom.js:1285 templates/js/translated/bom.js:1480
+#: templates/js/translated/bom.js:1291 templates/js/translated/bom.js:1486
msgid "Edit BOM Item"
msgstr ""
-#: templates/js/translated/bom.js:1287
+#: templates/js/translated/bom.js:1293
msgid "Delete BOM Item"
msgstr ""
-#: templates/js/translated/bom.js:1307
+#: templates/js/translated/bom.js:1313
msgid "View BOM"
msgstr ""
-#: templates/js/translated/bom.js:1391
+#: templates/js/translated/bom.js:1397
msgid "No BOM items found"
msgstr ""
-#: templates/js/translated/bom.js:1651 templates/js/translated/build.js:2486
+#: templates/js/translated/bom.js:1657 templates/js/translated/build.js:2486
msgid "Required Part"
msgstr ""
-#: templates/js/translated/bom.js:1677
+#: templates/js/translated/bom.js:1683
msgid "Inherited from parent BOM"
msgstr ""
@@ -11449,29 +11484,29 @@ msgstr ""
msgid "Sufficient stock available"
msgstr ""
-#: templates/js/translated/build.js:2643
+#: templates/js/translated/build.js:2647
msgid "Consumable Item"
msgstr ""
-#: templates/js/translated/build.js:2648
+#: templates/js/translated/build.js:2652
msgid "Tracked item"
msgstr ""
-#: templates/js/translated/build.js:2655
+#: templates/js/translated/build.js:2659
#: templates/js/translated/sales_order.js:2016
msgid "Build stock"
msgstr ""
-#: templates/js/translated/build.js:2660 templates/js/translated/stock.js:1829
+#: templates/js/translated/build.js:2664 templates/js/translated/stock.js:1829
msgid "Order stock"
msgstr ""
-#: templates/js/translated/build.js:2664
+#: templates/js/translated/build.js:2668
#: templates/js/translated/sales_order.js:2010
msgid "Allocate stock"
msgstr ""
-#: templates/js/translated/build.js:2668
+#: templates/js/translated/build.js:2672
msgid "Remove stock allocation"
msgstr ""
@@ -12313,64 +12348,64 @@ msgstr ""
msgid "Subscribed category"
msgstr ""
-#: templates/js/translated/part.js:2855
+#: templates/js/translated/part.js:2864
msgid "No test templates matching query"
msgstr ""
-#: templates/js/translated/part.js:2877 templates/js/translated/search.js:342
+#: templates/js/translated/part.js:2886 templates/js/translated/search.js:342
msgid "results"
msgstr ""
-#: templates/js/translated/part.js:2927 templates/js/translated/stock.js:1446
+#: templates/js/translated/part.js:2936 templates/js/translated/stock.js:1446
msgid "Edit test result"
msgstr ""
-#: templates/js/translated/part.js:2928 templates/js/translated/stock.js:1447
+#: templates/js/translated/part.js:2937 templates/js/translated/stock.js:1447
#: templates/js/translated/stock.js:1692
msgid "Delete test result"
msgstr ""
-#: templates/js/translated/part.js:2932
+#: templates/js/translated/part.js:2941
msgid "This test is defined for a parent part"
msgstr ""
-#: templates/js/translated/part.js:2948
+#: templates/js/translated/part.js:2957
msgid "Edit Test Result Template"
msgstr ""
-#: templates/js/translated/part.js:2962
+#: templates/js/translated/part.js:2971
msgid "Delete Test Result Template"
msgstr ""
-#: templates/js/translated/part.js:3041 templates/js/translated/part.js:3042
+#: templates/js/translated/part.js:3050 templates/js/translated/part.js:3051
msgid "No date specified"
msgstr ""
-#: templates/js/translated/part.js:3044
+#: templates/js/translated/part.js:3053
msgid "Specified date is in the past"
msgstr ""
-#: templates/js/translated/part.js:3050
+#: templates/js/translated/part.js:3059
msgid "Speculative"
msgstr ""
-#: templates/js/translated/part.js:3100
+#: templates/js/translated/part.js:3109
msgid "No scheduling information available for this part"
msgstr ""
-#: templates/js/translated/part.js:3106
+#: templates/js/translated/part.js:3115
msgid "Error fetching scheduling information for this part"
msgstr ""
-#: templates/js/translated/part.js:3202
+#: templates/js/translated/part.js:3211
msgid "Scheduled Stock Quantities"
msgstr ""
-#: templates/js/translated/part.js:3218
+#: templates/js/translated/part.js:3227
msgid "Maximum Quantity"
msgstr ""
-#: templates/js/translated/part.js:3263
+#: templates/js/translated/part.js:3272
msgid "Minimum Stock Level"
msgstr ""
@@ -14052,4 +14087,3 @@ msgstr "項目を編集する権限"
#: users/models.py:413
msgid "Permission to delete items"
msgstr "項目を削除する権限"
-
diff --git a/InvenTree/locale/ko/LC_MESSAGES/django.po b/InvenTree/locale/ko/LC_MESSAGES/django.po
index 53bbb6d8b4..b88c8b2fa9 100644
--- a/InvenTree/locale/ko/LC_MESSAGES/django.po
+++ b/InvenTree/locale/ko/LC_MESSAGES/django.po
@@ -2,7 +2,7 @@ msgid ""
msgstr ""
"Project-Id-Version: inventree\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2024-02-28 04:05+0000\n"
+"POT-Creation-Date: 2024-03-05 00:41+0000\n"
"PO-Revision-Date: 2024-02-28 07:23\n"
"Last-Translator: \n"
"Language-Team: Korean\n"
@@ -66,9 +66,9 @@ msgstr "날짜 입력"
#: report/templates/report/inventree_build_order_base.html:172
#: stock/admin.py:226 stock/models.py:2335 stock/models.py:2451
#: stock/serializers.py:479 stock/serializers.py:632 stock/serializers.py:728
-#: stock/serializers.py:778 stock/serializers.py:1081 stock/serializers.py:1170
-#: stock/serializers.py:1335 stock/templates/stock/stock_sidebar.html:25
-#: templates/js/translated/barcode.js:143 templates/js/translated/bom.js:1259
+#: stock/serializers.py:778 stock/serializers.py:1087 stock/serializers.py:1176
+#: stock/serializers.py:1341 stock/templates/stock/stock_sidebar.html:25
+#: templates/js/translated/barcode.js:143 templates/js/translated/bom.js:1265
#: templates/js/translated/company.js:1674 templates/js/translated/order.js:347
#: templates/js/translated/part.js:1080
#: templates/js/translated/purchase_order.js:2201
@@ -523,7 +523,7 @@ msgstr "이름"
#: templates/js/translated/order.js:298 templates/js/translated/part.js:1238
#: templates/js/translated/part.js:1483 templates/js/translated/part.js:1621
#: templates/js/translated/part.js:1958 templates/js/translated/part.js:2355
-#: templates/js/translated/part.js:2785 templates/js/translated/part.js:2887
+#: templates/js/translated/part.js:2785 templates/js/translated/part.js:2896
#: templates/js/translated/plugin.js:80
#: templates/js/translated/purchase_order.js:1707
#: templates/js/translated/purchase_order.js:1850
@@ -678,7 +678,7 @@ msgstr "원격 이미지 파일의 URL"
msgid "Downloading images from remote URL is not enabled"
msgstr "원격 URL 에서 이미지 다운로드가 활성화되지 않음"
-#: InvenTree/status.py:66 part/serializers.py:1120
+#: InvenTree/status.py:66 part/serializers.py:1138
msgid "Background worker check failed"
msgstr "Background worker 확인 실패"
@@ -960,7 +960,7 @@ msgid "Tracked"
msgstr ""
#: build/api.py:285 part/admin.py:144 templates/js/translated/build.js:1741
-#: templates/js/translated/build.js:2626
+#: templates/js/translated/build.js:2630
#: templates/js/translated/sales_order.js:1929
#: templates/js/translated/table_filters.js:571
msgid "Allocated"
@@ -1044,11 +1044,11 @@ msgstr ""
#: build/models.py:199 build/templates/build/build_base.html:97
#: build/templates/build/detail.html:29 company/models.py:1044
#: order/models.py:1389 order/models.py:1532 order/models.py:1533
-#: part/api.py:1528 part/models.py:389 part/models.py:3003 part/models.py:3147
-#: part/models.py:3291 part/models.py:3314 part/models.py:3335
-#: part/models.py:3357 part/models.py:3458 part/models.py:3754
-#: part/models.py:3885 part/models.py:3978 part/models.py:4339
-#: part/serializers.py:1066 part/serializers.py:1631
+#: part/api.py:1528 part/api.py:1820 part/models.py:389 part/models.py:3003
+#: part/models.py:3147 part/models.py:3291 part/models.py:3314
+#: part/models.py:3335 part/models.py:3357 part/models.py:3458
+#: part/models.py:3754 part/models.py:3885 part/models.py:3978
+#: part/models.py:4339 part/serializers.py:1084 part/serializers.py:1659
#: part/templates/part/part_app_base.html:8
#: part/templates/part/part_pricing.html:12
#: part/templates/part/upload_bom.html:52
@@ -1147,7 +1147,7 @@ msgid "Build status code"
msgstr ""
#: build/models.py:264 build/serializers.py:280 order/serializers.py:549
-#: stock/models.py:826 stock/serializers.py:1300
+#: stock/models.py:826 stock/serializers.py:1306
#: templates/js/translated/purchase_order.js:1129
msgid "Batch Code"
msgstr ""
@@ -1242,48 +1242,48 @@ msgstr ""
msgid "Project code for this build order"
msgstr ""
-#: build/models.py:559
+#: build/models.py:575
#, python-brace-format
msgid "Build order {build} has been completed"
msgstr ""
-#: build/models.py:565
+#: build/models.py:581
msgid "A build order has been completed"
msgstr ""
-#: build/models.py:783 build/models.py:858
+#: build/models.py:799 build/models.py:874
msgid "No build output specified"
msgstr ""
-#: build/models.py:786
+#: build/models.py:802
msgid "Build output is already completed"
msgstr ""
-#: build/models.py:789
+#: build/models.py:805
msgid "Build output does not match Build Order"
msgstr ""
-#: build/models.py:862 build/serializers.py:223 build/serializers.py:262
+#: build/models.py:878 build/serializers.py:223 build/serializers.py:262
#: build/serializers.py:831 order/models.py:526 order/serializers.py:401
-#: order/serializers.py:544 part/serializers.py:1423 part/serializers.py:1789
+#: order/serializers.py:544 part/serializers.py:1442 part/serializers.py:1817
#: stock/models.py:665 stock/models.py:1477 stock/serializers.py:450
msgid "Quantity must be greater than zero"
msgstr "수량 값은 0보다 커야 합니다"
-#: build/models.py:867 build/serializers.py:228
+#: build/models.py:883 build/serializers.py:228
msgid "Quantity cannot be greater than the output quantity"
msgstr ""
-#: build/models.py:924 build/serializers.py:533
+#: build/models.py:940 build/serializers.py:533
#, python-brace-format
msgid "Build output {serial} has not passed all required tests"
msgstr ""
-#: build/models.py:1286
+#: build/models.py:1302
msgid "Build object"
msgstr ""
-#: build/models.py:1300 build/models.py:1558 build/serializers.py:210
+#: build/models.py:1316 build/models.py:1574 build/serializers.py:210
#: build/serializers.py:247 build/templates/build/build_base.html:102
#: build/templates/build/detail.html:34 common/models.py:2432
#: order/models.py:1247 order/models.py:1902 order/serializers.py:1306
@@ -1310,7 +1310,7 @@ msgstr ""
#: templates/js/translated/company.js:1808
#: templates/js/translated/model_renderers.js:230
#: templates/js/translated/order.js:304 templates/js/translated/part.js:961
-#: templates/js/translated/part.js:1811 templates/js/translated/part.js:3332
+#: templates/js/translated/part.js:1811 templates/js/translated/part.js:3341
#: templates/js/translated/pricing.js:381
#: templates/js/translated/pricing.js:474
#: templates/js/translated/pricing.js:522
@@ -1330,38 +1330,38 @@ msgstr ""
msgid "Quantity"
msgstr "수량"
-#: build/models.py:1301
+#: build/models.py:1317
msgid "Required quantity for build order"
msgstr ""
-#: build/models.py:1381
+#: build/models.py:1397
msgid "Build item must specify a build output, as master part is marked as trackable"
msgstr ""
-#: build/models.py:1390
+#: build/models.py:1406
#, python-brace-format
msgid "Allocated quantity ({q}) must not exceed available stock quantity ({a})"
msgstr ""
-#: build/models.py:1400 order/models.py:1853
+#: build/models.py:1416 order/models.py:1853
msgid "Stock item is over-allocated"
msgstr ""
-#: build/models.py:1406 order/models.py:1856
+#: build/models.py:1422 order/models.py:1856
msgid "Allocation quantity must be greater than zero"
msgstr ""
-#: build/models.py:1412
+#: build/models.py:1428
msgid "Quantity must be 1 for serialized stock"
msgstr ""
-#: build/models.py:1473
+#: build/models.py:1489
msgid "Selected stock item does not match BOM line"
msgstr ""
-#: build/models.py:1545 build/serializers.py:811 order/serializers.py:1150
-#: order/serializers.py:1171 stock/serializers.py:544 stock/serializers.py:1019
-#: stock/serializers.py:1131 stock/templates/stock/item_base.html:10
+#: build/models.py:1561 build/serializers.py:811 order/serializers.py:1150
+#: order/serializers.py:1171 stock/serializers.py:544 stock/serializers.py:1025
+#: stock/serializers.py:1137 stock/templates/stock/item_base.html:10
#: stock/templates/stock/item_base.html:23
#: stock/templates/stock/item_base.html:194
#: templates/js/translated/build.js:1742
@@ -1376,19 +1376,19 @@ msgstr ""
msgid "Stock Item"
msgstr ""
-#: build/models.py:1546
+#: build/models.py:1562
msgid "Source stock item"
msgstr ""
-#: build/models.py:1559
+#: build/models.py:1575
msgid "Stock quantity to allocate to build"
msgstr ""
-#: build/models.py:1567
+#: build/models.py:1583
msgid "Install into"
msgstr ""
-#: build/models.py:1568
+#: build/models.py:1584
msgid "Destination stock item"
msgstr ""
@@ -1452,9 +1452,9 @@ msgid "A list of build outputs must be provided"
msgstr ""
#: build/serializers.py:426 build/serializers.py:498 order/serializers.py:533
-#: order/serializers.py:641 order/serializers.py:1646 part/serializers.py:1086
+#: order/serializers.py:641 order/serializers.py:1646 part/serializers.py:1104
#: stock/serializers.py:472 stock/serializers.py:627 stock/serializers.py:723
-#: stock/serializers.py:1163 stock/serializers.py:1419
+#: stock/serializers.py:1169 stock/serializers.py:1425
#: stock/templates/stock/item_base.html:394
#: templates/js/translated/barcode.js:547
#: templates/js/translated/barcode.js:795 templates/js/translated/build.js:999
@@ -1494,7 +1494,7 @@ msgstr ""
#: build/serializers.py:505 build/templates/build/build_base.html:151
#: build/templates/build/detail.html:62 order/models.py:910
#: order/models.py:2005 order/serializers.py:565 stock/admin.py:165
-#: stock/serializers.py:774 stock/serializers.py:1307
+#: stock/serializers.py:774 stock/serializers.py:1313
#: stock/templates/stock/item_base.html:427
#: templates/js/translated/barcode.js:252 templates/js/translated/build.js:2189
#: templates/js/translated/purchase_order.js:1308
@@ -1602,7 +1602,7 @@ msgstr ""
msgid "bom_item.part must point to the same part as the build order"
msgstr ""
-#: build/serializers.py:817 stock/serializers.py:1032
+#: build/serializers.py:817 stock/serializers.py:1038
msgid "Item must be in stock"
msgstr ""
@@ -1659,44 +1659,45 @@ msgstr ""
msgid "Allocate optional BOM items to build order"
msgstr ""
-#: build/serializers.py:1096 part/models.py:3895 part/models.py:4331
+#: build/serializers.py:1097 part/models.py:3895 part/models.py:4331
#: stock/api.py:745
msgid "BOM Item"
msgstr ""
-#: build/serializers.py:1105 templates/js/translated/index.js:130
+#: build/serializers.py:1106 templates/js/translated/index.js:130
msgid "Allocated Stock"
msgstr ""
-#: build/serializers.py:1110 part/admin.py:132 part/bom.py:173
-#: part/serializers.py:1441 part/templates/part/part_base.html:210
-#: templates/js/translated/bom.js:1202 templates/js/translated/build.js:2614
-#: templates/js/translated/part.js:709 templates/js/translated/part.js:2148
+#: build/serializers.py:1111 part/admin.py:132 part/bom.py:173
+#: part/serializers.py:798 part/serializers.py:1460
+#: part/templates/part/part_base.html:210 templates/js/translated/bom.js:1208
+#: templates/js/translated/build.js:2614 templates/js/translated/part.js:709
+#: templates/js/translated/part.js:2148
#: templates/js/translated/table_filters.js:170
msgid "On Order"
msgstr ""
-#: build/serializers.py:1115 part/serializers.py:1443
+#: build/serializers.py:1116 part/serializers.py:1462
#: templates/js/translated/build.js:2618
#: templates/js/translated/table_filters.js:360
msgid "In Production"
msgstr ""
-#: build/serializers.py:1120 part/bom.py:172 part/serializers.py:1454
+#: build/serializers.py:1121 part/bom.py:172 part/serializers.py:1473
#: part/templates/part/part_base.html:192
#: templates/js/translated/sales_order.js:1893
msgid "Available Stock"
msgstr ""
-#: build/tasks.py:149
+#: build/tasks.py:171
msgid "Stock required for build order"
msgstr ""
-#: build/tasks.py:166
+#: build/tasks.py:188
msgid "Overdue Build Order"
msgstr ""
-#: build/tasks.py:171
+#: build/tasks.py:193
#, python-brace-format
msgid "Build order {bo} is now overdue"
msgstr ""
@@ -1990,27 +1991,31 @@ msgstr ""
msgid "Order Parts"
msgstr ""
-#: build/templates/build/detail.html:210
-msgid "Incomplete Build Outputs"
-msgstr ""
-
-#: build/templates/build/detail.html:214
-msgid "Create new build output"
+#: build/templates/build/detail.html:205
+msgid "Available stock has been filtered based on specified source location for this build order"
msgstr ""
#: build/templates/build/detail.html:215
+msgid "Incomplete Build Outputs"
+msgstr ""
+
+#: build/templates/build/detail.html:219
+msgid "Create new build output"
+msgstr ""
+
+#: build/templates/build/detail.html:220
msgid "New Build Output"
msgstr ""
-#: build/templates/build/detail.html:232 build/templates/build/sidebar.html:15
+#: build/templates/build/detail.html:237 build/templates/build/sidebar.html:15
msgid "Consumed Stock"
msgstr ""
-#: build/templates/build/detail.html:244
+#: build/templates/build/detail.html:249
msgid "Completed Build Outputs"
msgstr ""
-#: build/templates/build/detail.html:256 build/templates/build/sidebar.html:19
+#: build/templates/build/detail.html:261 build/templates/build/sidebar.html:19
#: company/templates/company/detail.html:229
#: company/templates/company/manufacturer_part.html:141
#: company/templates/company/manufacturer_part_sidebar.html:9
@@ -2026,15 +2031,15 @@ msgstr ""
msgid "Attachments"
msgstr ""
-#: build/templates/build/detail.html:271
+#: build/templates/build/detail.html:276
msgid "Build Notes"
msgstr ""
-#: build/templates/build/detail.html:426
+#: build/templates/build/detail.html:434
msgid "Allocation Complete"
msgstr ""
-#: build/templates/build/detail.html:427
+#: build/templates/build/detail.html:435
msgid "All lines have been fully allocated"
msgstr ""
@@ -2436,7 +2441,7 @@ msgid "Parts are templates by default"
msgstr ""
#: common/models.py:1456 part/admin.py:91 part/admin.py:431 part/models.py:1015
-#: templates/js/translated/bom.js:1633
+#: templates/js/translated/bom.js:1639
#: templates/js/translated/table_filters.js:330
#: templates/js/translated/table_filters.js:721
msgid "Assembly"
@@ -3495,7 +3500,7 @@ msgstr ""
msgid "Price break quantity"
msgstr ""
-#: common/models.py:2440 company/serializers.py:484 order/admin.py:42
+#: common/models.py:2440 company/serializers.py:486 order/admin.py:42
#: order/models.py:1321 order/models.py:2226
#: templates/js/translated/company.js:1813 templates/js/translated/part.js:1885
#: templates/js/translated/pricing.js:621
@@ -3972,7 +3977,7 @@ msgstr ""
#: company/models.py:495 company/templates/company/company_base.html:76
#: company/templates/company/manufacturer_part.html:90
-#: company/templates/company/supplier_part.html:145 part/serializers.py:497
+#: company/templates/company/supplier_part.html:145 part/serializers.py:505
#: stock/templates/stock/item_base.html:207
#: templates/js/translated/company.js:506
#: templates/js/translated/company.js:1108
@@ -3987,7 +3992,7 @@ msgid "Select manufacturer"
msgstr ""
#: company/models.py:502 company/templates/company/manufacturer_part.html:101
-#: company/templates/company/supplier_part.html:153 part/serializers.py:507
+#: company/templates/company/supplier_part.html:153 part/serializers.py:515
#: templates/js/translated/company.js:351
#: templates/js/translated/company.js:1107
#: templates/js/translated/company.js:1302
@@ -4059,7 +4064,7 @@ msgstr ""
#: company/models.py:795 company/templates/company/company_base.html:81
#: company/templates/company/supplier_part.html:129 order/models.py:453
#: order/templates/order/order_base.html:136 part/bom.py:272 part/bom.py:310
-#: part/serializers.py:481 plugin/builtin/suppliers/digikey.py:25
+#: part/serializers.py:489 plugin/builtin/suppliers/digikey.py:25
#: plugin/builtin/suppliers/lcsc.py:26 plugin/builtin/suppliers/mouser.py:24
#: plugin/builtin/suppliers/tme.py:26 stock/templates/stock/item_base.html:224
#: templates/email/overdue_purchase_order.html:16
@@ -4076,7 +4081,7 @@ msgstr ""
msgid "Select supplier"
msgstr ""
-#: company/models.py:802 part/serializers.py:492
+#: company/models.py:802 part/serializers.py:500
msgid "Supplier stock keeping unit"
msgstr ""
@@ -4112,7 +4117,7 @@ msgid "Minimum charge (e.g. stocking fee)"
msgstr ""
#: company/models.py:851 company/templates/company/supplier_part.html:160
-#: stock/admin.py:224 stock/models.py:785 stock/serializers.py:1317
+#: stock/admin.py:224 stock/models.py:785 stock/serializers.py:1323
#: stock/templates/stock/item_base.html:240
#: templates/js/translated/company.js:1636
#: templates/js/translated/stock.js:2387
@@ -4157,7 +4162,7 @@ msgstr ""
msgid "Date of last update of availability data"
msgstr ""
-#: company/serializers.py:153
+#: company/serializers.py:155
msgid "Default currency used for this supplier"
msgstr ""
@@ -4218,7 +4223,7 @@ msgstr ""
#: company/templates/company/company_base.html:86 order/models.py:898
#: order/models.py:1993 order/templates/order/return_order_base.html:131
#: order/templates/order/sales_order_base.html:144 stock/models.py:807
-#: stock/models.py:808 stock/serializers.py:1067
+#: stock/models.py:808 stock/serializers.py:1073
#: stock/templates/stock/item_base.html:405
#: templates/email/overdue_sales_order.html:16
#: templates/js/translated/company.js:502
@@ -4429,8 +4434,9 @@ msgstr ""
#: company/templates/company/manufacturer_part.html:119
#: company/templates/company/supplier_part.html:15 company/views.py:31
-#: part/admin.py:122 part/templates/part/part_sidebar.html:33
-#: templates/InvenTree/search.html:190 templates/navbar.html:48
+#: part/admin.py:122 part/serializers.py:802
+#: part/templates/part/part_sidebar.html:33 templates/InvenTree/search.html:190
+#: templates/navbar.html:48
msgid "Suppliers"
msgstr ""
@@ -4528,7 +4534,7 @@ msgid "No supplier information available"
msgstr ""
#: company/templates/company/supplier_part.html:139 part/bom.py:279
-#: part/bom.py:311 part/serializers.py:491
+#: part/bom.py:311 part/serializers.py:499
#: templates/js/translated/company.js:349 templates/js/translated/part.js:1786
#: templates/js/translated/pricing.js:510
#: templates/js/translated/purchase_order.js:1851
@@ -4577,10 +4583,12 @@ msgstr ""
msgid "Update Part Availability"
msgstr ""
-#: company/templates/company/supplier_part_sidebar.html:5 part/stocktake.py:223
+#: company/templates/company/supplier_part_sidebar.html:5
+#: part/serializers.py:801 part/stocktake.py:223
#: part/templates/part/category.html:183
#: part/templates/part/category_sidebar.html:17 stock/admin.py:69
-#: stock/serializers.py:760 stock/templates/stock/location.html:170
+#: stock/serializers.py:760 stock/serializers.py:924
+#: stock/templates/stock/location.html:170
#: stock/templates/stock/location.html:184
#: stock/templates/stock/location.html:196
#: stock/templates/stock/location_sidebar.html:7
@@ -4640,7 +4648,7 @@ msgid "Label template file"
msgstr ""
#: label/models.py:143 part/models.py:3484 report/models.py:322
-#: templates/js/translated/part.js:2891
+#: templates/js/translated/part.js:2900
#: templates/js/translated/table_filters.js:481
msgid "Enabled"
msgstr ""
@@ -5733,7 +5741,7 @@ msgid "Pending Shipments"
msgstr ""
#: order/templates/order/sales_order_detail.html:71
-#: templates/js/translated/bom.js:1271 templates/js/translated/filters.js:296
+#: templates/js/translated/bom.js:1277 templates/js/translated/filters.js:296
msgid "Actions"
msgstr ""
@@ -5861,10 +5869,10 @@ msgstr ""
msgid "Category Path"
msgstr ""
-#: part/admin.py:323 part/models.py:390 part/serializers.py:259
-#: part/serializers.py:373 part/templates/part/cat_link.html:3
-#: part/templates/part/category.html:23 part/templates/part/category.html:141
-#: part/templates/part/category.html:161
+#: part/admin.py:323 part/models.py:390 part/serializers.py:112
+#: part/serializers.py:265 part/serializers.py:381
+#: part/templates/part/cat_link.html:3 part/templates/part/category.html:23
+#: part/templates/part/category.html:141 part/templates/part/category.html:161
#: part/templates/part/category_sidebar.html:9
#: templates/InvenTree/index.html:36 templates/InvenTree/search.html:84
#: templates/InvenTree/settings/sidebar.html:47
@@ -5889,13 +5897,13 @@ msgstr ""
msgid "Part IPN"
msgstr ""
-#: part/admin.py:421 part/serializers.py:1220
+#: part/admin.py:421 part/serializers.py:1238
#: templates/js/translated/pricing.js:358
#: templates/js/translated/pricing.js:1024
msgid "Minimum Price"
msgstr ""
-#: part/admin.py:426 part/serializers.py:1235
+#: part/admin.py:426 part/serializers.py:1253
#: templates/js/translated/pricing.js:353
#: templates/js/translated/pricing.js:1032
msgid "Maximum Price"
@@ -5974,7 +5982,7 @@ msgid "This option must be selected"
msgstr ""
#: part/api.py:1541 part/models.py:895 part/models.py:3385 part/models.py:3831
-#: part/serializers.py:388 part/serializers.py:1076
+#: part/serializers.py:396 part/serializers.py:1094
#: part/templates/part/part_base.html:260 stock/api.py:733
#: templates/InvenTree/settings/settings_staff_js.html:300
#: templates/js/translated/notification.js:60
@@ -5982,12 +5990,17 @@ msgstr ""
msgid "Category"
msgstr ""
+#: part/api.py:1828
+msgid "Uses"
+msgstr ""
+
#: part/bom.py:170 part/models.py:100 part/models.py:938
#: part/templates/part/category.html:116 part/templates/part/part_base.html:367
msgid "Default Location"
msgstr ""
-#: part/bom.py:171 templates/email/low_stock_notification.html:16
+#: part/bom.py:171 part/serializers.py:803
+#: templates/email/low_stock_notification.html:16
msgid "Total Stock"
msgstr ""
@@ -6010,7 +6023,8 @@ msgstr ""
msgid "Default location for parts in this category"
msgstr ""
-#: part/models.py:106 stock/models.py:165 templates/js/translated/stock.js:2736
+#: part/models.py:106 stock/models.py:165 templates/js/translated/part.js:2810
+#: templates/js/translated/stock.js:2736
#: templates/js/translated/table_filters.js:239
#: templates/js/translated/table_filters.js:283
msgid "Structural"
@@ -6418,7 +6432,7 @@ msgstr ""
msgid "Test with this name already exists for this part"
msgstr ""
-#: part/models.py:3464 templates/js/translated/part.js:2870
+#: part/models.py:3464 templates/js/translated/part.js:2879
msgid "Test Name"
msgstr ""
@@ -6446,7 +6460,7 @@ msgstr ""
msgid "Is this test enabled?"
msgstr ""
-#: part/models.py:3489 templates/js/translated/part.js:2899
+#: part/models.py:3489 templates/js/translated/part.js:2908
#: templates/js/translated/table_filters.js:477
msgid "Required"
msgstr ""
@@ -6455,7 +6469,7 @@ msgstr ""
msgid "Is this test required to pass?"
msgstr ""
-#: part/models.py:3495 templates/js/translated/part.js:2907
+#: part/models.py:3495 templates/js/translated/part.js:2916
msgid "Requires Value"
msgstr ""
@@ -6463,7 +6477,7 @@ msgstr ""
msgid "Does this test require a value when adding a test result?"
msgstr ""
-#: part/models.py:3501 templates/js/translated/part.js:2914
+#: part/models.py:3501 templates/js/translated/part.js:2923
msgid "Requires Attachment"
msgstr ""
@@ -6685,311 +6699,325 @@ msgstr ""
msgid "Duplicate relationship already exists"
msgstr ""
-#: part/serializers.py:128 part/templates/part/category.html:122
-#: part/templates/part/category.html:207
+#: part/serializers.py:114 part/serializers.py:134
+#: part/templates/part/category.html:122 part/templates/part/category.html:207
#: part/templates/part/category_sidebar.html:7
msgid "Subcategories"
msgstr ""
-#: part/serializers.py:172
+#: part/serializers.py:178
msgid "Results"
msgstr ""
-#: part/serializers.py:173
+#: part/serializers.py:179
msgid "Number of results recorded against this template"
msgstr ""
-#: part/serializers.py:197 part/serializers.py:215 stock/serializers.py:384
+#: part/serializers.py:203 part/serializers.py:221 stock/serializers.py:384
msgid "Purchase currency of this stock item"
msgstr ""
-#: part/serializers.py:260
+#: part/serializers.py:266
msgid "Number of parts using this template"
msgstr ""
-#: part/serializers.py:379
+#: part/serializers.py:387
msgid "No parts selected"
msgstr ""
-#: part/serializers.py:389
+#: part/serializers.py:397
msgid "Select category"
msgstr ""
-#: part/serializers.py:419
+#: part/serializers.py:427
msgid "Original Part"
msgstr ""
-#: part/serializers.py:420
+#: part/serializers.py:428
msgid "Select original part to duplicate"
msgstr ""
-#: part/serializers.py:425
+#: part/serializers.py:433
msgid "Copy Image"
msgstr "이미지 복사"
-#: part/serializers.py:426
+#: part/serializers.py:434
msgid "Copy image from original part"
msgstr ""
-#: part/serializers.py:432 part/templates/part/detail.html:277
+#: part/serializers.py:440 part/templates/part/detail.html:277
msgid "Copy BOM"
msgstr ""
-#: part/serializers.py:433
+#: part/serializers.py:441
msgid "Copy bill of materials from original part"
msgstr ""
-#: part/serializers.py:439
+#: part/serializers.py:447
msgid "Copy Parameters"
msgstr ""
-#: part/serializers.py:440
+#: part/serializers.py:448
msgid "Copy parameter data from original part"
msgstr ""
-#: part/serializers.py:446
+#: part/serializers.py:454
msgid "Copy Notes"
msgstr ""
-#: part/serializers.py:447
+#: part/serializers.py:455
msgid "Copy notes from original part"
msgstr ""
-#: part/serializers.py:460
+#: part/serializers.py:468
msgid "Initial Stock Quantity"
msgstr ""
-#: part/serializers.py:462
+#: part/serializers.py:470
msgid "Specify initial stock quantity for this Part. If quantity is zero, no stock is added."
msgstr ""
-#: part/serializers.py:469
+#: part/serializers.py:477
msgid "Initial Stock Location"
msgstr ""
-#: part/serializers.py:470
+#: part/serializers.py:478
msgid "Specify initial stock location for this Part"
msgstr ""
-#: part/serializers.py:482
+#: part/serializers.py:490
msgid "Select supplier (or leave blank to skip)"
msgstr ""
-#: part/serializers.py:498
+#: part/serializers.py:506
msgid "Select manufacturer (or leave blank to skip)"
msgstr ""
-#: part/serializers.py:508
+#: part/serializers.py:516
msgid "Manufacturer part number"
msgstr ""
-#: part/serializers.py:515
+#: part/serializers.py:523
msgid "Selected company is not a valid supplier"
msgstr ""
-#: part/serializers.py:524
+#: part/serializers.py:532
msgid "Selected company is not a valid manufacturer"
msgstr ""
-#: part/serializers.py:535
+#: part/serializers.py:543
msgid "Manufacturer part matching this MPN already exists"
msgstr ""
-#: part/serializers.py:542
+#: part/serializers.py:550
msgid "Supplier part matching this SKU already exists"
msgstr ""
-#: part/serializers.py:815 part/templates/part/copy_part.html:9
+#: part/serializers.py:804
+#, fuzzy
+#| msgid "External Link"
+msgid "External Stock"
+msgstr "외부 링크"
+
+#: part/serializers.py:806
+msgid "Unallocated Stock"
+msgstr ""
+
+#: part/serializers.py:808
+msgid "Variant Stock"
+msgstr ""
+
+#: part/serializers.py:833 part/templates/part/copy_part.html:9
#: templates/js/translated/part.js:471
msgid "Duplicate Part"
msgstr ""
-#: part/serializers.py:816
+#: part/serializers.py:834
msgid "Copy initial data from another Part"
msgstr ""
-#: part/serializers.py:822 templates/js/translated/part.js:102
+#: part/serializers.py:840 templates/js/translated/part.js:102
msgid "Initial Stock"
msgstr ""
-#: part/serializers.py:823
+#: part/serializers.py:841
msgid "Create Part with initial stock quantity"
msgstr ""
-#: part/serializers.py:829
+#: part/serializers.py:847
msgid "Supplier Information"
msgstr ""
-#: part/serializers.py:830
+#: part/serializers.py:848
msgid "Add initial supplier information for this part"
msgstr ""
-#: part/serializers.py:838
+#: part/serializers.py:856
msgid "Copy Category Parameters"
msgstr ""
-#: part/serializers.py:839
+#: part/serializers.py:857
msgid "Copy parameter templates from selected part category"
msgstr ""
-#: part/serializers.py:844
+#: part/serializers.py:862
msgid "Existing Image"
msgstr ""
-#: part/serializers.py:845
+#: part/serializers.py:863
msgid "Filename of an existing part image"
msgstr ""
-#: part/serializers.py:862
+#: part/serializers.py:880
msgid "Image file does not exist"
msgstr ""
-#: part/serializers.py:1068
+#: part/serializers.py:1086
msgid "Limit stocktake report to a particular part, and any variant parts"
msgstr ""
-#: part/serializers.py:1078
+#: part/serializers.py:1096
msgid "Limit stocktake report to a particular part category, and any child categories"
msgstr ""
-#: part/serializers.py:1088
+#: part/serializers.py:1106
msgid "Limit stocktake report to a particular stock location, and any child locations"
msgstr ""
-#: part/serializers.py:1094
+#: part/serializers.py:1112
msgid "Exclude External Stock"
msgstr ""
-#: part/serializers.py:1095
+#: part/serializers.py:1113
msgid "Exclude stock items in external locations"
msgstr ""
-#: part/serializers.py:1100
+#: part/serializers.py:1118
msgid "Generate Report"
msgstr ""
-#: part/serializers.py:1101
+#: part/serializers.py:1119
msgid "Generate report file containing calculated stocktake data"
msgstr ""
-#: part/serializers.py:1106
+#: part/serializers.py:1124
msgid "Update Parts"
msgstr ""
-#: part/serializers.py:1107
+#: part/serializers.py:1125
msgid "Update specified parts with calculated stocktake data"
msgstr ""
-#: part/serializers.py:1115
+#: part/serializers.py:1133
msgid "Stocktake functionality is not enabled"
msgstr ""
-#: part/serializers.py:1221
+#: part/serializers.py:1239
msgid "Override calculated value for minimum price"
msgstr ""
-#: part/serializers.py:1228
+#: part/serializers.py:1246
msgid "Minimum price currency"
msgstr ""
-#: part/serializers.py:1236
+#: part/serializers.py:1254
msgid "Override calculated value for maximum price"
msgstr ""
-#: part/serializers.py:1243
+#: part/serializers.py:1261
msgid "Maximum price currency"
msgstr ""
-#: part/serializers.py:1272
+#: part/serializers.py:1290
msgid "Update"
msgstr ""
-#: part/serializers.py:1273
+#: part/serializers.py:1291
msgid "Update pricing for this part"
msgstr ""
-#: part/serializers.py:1296
+#: part/serializers.py:1314
#, python-brace-format
msgid "Could not convert from provided currencies to {default_currency}"
msgstr ""
-#: part/serializers.py:1303
+#: part/serializers.py:1321
msgid "Minimum price must not be greater than maximum price"
msgstr ""
-#: part/serializers.py:1306
+#: part/serializers.py:1324
msgid "Maximum price must not be less than minimum price"
msgstr ""
-#: part/serializers.py:1632
+#: part/serializers.py:1660
msgid "Select part to copy BOM from"
msgstr ""
-#: part/serializers.py:1640
+#: part/serializers.py:1668
msgid "Remove Existing Data"
msgstr ""
-#: part/serializers.py:1641
+#: part/serializers.py:1669
msgid "Remove existing BOM items before copying"
msgstr ""
-#: part/serializers.py:1646
+#: part/serializers.py:1674
msgid "Include Inherited"
msgstr ""
-#: part/serializers.py:1647
+#: part/serializers.py:1675
msgid "Include BOM items which are inherited from templated parts"
msgstr ""
-#: part/serializers.py:1652
+#: part/serializers.py:1680
msgid "Skip Invalid Rows"
msgstr ""
-#: part/serializers.py:1653
+#: part/serializers.py:1681
msgid "Enable this option to skip invalid rows"
msgstr ""
-#: part/serializers.py:1658
+#: part/serializers.py:1686
msgid "Copy Substitute Parts"
msgstr ""
-#: part/serializers.py:1659
+#: part/serializers.py:1687
msgid "Copy substitute parts when duplicate BOM items"
msgstr ""
-#: part/serializers.py:1693
+#: part/serializers.py:1721
msgid "Clear Existing BOM"
msgstr ""
-#: part/serializers.py:1694
+#: part/serializers.py:1722
msgid "Delete existing BOM items before uploading"
msgstr ""
-#: part/serializers.py:1724
+#: part/serializers.py:1752
msgid "No part column specified"
msgstr ""
-#: part/serializers.py:1768
+#: part/serializers.py:1796
msgid "Multiple matching parts found"
msgstr ""
-#: part/serializers.py:1771
+#: part/serializers.py:1799
msgid "No matching part found"
msgstr ""
-#: part/serializers.py:1774
+#: part/serializers.py:1802
msgid "Part is not designated as a component"
msgstr ""
-#: part/serializers.py:1783
+#: part/serializers.py:1811
msgid "Quantity not provided"
msgstr ""
-#: part/serializers.py:1791
+#: part/serializers.py:1819
msgid "Invalid quantity"
msgstr ""
-#: part/serializers.py:1812
+#: part/serializers.py:1840
msgid "At least one BOM item is required"
msgstr ""
@@ -7221,7 +7249,7 @@ msgid "Validate BOM"
msgstr ""
#: part/templates/part/detail.html:283 part/templates/part/detail.html:284
-#: templates/js/translated/bom.js:1314 templates/js/translated/bom.js:1315
+#: templates/js/translated/bom.js:1320 templates/js/translated/bom.js:1321
msgid "Add BOM Item"
msgstr ""
@@ -7405,7 +7433,7 @@ msgstr ""
msgid "Allocated to Sales Orders"
msgstr ""
-#: part/templates/part/part_base.html:235 templates/js/translated/bom.js:1213
+#: part/templates/part/part_base.html:235 templates/js/translated/bom.js:1219
msgid "Can Build"
msgstr ""
@@ -8784,7 +8812,7 @@ msgstr ""
msgid "Where is this stock item located?"
msgstr ""
-#: stock/models.py:786 stock/serializers.py:1318
+#: stock/models.py:786 stock/serializers.py:1324
msgid "Packaging this stock item is stored in"
msgstr ""
@@ -8796,7 +8824,7 @@ msgstr ""
msgid "Serial number for this item"
msgstr ""
-#: stock/models.py:830 stock/serializers.py:1301
+#: stock/models.py:830 stock/serializers.py:1307
msgid "Batch code for this stock item"
msgstr ""
@@ -8905,7 +8933,7 @@ msgstr ""
msgid "Serialized stock cannot be merged"
msgstr ""
-#: stock/models.py:1639 stock/serializers.py:1207
+#: stock/models.py:1639 stock/serializers.py:1213
msgid "Duplicate stock items"
msgstr ""
@@ -8986,7 +9014,7 @@ msgstr ""
msgid "Enter serial numbers for new items"
msgstr ""
-#: stock/serializers.py:473 stock/serializers.py:1164 stock/serializers.py:1420
+#: stock/serializers.py:473 stock/serializers.py:1170 stock/serializers.py:1426
msgid "Destination stock location"
msgstr ""
@@ -9059,77 +9087,78 @@ msgstr ""
msgid "No stock items selected"
msgstr ""
-#: stock/serializers.py:863 stock/templates/stock/location.html:165
+#: stock/serializers.py:863 stock/serializers.py:926
+#: stock/templates/stock/location.html:165
#: stock/templates/stock/location.html:213
#: stock/templates/stock/location_sidebar.html:5
msgid "Sublocations"
msgstr ""
-#: stock/serializers.py:1036
+#: stock/serializers.py:1042
msgid "Part must be salable"
msgstr ""
-#: stock/serializers.py:1040
+#: stock/serializers.py:1046
msgid "Item is allocated to a sales order"
msgstr ""
-#: stock/serializers.py:1044
+#: stock/serializers.py:1050
msgid "Item is allocated to a build order"
msgstr ""
-#: stock/serializers.py:1068
+#: stock/serializers.py:1074
msgid "Customer to assign stock items"
msgstr ""
-#: stock/serializers.py:1074
+#: stock/serializers.py:1080
msgid "Selected company is not a customer"
msgstr ""
-#: stock/serializers.py:1082
+#: stock/serializers.py:1088
msgid "Stock assignment notes"
msgstr ""
-#: stock/serializers.py:1092 stock/serializers.py:1346
+#: stock/serializers.py:1098 stock/serializers.py:1352
msgid "A list of stock items must be provided"
msgstr ""
-#: stock/serializers.py:1171
+#: stock/serializers.py:1177
msgid "Stock merging notes"
msgstr ""
-#: stock/serializers.py:1176
+#: stock/serializers.py:1182
msgid "Allow mismatched suppliers"
msgstr ""
-#: stock/serializers.py:1177
+#: stock/serializers.py:1183
msgid "Allow stock items with different supplier parts to be merged"
msgstr ""
-#: stock/serializers.py:1182
+#: stock/serializers.py:1188
msgid "Allow mismatched status"
msgstr ""
-#: stock/serializers.py:1183
+#: stock/serializers.py:1189
msgid "Allow stock items with different status codes to be merged"
msgstr ""
-#: stock/serializers.py:1193
+#: stock/serializers.py:1199
msgid "At least two stock items must be provided"
msgstr ""
-#: stock/serializers.py:1260
+#: stock/serializers.py:1266
msgid "No Change"
msgstr ""
-#: stock/serializers.py:1289
+#: stock/serializers.py:1295
msgid "StockItem primary key value"
msgstr ""
-#: stock/serializers.py:1308
+#: stock/serializers.py:1314
msgid "Stock item status code"
msgstr ""
-#: stock/serializers.py:1336
+#: stock/serializers.py:1342
msgid "Stock transaction notes"
msgstr ""
@@ -10662,7 +10691,7 @@ msgid "The following parts are low on required stock"
msgstr ""
#: templates/email/build_order_required_stock.html:18
-#: templates/js/translated/bom.js:1668 templates/js/translated/build.js:2557
+#: templates/js/translated/bom.js:1674 templates/js/translated/build.js:2557
msgid "Required Quantity"
msgstr ""
@@ -10676,7 +10705,7 @@ msgid "Click on the following link to view this part"
msgstr ""
#: templates/email/low_stock_notification.html:18
-#: templates/js/translated/part.js:3209
+#: templates/js/translated/part.js:3218
msgid "Minimum Quantity"
msgstr ""
@@ -11051,62 +11080,68 @@ msgstr ""
msgid "No pricing available"
msgstr ""
-#: templates/js/translated/bom.js:1182 templates/js/translated/build.js:2596
+#: templates/js/translated/bom.js:1184 templates/js/translated/build.js:2622
+#, fuzzy
+#| msgid "External Link"
+msgid "External stock"
+msgstr "외부 링크"
+
+#: templates/js/translated/bom.js:1188 templates/js/translated/build.js:2596
#: templates/js/translated/sales_order.js:1910
msgid "No Stock Available"
msgstr ""
-#: templates/js/translated/bom.js:1187 templates/js/translated/build.js:2600
+#: templates/js/translated/bom.js:1193 templates/js/translated/build.js:2600
msgid "Includes variant and substitute stock"
msgstr ""
-#: templates/js/translated/bom.js:1189 templates/js/translated/build.js:2602
+#: templates/js/translated/bom.js:1195 templates/js/translated/build.js:2602
#: templates/js/translated/part.js:1256
#: templates/js/translated/sales_order.js:1907
msgid "Includes variant stock"
msgstr ""
-#: templates/js/translated/bom.js:1191 templates/js/translated/build.js:2604
+#: templates/js/translated/bom.js:1197 templates/js/translated/build.js:2604
msgid "Includes substitute stock"
msgstr ""
-#: templates/js/translated/bom.js:1219 templates/js/translated/build.js:2587
+#: templates/js/translated/bom.js:1225 templates/js/translated/build.js:2587
msgid "Consumable item"
msgstr ""
-#: templates/js/translated/bom.js:1279
+#: templates/js/translated/bom.js:1285
msgid "Validate BOM Item"
msgstr ""
-#: templates/js/translated/bom.js:1281
+#: templates/js/translated/bom.js:1287
msgid "This line has been validated"
msgstr ""
-#: templates/js/translated/bom.js:1283
+#: templates/js/translated/bom.js:1289
msgid "Edit substitute parts"
msgstr ""
-#: templates/js/translated/bom.js:1285 templates/js/translated/bom.js:1480
+#: templates/js/translated/bom.js:1291 templates/js/translated/bom.js:1486
msgid "Edit BOM Item"
msgstr ""
-#: templates/js/translated/bom.js:1287
+#: templates/js/translated/bom.js:1293
msgid "Delete BOM Item"
msgstr ""
-#: templates/js/translated/bom.js:1307
+#: templates/js/translated/bom.js:1313
msgid "View BOM"
msgstr ""
-#: templates/js/translated/bom.js:1391
+#: templates/js/translated/bom.js:1397
msgid "No BOM items found"
msgstr ""
-#: templates/js/translated/bom.js:1651 templates/js/translated/build.js:2486
+#: templates/js/translated/bom.js:1657 templates/js/translated/build.js:2486
msgid "Required Part"
msgstr ""
-#: templates/js/translated/bom.js:1677
+#: templates/js/translated/bom.js:1683
msgid "Inherited from parent BOM"
msgstr ""
@@ -11449,29 +11484,29 @@ msgstr ""
msgid "Sufficient stock available"
msgstr ""
-#: templates/js/translated/build.js:2643
+#: templates/js/translated/build.js:2647
msgid "Consumable Item"
msgstr ""
-#: templates/js/translated/build.js:2648
+#: templates/js/translated/build.js:2652
msgid "Tracked item"
msgstr ""
-#: templates/js/translated/build.js:2655
+#: templates/js/translated/build.js:2659
#: templates/js/translated/sales_order.js:2016
msgid "Build stock"
msgstr ""
-#: templates/js/translated/build.js:2660 templates/js/translated/stock.js:1829
+#: templates/js/translated/build.js:2664 templates/js/translated/stock.js:1829
msgid "Order stock"
msgstr ""
-#: templates/js/translated/build.js:2664
+#: templates/js/translated/build.js:2668
#: templates/js/translated/sales_order.js:2010
msgid "Allocate stock"
msgstr ""
-#: templates/js/translated/build.js:2668
+#: templates/js/translated/build.js:2672
msgid "Remove stock allocation"
msgstr ""
@@ -12313,64 +12348,64 @@ msgstr ""
msgid "Subscribed category"
msgstr ""
-#: templates/js/translated/part.js:2855
+#: templates/js/translated/part.js:2864
msgid "No test templates matching query"
msgstr ""
-#: templates/js/translated/part.js:2877 templates/js/translated/search.js:342
+#: templates/js/translated/part.js:2886 templates/js/translated/search.js:342
msgid "results"
msgstr ""
-#: templates/js/translated/part.js:2927 templates/js/translated/stock.js:1446
+#: templates/js/translated/part.js:2936 templates/js/translated/stock.js:1446
msgid "Edit test result"
msgstr ""
-#: templates/js/translated/part.js:2928 templates/js/translated/stock.js:1447
+#: templates/js/translated/part.js:2937 templates/js/translated/stock.js:1447
#: templates/js/translated/stock.js:1692
msgid "Delete test result"
msgstr ""
-#: templates/js/translated/part.js:2932
+#: templates/js/translated/part.js:2941
msgid "This test is defined for a parent part"
msgstr ""
-#: templates/js/translated/part.js:2948
+#: templates/js/translated/part.js:2957
msgid "Edit Test Result Template"
msgstr ""
-#: templates/js/translated/part.js:2962
+#: templates/js/translated/part.js:2971
msgid "Delete Test Result Template"
msgstr ""
-#: templates/js/translated/part.js:3041 templates/js/translated/part.js:3042
+#: templates/js/translated/part.js:3050 templates/js/translated/part.js:3051
msgid "No date specified"
msgstr ""
-#: templates/js/translated/part.js:3044
+#: templates/js/translated/part.js:3053
msgid "Specified date is in the past"
msgstr ""
-#: templates/js/translated/part.js:3050
+#: templates/js/translated/part.js:3059
msgid "Speculative"
msgstr ""
-#: templates/js/translated/part.js:3100
+#: templates/js/translated/part.js:3109
msgid "No scheduling information available for this part"
msgstr ""
-#: templates/js/translated/part.js:3106
+#: templates/js/translated/part.js:3115
msgid "Error fetching scheduling information for this part"
msgstr ""
-#: templates/js/translated/part.js:3202
+#: templates/js/translated/part.js:3211
msgid "Scheduled Stock Quantities"
msgstr ""
-#: templates/js/translated/part.js:3218
+#: templates/js/translated/part.js:3227
msgid "Maximum Quantity"
msgstr ""
-#: templates/js/translated/part.js:3263
+#: templates/js/translated/part.js:3272
msgid "Minimum Stock Level"
msgstr ""
@@ -14052,4 +14087,3 @@ msgstr ""
#: users/models.py:413
msgid "Permission to delete items"
msgstr ""
-
diff --git a/InvenTree/locale/nl/LC_MESSAGES/django.po b/InvenTree/locale/nl/LC_MESSAGES/django.po
index 815cece6e3..28689c4a0e 100644
--- a/InvenTree/locale/nl/LC_MESSAGES/django.po
+++ b/InvenTree/locale/nl/LC_MESSAGES/django.po
@@ -2,7 +2,7 @@ msgid ""
msgstr ""
"Project-Id-Version: inventree\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2024-02-28 04:05+0000\n"
+"POT-Creation-Date: 2024-03-05 00:41+0000\n"
"PO-Revision-Date: 2024-02-28 07:23\n"
"Last-Translator: \n"
"Language-Team: Dutch\n"
@@ -66,9 +66,9 @@ msgstr "Voer datum in"
#: report/templates/report/inventree_build_order_base.html:172
#: stock/admin.py:226 stock/models.py:2335 stock/models.py:2451
#: stock/serializers.py:479 stock/serializers.py:632 stock/serializers.py:728
-#: stock/serializers.py:778 stock/serializers.py:1081 stock/serializers.py:1170
-#: stock/serializers.py:1335 stock/templates/stock/stock_sidebar.html:25
-#: templates/js/translated/barcode.js:143 templates/js/translated/bom.js:1259
+#: stock/serializers.py:778 stock/serializers.py:1087 stock/serializers.py:1176
+#: stock/serializers.py:1341 stock/templates/stock/stock_sidebar.html:25
+#: templates/js/translated/barcode.js:143 templates/js/translated/bom.js:1265
#: templates/js/translated/company.js:1674 templates/js/translated/order.js:347
#: templates/js/translated/part.js:1080
#: templates/js/translated/purchase_order.js:2201
@@ -523,7 +523,7 @@ msgstr "Naam"
#: templates/js/translated/order.js:298 templates/js/translated/part.js:1238
#: templates/js/translated/part.js:1483 templates/js/translated/part.js:1621
#: templates/js/translated/part.js:1958 templates/js/translated/part.js:2355
-#: templates/js/translated/part.js:2785 templates/js/translated/part.js:2887
+#: templates/js/translated/part.js:2785 templates/js/translated/part.js:2896
#: templates/js/translated/plugin.js:80
#: templates/js/translated/purchase_order.js:1707
#: templates/js/translated/purchase_order.js:1850
@@ -678,7 +678,7 @@ msgstr "URL van extern afbeeldingsbestand"
msgid "Downloading images from remote URL is not enabled"
msgstr "Afbeeldingen van externe URL downloaden is niet ingeschakeld"
-#: InvenTree/status.py:66 part/serializers.py:1120
+#: InvenTree/status.py:66 part/serializers.py:1138
msgid "Background worker check failed"
msgstr "Achtergrondwerker check is gefaald"
@@ -960,7 +960,7 @@ msgid "Tracked"
msgstr "Gevolgd"
#: build/api.py:285 part/admin.py:144 templates/js/translated/build.js:1741
-#: templates/js/translated/build.js:2626
+#: templates/js/translated/build.js:2630
#: templates/js/translated/sales_order.js:1929
#: templates/js/translated/table_filters.js:571
msgid "Allocated"
@@ -1044,11 +1044,11 @@ msgstr "Productieorder waar deze productie aan is toegewezen"
#: build/models.py:199 build/templates/build/build_base.html:97
#: build/templates/build/detail.html:29 company/models.py:1044
#: order/models.py:1389 order/models.py:1532 order/models.py:1533
-#: part/api.py:1528 part/models.py:389 part/models.py:3003 part/models.py:3147
-#: part/models.py:3291 part/models.py:3314 part/models.py:3335
-#: part/models.py:3357 part/models.py:3458 part/models.py:3754
-#: part/models.py:3885 part/models.py:3978 part/models.py:4339
-#: part/serializers.py:1066 part/serializers.py:1631
+#: part/api.py:1528 part/api.py:1820 part/models.py:389 part/models.py:3003
+#: part/models.py:3147 part/models.py:3291 part/models.py:3314
+#: part/models.py:3335 part/models.py:3357 part/models.py:3458
+#: part/models.py:3754 part/models.py:3885 part/models.py:3978
+#: part/models.py:4339 part/serializers.py:1084 part/serializers.py:1659
#: part/templates/part/part_app_base.html:8
#: part/templates/part/part_pricing.html:12
#: part/templates/part/upload_bom.html:52
@@ -1147,7 +1147,7 @@ msgid "Build status code"
msgstr "Productiestatuscode"
#: build/models.py:264 build/serializers.py:280 order/serializers.py:549
-#: stock/models.py:826 stock/serializers.py:1300
+#: stock/models.py:826 stock/serializers.py:1306
#: templates/js/translated/purchase_order.js:1129
msgid "Batch Code"
msgstr "Batchcode"
@@ -1242,48 +1242,48 @@ msgstr "Project Code"
msgid "Project code for this build order"
msgstr "Project code voor deze build order"
-#: build/models.py:559
+#: build/models.py:575
#, python-brace-format
msgid "Build order {build} has been completed"
msgstr "Productieorder {build} is voltooid"
-#: build/models.py:565
+#: build/models.py:581
msgid "A build order has been completed"
msgstr "Een productieorder is voltooid"
-#: build/models.py:783 build/models.py:858
+#: build/models.py:799 build/models.py:874
msgid "No build output specified"
msgstr "Geen productie uitvoer opgegeven"
-#: build/models.py:786
+#: build/models.py:802
msgid "Build output is already completed"
msgstr "Productie uitvoer is al voltooid"
-#: build/models.py:789
+#: build/models.py:805
msgid "Build output does not match Build Order"
msgstr "Productuitvoer komt niet overeen met de Productieorder"
-#: build/models.py:862 build/serializers.py:223 build/serializers.py:262
+#: build/models.py:878 build/serializers.py:223 build/serializers.py:262
#: build/serializers.py:831 order/models.py:526 order/serializers.py:401
-#: order/serializers.py:544 part/serializers.py:1423 part/serializers.py:1789
+#: order/serializers.py:544 part/serializers.py:1442 part/serializers.py:1817
#: stock/models.py:665 stock/models.py:1477 stock/serializers.py:450
msgid "Quantity must be greater than zero"
msgstr "Hoeveelheid moet groter zijn dan nul"
-#: build/models.py:867 build/serializers.py:228
+#: build/models.py:883 build/serializers.py:228
msgid "Quantity cannot be greater than the output quantity"
msgstr "Hoeveelheid kan niet groter zijn dan aantal"
-#: build/models.py:924 build/serializers.py:533
+#: build/models.py:940 build/serializers.py:533
#, python-brace-format
msgid "Build output {serial} has not passed all required tests"
msgstr ""
-#: build/models.py:1286
+#: build/models.py:1302
msgid "Build object"
msgstr "Bouw object"
-#: build/models.py:1300 build/models.py:1558 build/serializers.py:210
+#: build/models.py:1316 build/models.py:1574 build/serializers.py:210
#: build/serializers.py:247 build/templates/build/build_base.html:102
#: build/templates/build/detail.html:34 common/models.py:2432
#: order/models.py:1247 order/models.py:1902 order/serializers.py:1306
@@ -1310,7 +1310,7 @@ msgstr "Bouw object"
#: templates/js/translated/company.js:1808
#: templates/js/translated/model_renderers.js:230
#: templates/js/translated/order.js:304 templates/js/translated/part.js:961
-#: templates/js/translated/part.js:1811 templates/js/translated/part.js:3332
+#: templates/js/translated/part.js:1811 templates/js/translated/part.js:3341
#: templates/js/translated/pricing.js:381
#: templates/js/translated/pricing.js:474
#: templates/js/translated/pricing.js:522
@@ -1330,38 +1330,38 @@ msgstr "Bouw object"
msgid "Quantity"
msgstr "Hoeveelheid"
-#: build/models.py:1301
+#: build/models.py:1317
msgid "Required quantity for build order"
msgstr "Vereiste hoeveelheid voor bouwopdracht"
-#: build/models.py:1381
+#: build/models.py:1397
msgid "Build item must specify a build output, as master part is marked as trackable"
msgstr "Productieartikel moet een productieuitvoer specificeren, omdat het hoofdonderdeel gemarkeerd is als traceerbaar"
-#: build/models.py:1390
+#: build/models.py:1406
#, python-brace-format
msgid "Allocated quantity ({q}) must not exceed available stock quantity ({a})"
msgstr "Toegewezen hoeveelheid ({q}) mag de beschikbare voorraad ({a}) niet overschrijden"
-#: build/models.py:1400 order/models.py:1853
+#: build/models.py:1416 order/models.py:1853
msgid "Stock item is over-allocated"
msgstr "Voorraad item is te veel toegewezen"
-#: build/models.py:1406 order/models.py:1856
+#: build/models.py:1422 order/models.py:1856
msgid "Allocation quantity must be greater than zero"
msgstr "Toewijzing hoeveelheid moet groter zijn dan nul"
-#: build/models.py:1412
+#: build/models.py:1428
msgid "Quantity must be 1 for serialized stock"
msgstr "Hoeveelheid moet 1 zijn voor geserialiseerde voorraad"
-#: build/models.py:1473
+#: build/models.py:1489
msgid "Selected stock item does not match BOM line"
msgstr "Geselecteerde voorraadartikelen komen niet overeen met de BOM-regel"
-#: build/models.py:1545 build/serializers.py:811 order/serializers.py:1150
-#: order/serializers.py:1171 stock/serializers.py:544 stock/serializers.py:1019
-#: stock/serializers.py:1131 stock/templates/stock/item_base.html:10
+#: build/models.py:1561 build/serializers.py:811 order/serializers.py:1150
+#: order/serializers.py:1171 stock/serializers.py:544 stock/serializers.py:1025
+#: stock/serializers.py:1137 stock/templates/stock/item_base.html:10
#: stock/templates/stock/item_base.html:23
#: stock/templates/stock/item_base.html:194
#: templates/js/translated/build.js:1742
@@ -1376,19 +1376,19 @@ msgstr "Geselecteerde voorraadartikelen komen niet overeen met de BOM-regel"
msgid "Stock Item"
msgstr "Voorraadartikel"
-#: build/models.py:1546
+#: build/models.py:1562
msgid "Source stock item"
msgstr "Bron voorraadartikel"
-#: build/models.py:1559
+#: build/models.py:1575
msgid "Stock quantity to allocate to build"
msgstr "Voorraad hoeveelheid toe te wijzen aan productie"
-#: build/models.py:1567
+#: build/models.py:1583
msgid "Install into"
msgstr "Installeren in"
-#: build/models.py:1568
+#: build/models.py:1584
msgid "Destination stock item"
msgstr "Bestemming voorraadartikel"
@@ -1452,9 +1452,9 @@ msgid "A list of build outputs must be provided"
msgstr "Een lijst van productieuitvoeren moet worden verstrekt"
#: build/serializers.py:426 build/serializers.py:498 order/serializers.py:533
-#: order/serializers.py:641 order/serializers.py:1646 part/serializers.py:1086
+#: order/serializers.py:641 order/serializers.py:1646 part/serializers.py:1104
#: stock/serializers.py:472 stock/serializers.py:627 stock/serializers.py:723
-#: stock/serializers.py:1163 stock/serializers.py:1419
+#: stock/serializers.py:1169 stock/serializers.py:1425
#: stock/templates/stock/item_base.html:394
#: templates/js/translated/barcode.js:547
#: templates/js/translated/barcode.js:795 templates/js/translated/build.js:999
@@ -1494,7 +1494,7 @@ msgstr "Locatie van voltooide productieuitvoeren"
#: build/serializers.py:505 build/templates/build/build_base.html:151
#: build/templates/build/detail.html:62 order/models.py:910
#: order/models.py:2005 order/serializers.py:565 stock/admin.py:165
-#: stock/serializers.py:774 stock/serializers.py:1307
+#: stock/serializers.py:774 stock/serializers.py:1313
#: stock/templates/stock/item_base.html:427
#: templates/js/translated/barcode.js:252 templates/js/translated/build.js:2189
#: templates/js/translated/purchase_order.js:1308
@@ -1602,7 +1602,7 @@ msgstr "Bouw lijn-item"
msgid "bom_item.part must point to the same part as the build order"
msgstr "bom_item.part moet naar hetzelfde onderdeel wijzen als de productieorder"
-#: build/serializers.py:817 stock/serializers.py:1032
+#: build/serializers.py:817 stock/serializers.py:1038
msgid "Item must be in stock"
msgstr "Artikel moet op voorraad zijn"
@@ -1659,44 +1659,45 @@ msgstr "Optionele Items"
msgid "Allocate optional BOM items to build order"
msgstr "Alloceer optionele BOM items om bestelling te bouwen"
-#: build/serializers.py:1096 part/models.py:3895 part/models.py:4331
+#: build/serializers.py:1097 part/models.py:3895 part/models.py:4331
#: stock/api.py:745
msgid "BOM Item"
msgstr "Stuklijstartikel"
-#: build/serializers.py:1105 templates/js/translated/index.js:130
+#: build/serializers.py:1106 templates/js/translated/index.js:130
msgid "Allocated Stock"
msgstr ""
-#: build/serializers.py:1110 part/admin.py:132 part/bom.py:173
-#: part/serializers.py:1441 part/templates/part/part_base.html:210
-#: templates/js/translated/bom.js:1202 templates/js/translated/build.js:2614
-#: templates/js/translated/part.js:709 templates/js/translated/part.js:2148
+#: build/serializers.py:1111 part/admin.py:132 part/bom.py:173
+#: part/serializers.py:798 part/serializers.py:1460
+#: part/templates/part/part_base.html:210 templates/js/translated/bom.js:1208
+#: templates/js/translated/build.js:2614 templates/js/translated/part.js:709
+#: templates/js/translated/part.js:2148
#: templates/js/translated/table_filters.js:170
msgid "On Order"
msgstr "In bestelling"
-#: build/serializers.py:1115 part/serializers.py:1443
+#: build/serializers.py:1116 part/serializers.py:1462
#: templates/js/translated/build.js:2618
#: templates/js/translated/table_filters.js:360
msgid "In Production"
msgstr ""
-#: build/serializers.py:1120 part/bom.py:172 part/serializers.py:1454
+#: build/serializers.py:1121 part/bom.py:172 part/serializers.py:1473
#: part/templates/part/part_base.html:192
#: templates/js/translated/sales_order.js:1893
msgid "Available Stock"
msgstr "Beschikbare Voorraad"
-#: build/tasks.py:149
+#: build/tasks.py:171
msgid "Stock required for build order"
msgstr "Voorraad vereist voor productieorder"
-#: build/tasks.py:166
+#: build/tasks.py:188
msgid "Overdue Build Order"
msgstr "Achterstallige Productieorder"
-#: build/tasks.py:171
+#: build/tasks.py:193
#, python-brace-format
msgid "Build order {bo} is now overdue"
msgstr "Productieorder {bo} is nu achterstallig"
@@ -1990,27 +1991,31 @@ msgstr "Vereiste onderdelen bestellen"
msgid "Order Parts"
msgstr "Onderdelen bestellen"
-#: build/templates/build/detail.html:210
+#: build/templates/build/detail.html:205
+msgid "Available stock has been filtered based on specified source location for this build order"
+msgstr ""
+
+#: build/templates/build/detail.html:215
msgid "Incomplete Build Outputs"
msgstr "Onvolledige Productieuitvoeren"
-#: build/templates/build/detail.html:214
+#: build/templates/build/detail.html:219
msgid "Create new build output"
msgstr "Nieuwe productieuitvoer aanmaken"
-#: build/templates/build/detail.html:215
+#: build/templates/build/detail.html:220
msgid "New Build Output"
msgstr "Nieuwe Productieuitvoer"
-#: build/templates/build/detail.html:232 build/templates/build/sidebar.html:15
+#: build/templates/build/detail.html:237 build/templates/build/sidebar.html:15
msgid "Consumed Stock"
msgstr "Verbruikte voorraad"
-#: build/templates/build/detail.html:244
+#: build/templates/build/detail.html:249
msgid "Completed Build Outputs"
msgstr "Voltooide Productieuitvoeren"
-#: build/templates/build/detail.html:256 build/templates/build/sidebar.html:19
+#: build/templates/build/detail.html:261 build/templates/build/sidebar.html:19
#: company/templates/company/detail.html:229
#: company/templates/company/manufacturer_part.html:141
#: company/templates/company/manufacturer_part_sidebar.html:9
@@ -2026,15 +2031,15 @@ msgstr "Voltooide Productieuitvoeren"
msgid "Attachments"
msgstr "Bijlagen"
-#: build/templates/build/detail.html:271
+#: build/templates/build/detail.html:276
msgid "Build Notes"
msgstr "Productie notities"
-#: build/templates/build/detail.html:426
+#: build/templates/build/detail.html:434
msgid "Allocation Complete"
msgstr ""
-#: build/templates/build/detail.html:427
+#: build/templates/build/detail.html:435
msgid "All lines have been fully allocated"
msgstr ""
@@ -2436,7 +2441,7 @@ msgid "Parts are templates by default"
msgstr "Onderdelen zijn standaard sjablonen"
#: common/models.py:1456 part/admin.py:91 part/admin.py:431 part/models.py:1015
-#: templates/js/translated/bom.js:1633
+#: templates/js/translated/bom.js:1639
#: templates/js/translated/table_filters.js:330
#: templates/js/translated/table_filters.js:721
msgid "Assembly"
@@ -3495,7 +3500,7 @@ msgstr ""
msgid "Price break quantity"
msgstr ""
-#: common/models.py:2440 company/serializers.py:484 order/admin.py:42
+#: common/models.py:2440 company/serializers.py:486 order/admin.py:42
#: order/models.py:1321 order/models.py:2226
#: templates/js/translated/company.js:1813 templates/js/translated/part.js:1885
#: templates/js/translated/pricing.js:621
@@ -3972,7 +3977,7 @@ msgstr "Onderdeel selecteren"
#: company/models.py:495 company/templates/company/company_base.html:76
#: company/templates/company/manufacturer_part.html:90
-#: company/templates/company/supplier_part.html:145 part/serializers.py:497
+#: company/templates/company/supplier_part.html:145 part/serializers.py:505
#: stock/templates/stock/item_base.html:207
#: templates/js/translated/company.js:506
#: templates/js/translated/company.js:1108
@@ -3987,7 +3992,7 @@ msgid "Select manufacturer"
msgstr "Fabrikant selecteren"
#: company/models.py:502 company/templates/company/manufacturer_part.html:101
-#: company/templates/company/supplier_part.html:153 part/serializers.py:507
+#: company/templates/company/supplier_part.html:153 part/serializers.py:515
#: templates/js/translated/company.js:351
#: templates/js/translated/company.js:1107
#: templates/js/translated/company.js:1302
@@ -4059,7 +4064,7 @@ msgstr "Gekoppeld fabrikant onderdeel moet verwijzen naar hetzelfde basis onderd
#: company/models.py:795 company/templates/company/company_base.html:81
#: company/templates/company/supplier_part.html:129 order/models.py:453
#: order/templates/order/order_base.html:136 part/bom.py:272 part/bom.py:310
-#: part/serializers.py:481 plugin/builtin/suppliers/digikey.py:25
+#: part/serializers.py:489 plugin/builtin/suppliers/digikey.py:25
#: plugin/builtin/suppliers/lcsc.py:26 plugin/builtin/suppliers/mouser.py:24
#: plugin/builtin/suppliers/tme.py:26 stock/templates/stock/item_base.html:224
#: templates/email/overdue_purchase_order.html:16
@@ -4076,7 +4081,7 @@ msgstr "Leverancier"
msgid "Select supplier"
msgstr "Leverancier selecteren"
-#: company/models.py:802 part/serializers.py:492
+#: company/models.py:802 part/serializers.py:500
msgid "Supplier stock keeping unit"
msgstr ""
@@ -4112,7 +4117,7 @@ msgid "Minimum charge (e.g. stocking fee)"
msgstr "Minimale kosten (bijv. voorraadkosten)"
#: company/models.py:851 company/templates/company/supplier_part.html:160
-#: stock/admin.py:224 stock/models.py:785 stock/serializers.py:1317
+#: stock/admin.py:224 stock/models.py:785 stock/serializers.py:1323
#: stock/templates/stock/item_base.html:240
#: templates/js/translated/company.js:1636
#: templates/js/translated/stock.js:2387
@@ -4157,7 +4162,7 @@ msgstr ""
msgid "Date of last update of availability data"
msgstr ""
-#: company/serializers.py:153
+#: company/serializers.py:155
msgid "Default currency used for this supplier"
msgstr ""
@@ -4218,7 +4223,7 @@ msgstr ""
#: company/templates/company/company_base.html:86 order/models.py:898
#: order/models.py:1993 order/templates/order/return_order_base.html:131
#: order/templates/order/sales_order_base.html:144 stock/models.py:807
-#: stock/models.py:808 stock/serializers.py:1067
+#: stock/models.py:808 stock/serializers.py:1073
#: stock/templates/stock/item_base.html:405
#: templates/email/overdue_sales_order.html:16
#: templates/js/translated/company.js:502
@@ -4429,8 +4434,9 @@ msgstr "Geen fabrikanten informatie beschikbaar"
#: company/templates/company/manufacturer_part.html:119
#: company/templates/company/supplier_part.html:15 company/views.py:31
-#: part/admin.py:122 part/templates/part/part_sidebar.html:33
-#: templates/InvenTree/search.html:190 templates/navbar.html:48
+#: part/admin.py:122 part/serializers.py:802
+#: part/templates/part/part_sidebar.html:33 templates/InvenTree/search.html:190
+#: templates/navbar.html:48
msgid "Suppliers"
msgstr "Leveranciers"
@@ -4528,7 +4534,7 @@ msgid "No supplier information available"
msgstr "Geen leveranciersinformatie beschikbaar"
#: company/templates/company/supplier_part.html:139 part/bom.py:279
-#: part/bom.py:311 part/serializers.py:491
+#: part/bom.py:311 part/serializers.py:499
#: templates/js/translated/company.js:349 templates/js/translated/part.js:1786
#: templates/js/translated/pricing.js:510
#: templates/js/translated/purchase_order.js:1851
@@ -4577,10 +4583,12 @@ msgstr ""
msgid "Update Part Availability"
msgstr ""
-#: company/templates/company/supplier_part_sidebar.html:5 part/stocktake.py:223
+#: company/templates/company/supplier_part_sidebar.html:5
+#: part/serializers.py:801 part/stocktake.py:223
#: part/templates/part/category.html:183
#: part/templates/part/category_sidebar.html:17 stock/admin.py:69
-#: stock/serializers.py:760 stock/templates/stock/location.html:170
+#: stock/serializers.py:760 stock/serializers.py:924
+#: stock/templates/stock/location.html:170
#: stock/templates/stock/location.html:184
#: stock/templates/stock/location.html:196
#: stock/templates/stock/location_sidebar.html:7
@@ -4640,7 +4648,7 @@ msgid "Label template file"
msgstr "Label template bestand"
#: label/models.py:143 part/models.py:3484 report/models.py:322
-#: templates/js/translated/part.js:2891
+#: templates/js/translated/part.js:2900
#: templates/js/translated/table_filters.js:481
msgid "Enabled"
msgstr "Ingeschakeld"
@@ -5733,7 +5741,7 @@ msgid "Pending Shipments"
msgstr "Verzendingen in behandeling"
#: order/templates/order/sales_order_detail.html:71
-#: templates/js/translated/bom.js:1271 templates/js/translated/filters.js:296
+#: templates/js/translated/bom.js:1277 templates/js/translated/filters.js:296
msgid "Actions"
msgstr "Acties"
@@ -5861,10 +5869,10 @@ msgstr ""
msgid "Category Path"
msgstr ""
-#: part/admin.py:323 part/models.py:390 part/serializers.py:259
-#: part/serializers.py:373 part/templates/part/cat_link.html:3
-#: part/templates/part/category.html:23 part/templates/part/category.html:141
-#: part/templates/part/category.html:161
+#: part/admin.py:323 part/models.py:390 part/serializers.py:112
+#: part/serializers.py:265 part/serializers.py:381
+#: part/templates/part/cat_link.html:3 part/templates/part/category.html:23
+#: part/templates/part/category.html:141 part/templates/part/category.html:161
#: part/templates/part/category_sidebar.html:9
#: templates/InvenTree/index.html:36 templates/InvenTree/search.html:84
#: templates/InvenTree/settings/sidebar.html:47
@@ -5889,13 +5897,13 @@ msgstr ""
msgid "Part IPN"
msgstr ""
-#: part/admin.py:421 part/serializers.py:1220
+#: part/admin.py:421 part/serializers.py:1238
#: templates/js/translated/pricing.js:358
#: templates/js/translated/pricing.js:1024
msgid "Minimum Price"
msgstr ""
-#: part/admin.py:426 part/serializers.py:1235
+#: part/admin.py:426 part/serializers.py:1253
#: templates/js/translated/pricing.js:353
#: templates/js/translated/pricing.js:1032
msgid "Maximum Price"
@@ -5974,7 +5982,7 @@ msgid "This option must be selected"
msgstr ""
#: part/api.py:1541 part/models.py:895 part/models.py:3385 part/models.py:3831
-#: part/serializers.py:388 part/serializers.py:1076
+#: part/serializers.py:396 part/serializers.py:1094
#: part/templates/part/part_base.html:260 stock/api.py:733
#: templates/InvenTree/settings/settings_staff_js.html:300
#: templates/js/translated/notification.js:60
@@ -5982,12 +5990,17 @@ msgstr ""
msgid "Category"
msgstr ""
+#: part/api.py:1828
+msgid "Uses"
+msgstr ""
+
#: part/bom.py:170 part/models.py:100 part/models.py:938
#: part/templates/part/category.html:116 part/templates/part/part_base.html:367
msgid "Default Location"
msgstr "Standaard locatie"
-#: part/bom.py:171 templates/email/low_stock_notification.html:16
+#: part/bom.py:171 part/serializers.py:803
+#: templates/email/low_stock_notification.html:16
msgid "Total Stock"
msgstr "Totale Voorraad"
@@ -6010,7 +6023,8 @@ msgstr "Onderdeel Categorieën"
msgid "Default location for parts in this category"
msgstr "Standaard locatie voor onderdelen in deze categorie"
-#: part/models.py:106 stock/models.py:165 templates/js/translated/stock.js:2736
+#: part/models.py:106 stock/models.py:165 templates/js/translated/part.js:2810
+#: templates/js/translated/stock.js:2736
#: templates/js/translated/table_filters.js:239
#: templates/js/translated/table_filters.js:283
msgid "Structural"
@@ -6418,7 +6432,7 @@ msgstr ""
msgid "Test with this name already exists for this part"
msgstr ""
-#: part/models.py:3464 templates/js/translated/part.js:2870
+#: part/models.py:3464 templates/js/translated/part.js:2879
msgid "Test Name"
msgstr ""
@@ -6446,7 +6460,7 @@ msgstr ""
msgid "Is this test enabled?"
msgstr ""
-#: part/models.py:3489 templates/js/translated/part.js:2899
+#: part/models.py:3489 templates/js/translated/part.js:2908
#: templates/js/translated/table_filters.js:477
msgid "Required"
msgstr ""
@@ -6455,7 +6469,7 @@ msgstr ""
msgid "Is this test required to pass?"
msgstr ""
-#: part/models.py:3495 templates/js/translated/part.js:2907
+#: part/models.py:3495 templates/js/translated/part.js:2916
msgid "Requires Value"
msgstr ""
@@ -6463,7 +6477,7 @@ msgstr ""
msgid "Does this test require a value when adding a test result?"
msgstr ""
-#: part/models.py:3501 templates/js/translated/part.js:2914
+#: part/models.py:3501 templates/js/translated/part.js:2923
msgid "Requires Attachment"
msgstr ""
@@ -6685,311 +6699,329 @@ msgstr ""
msgid "Duplicate relationship already exists"
msgstr ""
-#: part/serializers.py:128 part/templates/part/category.html:122
-#: part/templates/part/category.html:207
+#: part/serializers.py:114 part/serializers.py:134
+#: part/templates/part/category.html:122 part/templates/part/category.html:207
#: part/templates/part/category_sidebar.html:7
msgid "Subcategories"
msgstr ""
-#: part/serializers.py:172
+#: part/serializers.py:178
msgid "Results"
msgstr ""
-#: part/serializers.py:173
+#: part/serializers.py:179
msgid "Number of results recorded against this template"
msgstr ""
-#: part/serializers.py:197 part/serializers.py:215 stock/serializers.py:384
+#: part/serializers.py:203 part/serializers.py:221 stock/serializers.py:384
msgid "Purchase currency of this stock item"
msgstr ""
-#: part/serializers.py:260
+#: part/serializers.py:266
msgid "Number of parts using this template"
msgstr ""
-#: part/serializers.py:379
+#: part/serializers.py:387
msgid "No parts selected"
msgstr "Geen onderdelen geselecteerd"
-#: part/serializers.py:389
+#: part/serializers.py:397
msgid "Select category"
msgstr ""
-#: part/serializers.py:419
+#: part/serializers.py:427
msgid "Original Part"
msgstr ""
-#: part/serializers.py:420
+#: part/serializers.py:428
msgid "Select original part to duplicate"
msgstr ""
-#: part/serializers.py:425
+#: part/serializers.py:433
msgid "Copy Image"
msgstr "Afbeelding kopiëren"
-#: part/serializers.py:426
+#: part/serializers.py:434
msgid "Copy image from original part"
msgstr "Afbeelding kopiëren van het oorspronkelijke onderdeel"
-#: part/serializers.py:432 part/templates/part/detail.html:277
+#: part/serializers.py:440 part/templates/part/detail.html:277
msgid "Copy BOM"
msgstr ""
-#: part/serializers.py:433
+#: part/serializers.py:441
msgid "Copy bill of materials from original part"
msgstr ""
-#: part/serializers.py:439
+#: part/serializers.py:447
msgid "Copy Parameters"
msgstr "Parameters kopiëren"
-#: part/serializers.py:440
+#: part/serializers.py:448
msgid "Copy parameter data from original part"
msgstr "Parameter data kopiëren van het originele onderdeel"
-#: part/serializers.py:446
+#: part/serializers.py:454
msgid "Copy Notes"
msgstr ""
-#: part/serializers.py:447
+#: part/serializers.py:455
msgid "Copy notes from original part"
msgstr ""
-#: part/serializers.py:460
+#: part/serializers.py:468
msgid "Initial Stock Quantity"
msgstr ""
-#: part/serializers.py:462
+#: part/serializers.py:470
msgid "Specify initial stock quantity for this Part. If quantity is zero, no stock is added."
msgstr ""
-#: part/serializers.py:469
+#: part/serializers.py:477
msgid "Initial Stock Location"
msgstr ""
-#: part/serializers.py:470
+#: part/serializers.py:478
msgid "Specify initial stock location for this Part"
msgstr ""
-#: part/serializers.py:482
+#: part/serializers.py:490
msgid "Select supplier (or leave blank to skip)"
msgstr ""
-#: part/serializers.py:498
+#: part/serializers.py:506
msgid "Select manufacturer (or leave blank to skip)"
msgstr ""
-#: part/serializers.py:508
+#: part/serializers.py:516
msgid "Manufacturer part number"
msgstr ""
-#: part/serializers.py:515
+#: part/serializers.py:523
msgid "Selected company is not a valid supplier"
msgstr ""
-#: part/serializers.py:524
+#: part/serializers.py:532
msgid "Selected company is not a valid manufacturer"
msgstr ""
-#: part/serializers.py:535
+#: part/serializers.py:543
msgid "Manufacturer part matching this MPN already exists"
msgstr ""
-#: part/serializers.py:542
+#: part/serializers.py:550
msgid "Supplier part matching this SKU already exists"
msgstr ""
-#: part/serializers.py:815 part/templates/part/copy_part.html:9
+#: part/serializers.py:804
+#, fuzzy
+#| msgid "External Link"
+msgid "External Stock"
+msgstr "Externe Link"
+
+#: part/serializers.py:806
+#, fuzzy
+#| msgid "Deallocate Stock"
+msgid "Unallocated Stock"
+msgstr "Voorraad niet meer toewijzen"
+
+#: part/serializers.py:808
+#, fuzzy
+#| msgid "Part Stocktake"
+msgid "Variant Stock"
+msgstr "Voorraadcontrole onderdeel"
+
+#: part/serializers.py:833 part/templates/part/copy_part.html:9
#: templates/js/translated/part.js:471
msgid "Duplicate Part"
msgstr ""
-#: part/serializers.py:816
+#: part/serializers.py:834
msgid "Copy initial data from another Part"
msgstr ""
-#: part/serializers.py:822 templates/js/translated/part.js:102
+#: part/serializers.py:840 templates/js/translated/part.js:102
msgid "Initial Stock"
msgstr ""
-#: part/serializers.py:823
+#: part/serializers.py:841
msgid "Create Part with initial stock quantity"
msgstr ""
-#: part/serializers.py:829
+#: part/serializers.py:847
msgid "Supplier Information"
msgstr ""
-#: part/serializers.py:830
+#: part/serializers.py:848
msgid "Add initial supplier information for this part"
msgstr ""
-#: part/serializers.py:838
+#: part/serializers.py:856
msgid "Copy Category Parameters"
msgstr ""
-#: part/serializers.py:839
+#: part/serializers.py:857
msgid "Copy parameter templates from selected part category"
msgstr ""
-#: part/serializers.py:844
+#: part/serializers.py:862
msgid "Existing Image"
msgstr ""
-#: part/serializers.py:845
+#: part/serializers.py:863
msgid "Filename of an existing part image"
msgstr ""
-#: part/serializers.py:862
+#: part/serializers.py:880
msgid "Image file does not exist"
msgstr ""
-#: part/serializers.py:1068
+#: part/serializers.py:1086
msgid "Limit stocktake report to a particular part, and any variant parts"
msgstr ""
-#: part/serializers.py:1078
+#: part/serializers.py:1096
msgid "Limit stocktake report to a particular part category, and any child categories"
msgstr ""
-#: part/serializers.py:1088
+#: part/serializers.py:1106
msgid "Limit stocktake report to a particular stock location, and any child locations"
msgstr ""
-#: part/serializers.py:1094
+#: part/serializers.py:1112
msgid "Exclude External Stock"
msgstr ""
-#: part/serializers.py:1095
+#: part/serializers.py:1113
msgid "Exclude stock items in external locations"
msgstr ""
-#: part/serializers.py:1100
+#: part/serializers.py:1118
msgid "Generate Report"
msgstr ""
-#: part/serializers.py:1101
+#: part/serializers.py:1119
msgid "Generate report file containing calculated stocktake data"
msgstr ""
-#: part/serializers.py:1106
+#: part/serializers.py:1124
msgid "Update Parts"
msgstr ""
-#: part/serializers.py:1107
+#: part/serializers.py:1125
msgid "Update specified parts with calculated stocktake data"
msgstr ""
-#: part/serializers.py:1115
+#: part/serializers.py:1133
msgid "Stocktake functionality is not enabled"
msgstr ""
-#: part/serializers.py:1221
+#: part/serializers.py:1239
msgid "Override calculated value for minimum price"
msgstr ""
-#: part/serializers.py:1228
+#: part/serializers.py:1246
msgid "Minimum price currency"
msgstr ""
-#: part/serializers.py:1236
+#: part/serializers.py:1254
msgid "Override calculated value for maximum price"
msgstr ""
-#: part/serializers.py:1243
+#: part/serializers.py:1261
msgid "Maximum price currency"
msgstr ""
-#: part/serializers.py:1272
+#: part/serializers.py:1290
msgid "Update"
msgstr ""
-#: part/serializers.py:1273
+#: part/serializers.py:1291
msgid "Update pricing for this part"
msgstr ""
-#: part/serializers.py:1296
+#: part/serializers.py:1314
#, python-brace-format
msgid "Could not convert from provided currencies to {default_currency}"
msgstr ""
-#: part/serializers.py:1303
+#: part/serializers.py:1321
msgid "Minimum price must not be greater than maximum price"
msgstr ""
-#: part/serializers.py:1306
+#: part/serializers.py:1324
msgid "Maximum price must not be less than minimum price"
msgstr ""
-#: part/serializers.py:1632
+#: part/serializers.py:1660
msgid "Select part to copy BOM from"
msgstr ""
-#: part/serializers.py:1640
+#: part/serializers.py:1668
msgid "Remove Existing Data"
msgstr ""
-#: part/serializers.py:1641
+#: part/serializers.py:1669
msgid "Remove existing BOM items before copying"
msgstr ""
-#: part/serializers.py:1646
+#: part/serializers.py:1674
msgid "Include Inherited"
msgstr ""
-#: part/serializers.py:1647
+#: part/serializers.py:1675
msgid "Include BOM items which are inherited from templated parts"
msgstr ""
-#: part/serializers.py:1652
+#: part/serializers.py:1680
msgid "Skip Invalid Rows"
msgstr ""
-#: part/serializers.py:1653
+#: part/serializers.py:1681
msgid "Enable this option to skip invalid rows"
msgstr ""
-#: part/serializers.py:1658
+#: part/serializers.py:1686
msgid "Copy Substitute Parts"
msgstr ""
-#: part/serializers.py:1659
+#: part/serializers.py:1687
msgid "Copy substitute parts when duplicate BOM items"
msgstr ""
-#: part/serializers.py:1693
+#: part/serializers.py:1721
msgid "Clear Existing BOM"
msgstr ""
-#: part/serializers.py:1694
+#: part/serializers.py:1722
msgid "Delete existing BOM items before uploading"
msgstr ""
-#: part/serializers.py:1724
+#: part/serializers.py:1752
msgid "No part column specified"
msgstr ""
-#: part/serializers.py:1768
+#: part/serializers.py:1796
msgid "Multiple matching parts found"
msgstr ""
-#: part/serializers.py:1771
+#: part/serializers.py:1799
msgid "No matching part found"
msgstr ""
-#: part/serializers.py:1774
+#: part/serializers.py:1802
msgid "Part is not designated as a component"
msgstr ""
-#: part/serializers.py:1783
+#: part/serializers.py:1811
msgid "Quantity not provided"
msgstr ""
-#: part/serializers.py:1791
+#: part/serializers.py:1819
msgid "Invalid quantity"
msgstr "Ongeldige hoeveelheid"
-#: part/serializers.py:1812
+#: part/serializers.py:1840
msgid "At least one BOM item is required"
msgstr ""
@@ -7221,7 +7253,7 @@ msgid "Validate BOM"
msgstr ""
#: part/templates/part/detail.html:283 part/templates/part/detail.html:284
-#: templates/js/translated/bom.js:1314 templates/js/translated/bom.js:1315
+#: templates/js/translated/bom.js:1320 templates/js/translated/bom.js:1321
msgid "Add BOM Item"
msgstr ""
@@ -7405,7 +7437,7 @@ msgstr "Toegewezen aan Productieorder"
msgid "Allocated to Sales Orders"
msgstr "Toegewezen aan verkooporders"
-#: part/templates/part/part_base.html:235 templates/js/translated/bom.js:1213
+#: part/templates/part/part_base.html:235 templates/js/translated/bom.js:1219
msgid "Can Build"
msgstr ""
@@ -8784,7 +8816,7 @@ msgstr ""
msgid "Where is this stock item located?"
msgstr ""
-#: stock/models.py:786 stock/serializers.py:1318
+#: stock/models.py:786 stock/serializers.py:1324
msgid "Packaging this stock item is stored in"
msgstr ""
@@ -8796,7 +8828,7 @@ msgstr ""
msgid "Serial number for this item"
msgstr ""
-#: stock/models.py:830 stock/serializers.py:1301
+#: stock/models.py:830 stock/serializers.py:1307
msgid "Batch code for this stock item"
msgstr ""
@@ -8905,7 +8937,7 @@ msgstr ""
msgid "Serialized stock cannot be merged"
msgstr ""
-#: stock/models.py:1639 stock/serializers.py:1207
+#: stock/models.py:1639 stock/serializers.py:1213
msgid "Duplicate stock items"
msgstr ""
@@ -8986,7 +9018,7 @@ msgstr ""
msgid "Enter serial numbers for new items"
msgstr ""
-#: stock/serializers.py:473 stock/serializers.py:1164 stock/serializers.py:1420
+#: stock/serializers.py:473 stock/serializers.py:1170 stock/serializers.py:1426
msgid "Destination stock location"
msgstr ""
@@ -9059,77 +9091,78 @@ msgstr ""
msgid "No stock items selected"
msgstr ""
-#: stock/serializers.py:863 stock/templates/stock/location.html:165
+#: stock/serializers.py:863 stock/serializers.py:926
+#: stock/templates/stock/location.html:165
#: stock/templates/stock/location.html:213
#: stock/templates/stock/location_sidebar.html:5
msgid "Sublocations"
msgstr "Sublocaties"
-#: stock/serializers.py:1036
+#: stock/serializers.py:1042
msgid "Part must be salable"
msgstr ""
-#: stock/serializers.py:1040
+#: stock/serializers.py:1046
msgid "Item is allocated to a sales order"
msgstr "Artikel is toegewezen aan een verkooporder"
-#: stock/serializers.py:1044
+#: stock/serializers.py:1050
msgid "Item is allocated to a build order"
msgstr "Artikel is toegewezen aan een productieorder"
-#: stock/serializers.py:1068
+#: stock/serializers.py:1074
msgid "Customer to assign stock items"
msgstr ""
-#: stock/serializers.py:1074
+#: stock/serializers.py:1080
msgid "Selected company is not a customer"
msgstr ""
-#: stock/serializers.py:1082
+#: stock/serializers.py:1088
msgid "Stock assignment notes"
msgstr ""
-#: stock/serializers.py:1092 stock/serializers.py:1346
+#: stock/serializers.py:1098 stock/serializers.py:1352
msgid "A list of stock items must be provided"
msgstr ""
-#: stock/serializers.py:1171
+#: stock/serializers.py:1177
msgid "Stock merging notes"
msgstr ""
-#: stock/serializers.py:1176
+#: stock/serializers.py:1182
msgid "Allow mismatched suppliers"
msgstr ""
-#: stock/serializers.py:1177
+#: stock/serializers.py:1183
msgid "Allow stock items with different supplier parts to be merged"
msgstr ""
-#: stock/serializers.py:1182
+#: stock/serializers.py:1188
msgid "Allow mismatched status"
msgstr ""
-#: stock/serializers.py:1183
+#: stock/serializers.py:1189
msgid "Allow stock items with different status codes to be merged"
msgstr ""
-#: stock/serializers.py:1193
+#: stock/serializers.py:1199
msgid "At least two stock items must be provided"
msgstr ""
-#: stock/serializers.py:1260
+#: stock/serializers.py:1266
msgid "No Change"
msgstr ""
-#: stock/serializers.py:1289
+#: stock/serializers.py:1295
msgid "StockItem primary key value"
msgstr ""
-#: stock/serializers.py:1308
+#: stock/serializers.py:1314
msgid "Stock item status code"
msgstr ""
-#: stock/serializers.py:1336
+#: stock/serializers.py:1342
msgid "Stock transaction notes"
msgstr ""
@@ -10662,7 +10695,7 @@ msgid "The following parts are low on required stock"
msgstr "De volgende onderdelen hebben een lage vereiste voorraad"
#: templates/email/build_order_required_stock.html:18
-#: templates/js/translated/bom.js:1668 templates/js/translated/build.js:2557
+#: templates/js/translated/bom.js:1674 templates/js/translated/build.js:2557
msgid "Required Quantity"
msgstr "Vereiste Hoeveelheid"
@@ -10676,7 +10709,7 @@ msgid "Click on the following link to view this part"
msgstr ""
#: templates/email/low_stock_notification.html:18
-#: templates/js/translated/part.js:3209
+#: templates/js/translated/part.js:3218
msgid "Minimum Quantity"
msgstr ""
@@ -11051,62 +11084,68 @@ msgstr ""
msgid "No pricing available"
msgstr ""
-#: templates/js/translated/bom.js:1182 templates/js/translated/build.js:2596
+#: templates/js/translated/bom.js:1184 templates/js/translated/build.js:2622
+#, fuzzy
+#| msgid "External Link"
+msgid "External stock"
+msgstr "Externe Link"
+
+#: templates/js/translated/bom.js:1188 templates/js/translated/build.js:2596
#: templates/js/translated/sales_order.js:1910
msgid "No Stock Available"
msgstr ""
-#: templates/js/translated/bom.js:1187 templates/js/translated/build.js:2600
+#: templates/js/translated/bom.js:1193 templates/js/translated/build.js:2600
msgid "Includes variant and substitute stock"
msgstr ""
-#: templates/js/translated/bom.js:1189 templates/js/translated/build.js:2602
+#: templates/js/translated/bom.js:1195 templates/js/translated/build.js:2602
#: templates/js/translated/part.js:1256
#: templates/js/translated/sales_order.js:1907
msgid "Includes variant stock"
msgstr ""
-#: templates/js/translated/bom.js:1191 templates/js/translated/build.js:2604
+#: templates/js/translated/bom.js:1197 templates/js/translated/build.js:2604
msgid "Includes substitute stock"
msgstr ""
-#: templates/js/translated/bom.js:1219 templates/js/translated/build.js:2587
+#: templates/js/translated/bom.js:1225 templates/js/translated/build.js:2587
msgid "Consumable item"
msgstr ""
-#: templates/js/translated/bom.js:1279
+#: templates/js/translated/bom.js:1285
msgid "Validate BOM Item"
msgstr ""
-#: templates/js/translated/bom.js:1281
+#: templates/js/translated/bom.js:1287
msgid "This line has been validated"
msgstr ""
-#: templates/js/translated/bom.js:1283
+#: templates/js/translated/bom.js:1289
msgid "Edit substitute parts"
msgstr ""
-#: templates/js/translated/bom.js:1285 templates/js/translated/bom.js:1480
+#: templates/js/translated/bom.js:1291 templates/js/translated/bom.js:1486
msgid "Edit BOM Item"
msgstr ""
-#: templates/js/translated/bom.js:1287
+#: templates/js/translated/bom.js:1293
msgid "Delete BOM Item"
msgstr ""
-#: templates/js/translated/bom.js:1307
+#: templates/js/translated/bom.js:1313
msgid "View BOM"
msgstr ""
-#: templates/js/translated/bom.js:1391
+#: templates/js/translated/bom.js:1397
msgid "No BOM items found"
msgstr ""
-#: templates/js/translated/bom.js:1651 templates/js/translated/build.js:2486
+#: templates/js/translated/bom.js:1657 templates/js/translated/build.js:2486
msgid "Required Part"
msgstr ""
-#: templates/js/translated/bom.js:1677
+#: templates/js/translated/bom.js:1683
msgid "Inherited from parent BOM"
msgstr ""
@@ -11449,29 +11488,29 @@ msgstr ""
msgid "Sufficient stock available"
msgstr ""
-#: templates/js/translated/build.js:2643
+#: templates/js/translated/build.js:2647
msgid "Consumable Item"
msgstr ""
-#: templates/js/translated/build.js:2648
+#: templates/js/translated/build.js:2652
msgid "Tracked item"
msgstr ""
-#: templates/js/translated/build.js:2655
+#: templates/js/translated/build.js:2659
#: templates/js/translated/sales_order.js:2016
msgid "Build stock"
msgstr ""
-#: templates/js/translated/build.js:2660 templates/js/translated/stock.js:1829
+#: templates/js/translated/build.js:2664 templates/js/translated/stock.js:1829
msgid "Order stock"
msgstr ""
-#: templates/js/translated/build.js:2664
+#: templates/js/translated/build.js:2668
#: templates/js/translated/sales_order.js:2010
msgid "Allocate stock"
msgstr ""
-#: templates/js/translated/build.js:2668
+#: templates/js/translated/build.js:2672
msgid "Remove stock allocation"
msgstr ""
@@ -12313,64 +12352,64 @@ msgstr ""
msgid "Subscribed category"
msgstr ""
-#: templates/js/translated/part.js:2855
+#: templates/js/translated/part.js:2864
msgid "No test templates matching query"
msgstr ""
-#: templates/js/translated/part.js:2877 templates/js/translated/search.js:342
+#: templates/js/translated/part.js:2886 templates/js/translated/search.js:342
msgid "results"
msgstr ""
-#: templates/js/translated/part.js:2927 templates/js/translated/stock.js:1446
+#: templates/js/translated/part.js:2936 templates/js/translated/stock.js:1446
msgid "Edit test result"
msgstr ""
-#: templates/js/translated/part.js:2928 templates/js/translated/stock.js:1447
+#: templates/js/translated/part.js:2937 templates/js/translated/stock.js:1447
#: templates/js/translated/stock.js:1692
msgid "Delete test result"
msgstr ""
-#: templates/js/translated/part.js:2932
+#: templates/js/translated/part.js:2941
msgid "This test is defined for a parent part"
msgstr ""
-#: templates/js/translated/part.js:2948
+#: templates/js/translated/part.js:2957
msgid "Edit Test Result Template"
msgstr ""
-#: templates/js/translated/part.js:2962
+#: templates/js/translated/part.js:2971
msgid "Delete Test Result Template"
msgstr ""
-#: templates/js/translated/part.js:3041 templates/js/translated/part.js:3042
+#: templates/js/translated/part.js:3050 templates/js/translated/part.js:3051
msgid "No date specified"
msgstr ""
-#: templates/js/translated/part.js:3044
+#: templates/js/translated/part.js:3053
msgid "Specified date is in the past"
msgstr ""
-#: templates/js/translated/part.js:3050
+#: templates/js/translated/part.js:3059
msgid "Speculative"
msgstr ""
-#: templates/js/translated/part.js:3100
+#: templates/js/translated/part.js:3109
msgid "No scheduling information available for this part"
msgstr ""
-#: templates/js/translated/part.js:3106
+#: templates/js/translated/part.js:3115
msgid "Error fetching scheduling information for this part"
msgstr ""
-#: templates/js/translated/part.js:3202
+#: templates/js/translated/part.js:3211
msgid "Scheduled Stock Quantities"
msgstr ""
-#: templates/js/translated/part.js:3218
+#: templates/js/translated/part.js:3227
msgid "Maximum Quantity"
msgstr ""
-#: templates/js/translated/part.js:3263
+#: templates/js/translated/part.js:3272
msgid "Minimum Stock Level"
msgstr ""
@@ -14052,4 +14091,3 @@ msgstr ""
#: users/models.py:413
msgid "Permission to delete items"
msgstr ""
-
diff --git a/InvenTree/locale/no/LC_MESSAGES/django.po b/InvenTree/locale/no/LC_MESSAGES/django.po
index f455cfd926..a21d14eb30 100644
--- a/InvenTree/locale/no/LC_MESSAGES/django.po
+++ b/InvenTree/locale/no/LC_MESSAGES/django.po
@@ -2,7 +2,7 @@ msgid ""
msgstr ""
"Project-Id-Version: inventree\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2024-02-28 04:05+0000\n"
+"POT-Creation-Date: 2024-03-05 00:41+0000\n"
"PO-Revision-Date: 2024-02-28 07:23\n"
"Last-Translator: \n"
"Language-Team: Norwegian\n"
@@ -66,9 +66,9 @@ msgstr "Oppgi dato"
#: report/templates/report/inventree_build_order_base.html:172
#: stock/admin.py:226 stock/models.py:2335 stock/models.py:2451
#: stock/serializers.py:479 stock/serializers.py:632 stock/serializers.py:728
-#: stock/serializers.py:778 stock/serializers.py:1081 stock/serializers.py:1170
-#: stock/serializers.py:1335 stock/templates/stock/stock_sidebar.html:25
-#: templates/js/translated/barcode.js:143 templates/js/translated/bom.js:1259
+#: stock/serializers.py:778 stock/serializers.py:1087 stock/serializers.py:1176
+#: stock/serializers.py:1341 stock/templates/stock/stock_sidebar.html:25
+#: templates/js/translated/barcode.js:143 templates/js/translated/bom.js:1265
#: templates/js/translated/company.js:1674 templates/js/translated/order.js:347
#: templates/js/translated/part.js:1080
#: templates/js/translated/purchase_order.js:2201
@@ -523,7 +523,7 @@ msgstr "Navn"
#: templates/js/translated/order.js:298 templates/js/translated/part.js:1238
#: templates/js/translated/part.js:1483 templates/js/translated/part.js:1621
#: templates/js/translated/part.js:1958 templates/js/translated/part.js:2355
-#: templates/js/translated/part.js:2785 templates/js/translated/part.js:2887
+#: templates/js/translated/part.js:2785 templates/js/translated/part.js:2896
#: templates/js/translated/plugin.js:80
#: templates/js/translated/purchase_order.js:1707
#: templates/js/translated/purchase_order.js:1850
@@ -678,7 +678,7 @@ msgstr "URLtil ekstern bildefil"
msgid "Downloading images from remote URL is not enabled"
msgstr "Nedlasting av bilder fra ekstern URL er ikke aktivert"
-#: InvenTree/status.py:66 part/serializers.py:1120
+#: InvenTree/status.py:66 part/serializers.py:1138
msgid "Background worker check failed"
msgstr "Sjekk av bakgrunnsarbeider mislyktes"
@@ -960,7 +960,7 @@ msgid "Tracked"
msgstr "Spores"
#: build/api.py:285 part/admin.py:144 templates/js/translated/build.js:1741
-#: templates/js/translated/build.js:2626
+#: templates/js/translated/build.js:2630
#: templates/js/translated/sales_order.js:1929
#: templates/js/translated/table_filters.js:571
msgid "Allocated"
@@ -1044,11 +1044,11 @@ msgstr "Produksjonsordre som denne produksjonen er tildelt"
#: build/models.py:199 build/templates/build/build_base.html:97
#: build/templates/build/detail.html:29 company/models.py:1044
#: order/models.py:1389 order/models.py:1532 order/models.py:1533
-#: part/api.py:1528 part/models.py:389 part/models.py:3003 part/models.py:3147
-#: part/models.py:3291 part/models.py:3314 part/models.py:3335
-#: part/models.py:3357 part/models.py:3458 part/models.py:3754
-#: part/models.py:3885 part/models.py:3978 part/models.py:4339
-#: part/serializers.py:1066 part/serializers.py:1631
+#: part/api.py:1528 part/api.py:1820 part/models.py:389 part/models.py:3003
+#: part/models.py:3147 part/models.py:3291 part/models.py:3314
+#: part/models.py:3335 part/models.py:3357 part/models.py:3458
+#: part/models.py:3754 part/models.py:3885 part/models.py:3978
+#: part/models.py:4339 part/serializers.py:1084 part/serializers.py:1659
#: part/templates/part/part_app_base.html:8
#: part/templates/part/part_pricing.html:12
#: part/templates/part/upload_bom.html:52
@@ -1147,7 +1147,7 @@ msgid "Build status code"
msgstr "Produksjonsstatuskode"
#: build/models.py:264 build/serializers.py:280 order/serializers.py:549
-#: stock/models.py:826 stock/serializers.py:1300
+#: stock/models.py:826 stock/serializers.py:1306
#: templates/js/translated/purchase_order.js:1129
msgid "Batch Code"
msgstr "Batchkode"
@@ -1242,48 +1242,48 @@ msgstr "Prosjektkode"
msgid "Project code for this build order"
msgstr "Prosjektkode for denne produksjonsordren"
-#: build/models.py:559
+#: build/models.py:575
#, python-brace-format
msgid "Build order {build} has been completed"
msgstr "Produksjonsordre {build} er fullført"
-#: build/models.py:565
+#: build/models.py:581
msgid "A build order has been completed"
msgstr "En produksjonsordre er fullført"
-#: build/models.py:783 build/models.py:858
+#: build/models.py:799 build/models.py:874
msgid "No build output specified"
msgstr "Ingen produksjonsartikkel spesifisert"
-#: build/models.py:786
+#: build/models.py:802
msgid "Build output is already completed"
msgstr "Produksjonsartikkelen er allerede fullført"
-#: build/models.py:789
+#: build/models.py:805
msgid "Build output does not match Build Order"
msgstr "Produksjonsartikkelen samsvarer ikke med produksjonsordren"
-#: build/models.py:862 build/serializers.py:223 build/serializers.py:262
+#: build/models.py:878 build/serializers.py:223 build/serializers.py:262
#: build/serializers.py:831 order/models.py:526 order/serializers.py:401
-#: order/serializers.py:544 part/serializers.py:1423 part/serializers.py:1789
+#: order/serializers.py:544 part/serializers.py:1442 part/serializers.py:1817
#: stock/models.py:665 stock/models.py:1477 stock/serializers.py:450
msgid "Quantity must be greater than zero"
msgstr "Mengden må være større enn null"
-#: build/models.py:867 build/serializers.py:228
+#: build/models.py:883 build/serializers.py:228
msgid "Quantity cannot be greater than the output quantity"
msgstr "Kvantitet kan ikke være større enn utgangsantallet"
-#: build/models.py:924 build/serializers.py:533
+#: build/models.py:940 build/serializers.py:533
#, python-brace-format
msgid "Build output {serial} has not passed all required tests"
msgstr ""
-#: build/models.py:1286
+#: build/models.py:1302
msgid "Build object"
msgstr "Produksjonsobjekt"
-#: build/models.py:1300 build/models.py:1558 build/serializers.py:210
+#: build/models.py:1316 build/models.py:1574 build/serializers.py:210
#: build/serializers.py:247 build/templates/build/build_base.html:102
#: build/templates/build/detail.html:34 common/models.py:2432
#: order/models.py:1247 order/models.py:1902 order/serializers.py:1306
@@ -1310,7 +1310,7 @@ msgstr "Produksjonsobjekt"
#: templates/js/translated/company.js:1808
#: templates/js/translated/model_renderers.js:230
#: templates/js/translated/order.js:304 templates/js/translated/part.js:961
-#: templates/js/translated/part.js:1811 templates/js/translated/part.js:3332
+#: templates/js/translated/part.js:1811 templates/js/translated/part.js:3341
#: templates/js/translated/pricing.js:381
#: templates/js/translated/pricing.js:474
#: templates/js/translated/pricing.js:522
@@ -1330,38 +1330,38 @@ msgstr "Produksjonsobjekt"
msgid "Quantity"
msgstr "Antall"
-#: build/models.py:1301
+#: build/models.py:1317
msgid "Required quantity for build order"
msgstr "Påkrevd antall for produksjonsordre"
-#: build/models.py:1381
+#: build/models.py:1397
msgid "Build item must specify a build output, as master part is marked as trackable"
msgstr "Produksjonselement må spesifisere en produksjonsartikkel, da master-del er merket som sporbar"
-#: build/models.py:1390
+#: build/models.py:1406
#, python-brace-format
msgid "Allocated quantity ({q}) must not exceed available stock quantity ({a})"
msgstr "Tildelt antall ({q}) kan ikke overstige tilgjengelig lagerbeholdning ({a})"
-#: build/models.py:1400 order/models.py:1853
+#: build/models.py:1416 order/models.py:1853
msgid "Stock item is over-allocated"
msgstr "Lagervaren er overtildelt"
-#: build/models.py:1406 order/models.py:1856
+#: build/models.py:1422 order/models.py:1856
msgid "Allocation quantity must be greater than zero"
msgstr "Tildelingsantall må være større enn null"
-#: build/models.py:1412
+#: build/models.py:1428
msgid "Quantity must be 1 for serialized stock"
msgstr "Mengden må være 1 for serialisert lagervare"
-#: build/models.py:1473
+#: build/models.py:1489
msgid "Selected stock item does not match BOM line"
msgstr "Valgt lagervare samsvarer ikke med BOM-linjen"
-#: build/models.py:1545 build/serializers.py:811 order/serializers.py:1150
-#: order/serializers.py:1171 stock/serializers.py:544 stock/serializers.py:1019
-#: stock/serializers.py:1131 stock/templates/stock/item_base.html:10
+#: build/models.py:1561 build/serializers.py:811 order/serializers.py:1150
+#: order/serializers.py:1171 stock/serializers.py:544 stock/serializers.py:1025
+#: stock/serializers.py:1137 stock/templates/stock/item_base.html:10
#: stock/templates/stock/item_base.html:23
#: stock/templates/stock/item_base.html:194
#: templates/js/translated/build.js:1742
@@ -1376,19 +1376,19 @@ msgstr "Valgt lagervare samsvarer ikke med BOM-linjen"
msgid "Stock Item"
msgstr "Lagervare"
-#: build/models.py:1546
+#: build/models.py:1562
msgid "Source stock item"
msgstr "Kildelagervare"
-#: build/models.py:1559
+#: build/models.py:1575
msgid "Stock quantity to allocate to build"
msgstr "Lagerantall å tildele til produksjonen"
-#: build/models.py:1567
+#: build/models.py:1583
msgid "Install into"
msgstr "Monteres i"
-#: build/models.py:1568
+#: build/models.py:1584
msgid "Destination stock item"
msgstr "Lagervare for montering"
@@ -1452,9 +1452,9 @@ msgid "A list of build outputs must be provided"
msgstr "En liste over produksjonsartikler må oppgis"
#: build/serializers.py:426 build/serializers.py:498 order/serializers.py:533
-#: order/serializers.py:641 order/serializers.py:1646 part/serializers.py:1086
+#: order/serializers.py:641 order/serializers.py:1646 part/serializers.py:1104
#: stock/serializers.py:472 stock/serializers.py:627 stock/serializers.py:723
-#: stock/serializers.py:1163 stock/serializers.py:1419
+#: stock/serializers.py:1169 stock/serializers.py:1425
#: stock/templates/stock/item_base.html:394
#: templates/js/translated/barcode.js:547
#: templates/js/translated/barcode.js:795 templates/js/translated/build.js:999
@@ -1494,7 +1494,7 @@ msgstr "Plassering for ferdige produksjonsartikler"
#: build/serializers.py:505 build/templates/build/build_base.html:151
#: build/templates/build/detail.html:62 order/models.py:910
#: order/models.py:2005 order/serializers.py:565 stock/admin.py:165
-#: stock/serializers.py:774 stock/serializers.py:1307
+#: stock/serializers.py:774 stock/serializers.py:1313
#: stock/templates/stock/item_base.html:427
#: templates/js/translated/barcode.js:252 templates/js/translated/build.js:2189
#: templates/js/translated/purchase_order.js:1308
@@ -1602,7 +1602,7 @@ msgstr "Produksjonsartikkel"
msgid "bom_item.part must point to the same part as the build order"
msgstr "bom_item.part må peke på den samme delen som produksjonsordren"
-#: build/serializers.py:817 stock/serializers.py:1032
+#: build/serializers.py:817 stock/serializers.py:1038
msgid "Item must be in stock"
msgstr "Artikkelen må være på lager"
@@ -1659,44 +1659,45 @@ msgstr "Valgfrie artikler"
msgid "Allocate optional BOM items to build order"
msgstr "Tildel valgfrie BOM-artikler til produksjonsordre"
-#: build/serializers.py:1096 part/models.py:3895 part/models.py:4331
+#: build/serializers.py:1097 part/models.py:3895 part/models.py:4331
#: stock/api.py:745
msgid "BOM Item"
msgstr "BOM-artikkel"
-#: build/serializers.py:1105 templates/js/translated/index.js:130
+#: build/serializers.py:1106 templates/js/translated/index.js:130
msgid "Allocated Stock"
msgstr "Tildelt lagerbeholdning"
-#: build/serializers.py:1110 part/admin.py:132 part/bom.py:173
-#: part/serializers.py:1441 part/templates/part/part_base.html:210
-#: templates/js/translated/bom.js:1202 templates/js/translated/build.js:2614
-#: templates/js/translated/part.js:709 templates/js/translated/part.js:2148
+#: build/serializers.py:1111 part/admin.py:132 part/bom.py:173
+#: part/serializers.py:798 part/serializers.py:1460
+#: part/templates/part/part_base.html:210 templates/js/translated/bom.js:1208
+#: templates/js/translated/build.js:2614 templates/js/translated/part.js:709
+#: templates/js/translated/part.js:2148
#: templates/js/translated/table_filters.js:170
msgid "On Order"
msgstr "I bestilling"
-#: build/serializers.py:1115 part/serializers.py:1443
+#: build/serializers.py:1116 part/serializers.py:1462
#: templates/js/translated/build.js:2618
#: templates/js/translated/table_filters.js:360
msgid "In Production"
msgstr "I produksjon"
-#: build/serializers.py:1120 part/bom.py:172 part/serializers.py:1454
+#: build/serializers.py:1121 part/bom.py:172 part/serializers.py:1473
#: part/templates/part/part_base.html:192
#: templates/js/translated/sales_order.js:1893
msgid "Available Stock"
msgstr "Tilgjengelig lagerbeholdning"
-#: build/tasks.py:149
+#: build/tasks.py:171
msgid "Stock required for build order"
msgstr "Lagerbeholdning kreves for produksjonsordre"
-#: build/tasks.py:166
+#: build/tasks.py:188
msgid "Overdue Build Order"
msgstr "Forfalt produksjonsordre"
-#: build/tasks.py:171
+#: build/tasks.py:193
#, python-brace-format
msgid "Build order {bo} is now overdue"
msgstr "Produksjonsordre {bo} er nå forfalt"
@@ -1990,27 +1991,31 @@ msgstr "Bestill nødvendige deler"
msgid "Order Parts"
msgstr "Bestill deler"
-#: build/templates/build/detail.html:210
+#: build/templates/build/detail.html:205
+msgid "Available stock has been filtered based on specified source location for this build order"
+msgstr ""
+
+#: build/templates/build/detail.html:215
msgid "Incomplete Build Outputs"
msgstr "Ufullstendige Produksjonsartikler"
-#: build/templates/build/detail.html:214
+#: build/templates/build/detail.html:219
msgid "Create new build output"
msgstr "Opprett ny produksjonsartikkel"
-#: build/templates/build/detail.html:215
+#: build/templates/build/detail.html:220
msgid "New Build Output"
msgstr "Ny Produksjonsartikkel"
-#: build/templates/build/detail.html:232 build/templates/build/sidebar.html:15
+#: build/templates/build/detail.html:237 build/templates/build/sidebar.html:15
msgid "Consumed Stock"
msgstr "Brukt lagerbeholdning"
-#: build/templates/build/detail.html:244
+#: build/templates/build/detail.html:249
msgid "Completed Build Outputs"
msgstr "Fullførte produksjonsartikkel"
-#: build/templates/build/detail.html:256 build/templates/build/sidebar.html:19
+#: build/templates/build/detail.html:261 build/templates/build/sidebar.html:19
#: company/templates/company/detail.html:229
#: company/templates/company/manufacturer_part.html:141
#: company/templates/company/manufacturer_part_sidebar.html:9
@@ -2026,15 +2031,15 @@ msgstr "Fullførte produksjonsartikkel"
msgid "Attachments"
msgstr "Vedlegg"
-#: build/templates/build/detail.html:271
+#: build/templates/build/detail.html:276
msgid "Build Notes"
msgstr "Produksjonsnotater"
-#: build/templates/build/detail.html:426
+#: build/templates/build/detail.html:434
msgid "Allocation Complete"
msgstr "Tildeling fullført"
-#: build/templates/build/detail.html:427
+#: build/templates/build/detail.html:435
msgid "All lines have been fully allocated"
msgstr "Alle linjer er fullt tildelt"
@@ -2436,7 +2441,7 @@ msgid "Parts are templates by default"
msgstr "Deler er maler som standard"
#: common/models.py:1456 part/admin.py:91 part/admin.py:431 part/models.py:1015
-#: templates/js/translated/bom.js:1633
+#: templates/js/translated/bom.js:1639
#: templates/js/translated/table_filters.js:330
#: templates/js/translated/table_filters.js:721
msgid "Assembly"
@@ -3495,7 +3500,7 @@ msgstr ""
msgid "Price break quantity"
msgstr "Antall for prisbrudd"
-#: common/models.py:2440 company/serializers.py:484 order/admin.py:42
+#: common/models.py:2440 company/serializers.py:486 order/admin.py:42
#: order/models.py:1321 order/models.py:2226
#: templates/js/translated/company.js:1813 templates/js/translated/part.js:1885
#: templates/js/translated/pricing.js:621
@@ -3972,7 +3977,7 @@ msgstr "Velg del"
#: company/models.py:495 company/templates/company/company_base.html:76
#: company/templates/company/manufacturer_part.html:90
-#: company/templates/company/supplier_part.html:145 part/serializers.py:497
+#: company/templates/company/supplier_part.html:145 part/serializers.py:505
#: stock/templates/stock/item_base.html:207
#: templates/js/translated/company.js:506
#: templates/js/translated/company.js:1108
@@ -3987,7 +3992,7 @@ msgid "Select manufacturer"
msgstr "Velg produsent"
#: company/models.py:502 company/templates/company/manufacturer_part.html:101
-#: company/templates/company/supplier_part.html:153 part/serializers.py:507
+#: company/templates/company/supplier_part.html:153 part/serializers.py:515
#: templates/js/translated/company.js:351
#: templates/js/translated/company.js:1107
#: templates/js/translated/company.js:1302
@@ -4059,7 +4064,7 @@ msgstr "Den sammenkoblede produsentdelen må referere til samme basisdel"
#: company/models.py:795 company/templates/company/company_base.html:81
#: company/templates/company/supplier_part.html:129 order/models.py:453
#: order/templates/order/order_base.html:136 part/bom.py:272 part/bom.py:310
-#: part/serializers.py:481 plugin/builtin/suppliers/digikey.py:25
+#: part/serializers.py:489 plugin/builtin/suppliers/digikey.py:25
#: plugin/builtin/suppliers/lcsc.py:26 plugin/builtin/suppliers/mouser.py:24
#: plugin/builtin/suppliers/tme.py:26 stock/templates/stock/item_base.html:224
#: templates/email/overdue_purchase_order.html:16
@@ -4076,7 +4081,7 @@ msgstr "Leverandør"
msgid "Select supplier"
msgstr "Velg leverandør"
-#: company/models.py:802 part/serializers.py:492
+#: company/models.py:802 part/serializers.py:500
msgid "Supplier stock keeping unit"
msgstr "Leverandørens lagerbeholdningsenhet"
@@ -4112,7 +4117,7 @@ msgid "Minimum charge (e.g. stocking fee)"
msgstr "Minimum betaling (f.eks. lageravgift)"
#: company/models.py:851 company/templates/company/supplier_part.html:160
-#: stock/admin.py:224 stock/models.py:785 stock/serializers.py:1317
+#: stock/admin.py:224 stock/models.py:785 stock/serializers.py:1323
#: stock/templates/stock/item_base.html:240
#: templates/js/translated/company.js:1636
#: templates/js/translated/stock.js:2387
@@ -4157,7 +4162,7 @@ msgstr "Tilgjengelighet oppdatert"
msgid "Date of last update of availability data"
msgstr "Dato for siste oppdatering av tilgjengelighetsdata"
-#: company/serializers.py:153
+#: company/serializers.py:155
msgid "Default currency used for this supplier"
msgstr "Standardvaluta brukt for denne leverandøren"
@@ -4218,7 +4223,7 @@ msgstr "Slett bilde"
#: company/templates/company/company_base.html:86 order/models.py:898
#: order/models.py:1993 order/templates/order/return_order_base.html:131
#: order/templates/order/sales_order_base.html:144 stock/models.py:807
-#: stock/models.py:808 stock/serializers.py:1067
+#: stock/models.py:808 stock/serializers.py:1073
#: stock/templates/stock/item_base.html:405
#: templates/email/overdue_sales_order.html:16
#: templates/js/translated/company.js:502
@@ -4429,8 +4434,9 @@ msgstr "Ingen produsentinformasjon tilgjengelig"
#: company/templates/company/manufacturer_part.html:119
#: company/templates/company/supplier_part.html:15 company/views.py:31
-#: part/admin.py:122 part/templates/part/part_sidebar.html:33
-#: templates/InvenTree/search.html:190 templates/navbar.html:48
+#: part/admin.py:122 part/serializers.py:802
+#: part/templates/part/part_sidebar.html:33 templates/InvenTree/search.html:190
+#: templates/navbar.html:48
msgid "Suppliers"
msgstr "Leverandører"
@@ -4528,7 +4534,7 @@ msgid "No supplier information available"
msgstr "Ingen leverandørinformasjon tilgjengelig"
#: company/templates/company/supplier_part.html:139 part/bom.py:279
-#: part/bom.py:311 part/serializers.py:491
+#: part/bom.py:311 part/serializers.py:499
#: templates/js/translated/company.js:349 templates/js/translated/part.js:1786
#: templates/js/translated/pricing.js:510
#: templates/js/translated/purchase_order.js:1851
@@ -4577,10 +4583,12 @@ msgstr ""
msgid "Update Part Availability"
msgstr ""
-#: company/templates/company/supplier_part_sidebar.html:5 part/stocktake.py:223
+#: company/templates/company/supplier_part_sidebar.html:5
+#: part/serializers.py:801 part/stocktake.py:223
#: part/templates/part/category.html:183
#: part/templates/part/category_sidebar.html:17 stock/admin.py:69
-#: stock/serializers.py:760 stock/templates/stock/location.html:170
+#: stock/serializers.py:760 stock/serializers.py:924
+#: stock/templates/stock/location.html:170
#: stock/templates/stock/location.html:184
#: stock/templates/stock/location.html:196
#: stock/templates/stock/location_sidebar.html:7
@@ -4640,7 +4648,7 @@ msgid "Label template file"
msgstr "Etikett-malfil"
#: label/models.py:143 part/models.py:3484 report/models.py:322
-#: templates/js/translated/part.js:2891
+#: templates/js/translated/part.js:2900
#: templates/js/translated/table_filters.js:481
msgid "Enabled"
msgstr "Aktivert"
@@ -5733,7 +5741,7 @@ msgid "Pending Shipments"
msgstr "Ventende forsendelser"
#: order/templates/order/sales_order_detail.html:71
-#: templates/js/translated/bom.js:1271 templates/js/translated/filters.js:296
+#: templates/js/translated/bom.js:1277 templates/js/translated/filters.js:296
msgid "Actions"
msgstr "Handlinger"
@@ -5861,10 +5869,10 @@ msgstr "Overordnet navn"
msgid "Category Path"
msgstr "Sti til kategori"
-#: part/admin.py:323 part/models.py:390 part/serializers.py:259
-#: part/serializers.py:373 part/templates/part/cat_link.html:3
-#: part/templates/part/category.html:23 part/templates/part/category.html:141
-#: part/templates/part/category.html:161
+#: part/admin.py:323 part/models.py:390 part/serializers.py:112
+#: part/serializers.py:265 part/serializers.py:381
+#: part/templates/part/cat_link.html:3 part/templates/part/category.html:23
+#: part/templates/part/category.html:141 part/templates/part/category.html:161
#: part/templates/part/category_sidebar.html:9
#: templates/InvenTree/index.html:36 templates/InvenTree/search.html:84
#: templates/InvenTree/settings/sidebar.html:47
@@ -5889,13 +5897,13 @@ msgstr "Overodnet IPN"
msgid "Part IPN"
msgstr "Del -IPN"
-#: part/admin.py:421 part/serializers.py:1220
+#: part/admin.py:421 part/serializers.py:1238
#: templates/js/translated/pricing.js:358
#: templates/js/translated/pricing.js:1024
msgid "Minimum Price"
msgstr "Minstepris"
-#: part/admin.py:426 part/serializers.py:1235
+#: part/admin.py:426 part/serializers.py:1253
#: templates/js/translated/pricing.js:353
#: templates/js/translated/pricing.js:1032
msgid "Maximum Price"
@@ -5974,7 +5982,7 @@ msgid "This option must be selected"
msgstr "Dette alternativet må være valgt"
#: part/api.py:1541 part/models.py:895 part/models.py:3385 part/models.py:3831
-#: part/serializers.py:388 part/serializers.py:1076
+#: part/serializers.py:396 part/serializers.py:1094
#: part/templates/part/part_base.html:260 stock/api.py:733
#: templates/InvenTree/settings/settings_staff_js.html:300
#: templates/js/translated/notification.js:60
@@ -5982,12 +5990,17 @@ msgstr "Dette alternativet må være valgt"
msgid "Category"
msgstr "Kategori"
+#: part/api.py:1828
+msgid "Uses"
+msgstr ""
+
#: part/bom.py:170 part/models.py:100 part/models.py:938
#: part/templates/part/category.html:116 part/templates/part/part_base.html:367
msgid "Default Location"
msgstr "Standard plassering"
-#: part/bom.py:171 templates/email/low_stock_notification.html:16
+#: part/bom.py:171 part/serializers.py:803
+#: templates/email/low_stock_notification.html:16
msgid "Total Stock"
msgstr "Total lagerbeholdning"
@@ -6010,7 +6023,8 @@ msgstr "Delkategorier"
msgid "Default location for parts in this category"
msgstr "Standardplassering for deler i denne kategorien"
-#: part/models.py:106 stock/models.py:165 templates/js/translated/stock.js:2736
+#: part/models.py:106 stock/models.py:165 templates/js/translated/part.js:2810
+#: templates/js/translated/stock.js:2736
#: templates/js/translated/table_filters.js:239
#: templates/js/translated/table_filters.js:283
msgid "Structural"
@@ -6418,7 +6432,7 @@ msgstr "Testmaler kan bare bli opprettet for sporbare deler"
msgid "Test with this name already exists for this part"
msgstr "Test med dette navnet finnes allerede for denne delen"
-#: part/models.py:3464 templates/js/translated/part.js:2870
+#: part/models.py:3464 templates/js/translated/part.js:2879
msgid "Test Name"
msgstr "Testnavn"
@@ -6446,7 +6460,7 @@ msgstr "Legg inn beskrivelse for denne testen"
msgid "Is this test enabled?"
msgstr ""
-#: part/models.py:3489 templates/js/translated/part.js:2899
+#: part/models.py:3489 templates/js/translated/part.js:2908
#: templates/js/translated/table_filters.js:477
msgid "Required"
msgstr "Påkrevd"
@@ -6455,7 +6469,7 @@ msgstr "Påkrevd"
msgid "Is this test required to pass?"
msgstr "Er det påkrevd at denne testen bestås?"
-#: part/models.py:3495 templates/js/translated/part.js:2907
+#: part/models.py:3495 templates/js/translated/part.js:2916
msgid "Requires Value"
msgstr "Krever verdi"
@@ -6463,7 +6477,7 @@ msgstr "Krever verdi"
msgid "Does this test require a value when adding a test result?"
msgstr "Krever denne testen en verdi når det legges til et testresultat?"
-#: part/models.py:3501 templates/js/translated/part.js:2914
+#: part/models.py:3501 templates/js/translated/part.js:2923
msgid "Requires Attachment"
msgstr "Krever vedlegg"
@@ -6685,311 +6699,329 @@ msgstr "Del-forhold kan ikke opprettes mellom en del og seg selv"
msgid "Duplicate relationship already exists"
msgstr "Duplikatforhold eksisterer allerede"
-#: part/serializers.py:128 part/templates/part/category.html:122
-#: part/templates/part/category.html:207
+#: part/serializers.py:114 part/serializers.py:134
+#: part/templates/part/category.html:122 part/templates/part/category.html:207
#: part/templates/part/category_sidebar.html:7
msgid "Subcategories"
msgstr "Underkategorier"
-#: part/serializers.py:172
+#: part/serializers.py:178
msgid "Results"
msgstr ""
-#: part/serializers.py:173
+#: part/serializers.py:179
msgid "Number of results recorded against this template"
msgstr ""
-#: part/serializers.py:197 part/serializers.py:215 stock/serializers.py:384
+#: part/serializers.py:203 part/serializers.py:221 stock/serializers.py:384
msgid "Purchase currency of this stock item"
msgstr "Innkjøpsvaluta for lagervaren"
-#: part/serializers.py:260
+#: part/serializers.py:266
msgid "Number of parts using this template"
msgstr ""
-#: part/serializers.py:379
+#: part/serializers.py:387
msgid "No parts selected"
msgstr "Ingen deler valgt"
-#: part/serializers.py:389
+#: part/serializers.py:397
msgid "Select category"
msgstr "Velg kategori"
-#: part/serializers.py:419
+#: part/serializers.py:427
msgid "Original Part"
msgstr "Original Del"
-#: part/serializers.py:420
+#: part/serializers.py:428
msgid "Select original part to duplicate"
msgstr "Velg original del å duplisere"
-#: part/serializers.py:425
+#: part/serializers.py:433
msgid "Copy Image"
msgstr "Kopier Bilde"
-#: part/serializers.py:426
+#: part/serializers.py:434
msgid "Copy image from original part"
msgstr "Kopier bilde fra originaldel"
-#: part/serializers.py:432 part/templates/part/detail.html:277
+#: part/serializers.py:440 part/templates/part/detail.html:277
msgid "Copy BOM"
msgstr "Kopier Stykkliste"
-#: part/serializers.py:433
+#: part/serializers.py:441
msgid "Copy bill of materials from original part"
msgstr "Kopier stykkliste fra original del"
-#: part/serializers.py:439
+#: part/serializers.py:447
msgid "Copy Parameters"
msgstr "Kopier parametere"
-#: part/serializers.py:440
+#: part/serializers.py:448
msgid "Copy parameter data from original part"
msgstr "Kopier parameterdata fra originaldel"
-#: part/serializers.py:446
+#: part/serializers.py:454
msgid "Copy Notes"
msgstr "Kopier notater"
-#: part/serializers.py:447
+#: part/serializers.py:455
msgid "Copy notes from original part"
msgstr "Kopier notater fra originaldel"
-#: part/serializers.py:460
+#: part/serializers.py:468
msgid "Initial Stock Quantity"
msgstr "Innledende lagerbeholdning"
-#: part/serializers.py:462
+#: part/serializers.py:470
msgid "Specify initial stock quantity for this Part. If quantity is zero, no stock is added."
msgstr "Angi initiell lagermengde for denne delen. Hvis antall er null, er ingen lagerbeholdning lagt til."
-#: part/serializers.py:469
+#: part/serializers.py:477
msgid "Initial Stock Location"
msgstr "Innledende lagerplassering"
-#: part/serializers.py:470
+#: part/serializers.py:478
msgid "Specify initial stock location for this Part"
msgstr "Angi initiell lagerplasering for denne delen"
-#: part/serializers.py:482
+#: part/serializers.py:490
msgid "Select supplier (or leave blank to skip)"
msgstr "Velg leverandør (eller la stå tom for å hoppe over)"
-#: part/serializers.py:498
+#: part/serializers.py:506
msgid "Select manufacturer (or leave blank to skip)"
msgstr "Velg produsent (eller la stå tom for å hoppe over)"
-#: part/serializers.py:508
+#: part/serializers.py:516
msgid "Manufacturer part number"
msgstr "Produsentens delenummer"
-#: part/serializers.py:515
+#: part/serializers.py:523
msgid "Selected company is not a valid supplier"
msgstr "Valgt firma er ikke en gyldig leverandør"
-#: part/serializers.py:524
+#: part/serializers.py:532
msgid "Selected company is not a valid manufacturer"
msgstr "Valgt firma er ikke en gyldig produsent"
-#: part/serializers.py:535
+#: part/serializers.py:543
msgid "Manufacturer part matching this MPN already exists"
msgstr "Produsentdel som matcher dette MPN-et, finnes allerede"
-#: part/serializers.py:542
+#: part/serializers.py:550
msgid "Supplier part matching this SKU already exists"
msgstr "Leverandørdel som matcher denne SKU-en, finnes allerede"
-#: part/serializers.py:815 part/templates/part/copy_part.html:9
+#: part/serializers.py:804
+#, fuzzy
+#| msgid "Exclude External Stock"
+msgid "External Stock"
+msgstr "Ekskluder ekstern lagerbeholdning"
+
+#: part/serializers.py:806
+#, fuzzy
+#| msgid "Allocated Stock"
+msgid "Unallocated Stock"
+msgstr "Tildelt lagerbeholdning"
+
+#: part/serializers.py:808
+#, fuzzy
+#| msgid "Part Stock"
+msgid "Variant Stock"
+msgstr "Dellager"
+
+#: part/serializers.py:833 part/templates/part/copy_part.html:9
#: templates/js/translated/part.js:471
msgid "Duplicate Part"
msgstr "Dupliser del"
-#: part/serializers.py:816
+#: part/serializers.py:834
msgid "Copy initial data from another Part"
msgstr "Kopier innledende data fra en annen del"
-#: part/serializers.py:822 templates/js/translated/part.js:102
+#: part/serializers.py:840 templates/js/translated/part.js:102
msgid "Initial Stock"
msgstr "Innledende lagerbeholdning"
-#: part/serializers.py:823
+#: part/serializers.py:841
msgid "Create Part with initial stock quantity"
msgstr "Lag en del med innledende lagermengde"
-#: part/serializers.py:829
+#: part/serializers.py:847
msgid "Supplier Information"
msgstr "Leverandøropplysninger"
-#: part/serializers.py:830
+#: part/serializers.py:848
msgid "Add initial supplier information for this part"
msgstr "Legg til innledende leverandørinformasjon for denne delen"
-#: part/serializers.py:838
+#: part/serializers.py:856
msgid "Copy Category Parameters"
msgstr "Kopier kategoriparametre"
-#: part/serializers.py:839
+#: part/serializers.py:857
msgid "Copy parameter templates from selected part category"
msgstr "Kopier parametermaler fra valgt delkategori"
-#: part/serializers.py:844
+#: part/serializers.py:862
msgid "Existing Image"
msgstr "Eksisterende bilde"
-#: part/serializers.py:845
+#: part/serializers.py:863
msgid "Filename of an existing part image"
msgstr "Filnavn for et eksisterende del-bilde"
-#: part/serializers.py:862
+#: part/serializers.py:880
msgid "Image file does not exist"
msgstr "Bildefilen finnes ikke"
-#: part/serializers.py:1068
+#: part/serializers.py:1086
msgid "Limit stocktake report to a particular part, and any variant parts"
msgstr "Begrens lagerbeholdningsrapport til en bestemt del og enhver variant av delen"
-#: part/serializers.py:1078
+#: part/serializers.py:1096
msgid "Limit stocktake report to a particular part category, and any child categories"
msgstr "Begrens lagerbeholdningsrapport til en bestemt delkategori og alle underkategorier"
-#: part/serializers.py:1088
+#: part/serializers.py:1106
msgid "Limit stocktake report to a particular stock location, and any child locations"
msgstr "Begrens lagerbeholdningsrapport til en bestemt plasering og eventuelle underplasseringer"
-#: part/serializers.py:1094
+#: part/serializers.py:1112
msgid "Exclude External Stock"
msgstr "Ekskluder ekstern lagerbeholdning"
-#: part/serializers.py:1095
+#: part/serializers.py:1113
msgid "Exclude stock items in external locations"
msgstr "Ekskluder lagervarer i eksterne lokasjoner"
-#: part/serializers.py:1100
+#: part/serializers.py:1118
msgid "Generate Report"
msgstr "Generer rapport"
-#: part/serializers.py:1101
+#: part/serializers.py:1119
msgid "Generate report file containing calculated stocktake data"
msgstr "Genererer rapport som inneholder beregnede lagerdata"
-#: part/serializers.py:1106
+#: part/serializers.py:1124
msgid "Update Parts"
msgstr "Oppdater deler"
-#: part/serializers.py:1107
+#: part/serializers.py:1125
msgid "Update specified parts with calculated stocktake data"
msgstr "Oppdater spesifiserte deler med beregnede lagerbeholdningsdata"
-#: part/serializers.py:1115
+#: part/serializers.py:1133
msgid "Stocktake functionality is not enabled"
msgstr "Lagerbeholdningsfunksjonalitet er ikke aktivert"
-#: part/serializers.py:1221
+#: part/serializers.py:1239
msgid "Override calculated value for minimum price"
msgstr "Overstyr beregnet verdi for minimumspris"
-#: part/serializers.py:1228
+#: part/serializers.py:1246
msgid "Minimum price currency"
msgstr "Valuta for minstepris"
-#: part/serializers.py:1236
+#: part/serializers.py:1254
msgid "Override calculated value for maximum price"
msgstr "Overstyr beregnet verdi for maksimal pris"
-#: part/serializers.py:1243
+#: part/serializers.py:1261
msgid "Maximum price currency"
msgstr "Valuta for maksimal pris"
-#: part/serializers.py:1272
+#: part/serializers.py:1290
msgid "Update"
msgstr "Oppdater"
-#: part/serializers.py:1273
+#: part/serializers.py:1291
msgid "Update pricing for this part"
msgstr "Oppdater priser for denne delen"
-#: part/serializers.py:1296
+#: part/serializers.py:1314
#, python-brace-format
msgid "Could not convert from provided currencies to {default_currency}"
msgstr "Kan ikke konvertere fra gitte valutaer til {default_currency}"
-#: part/serializers.py:1303
+#: part/serializers.py:1321
msgid "Minimum price must not be greater than maximum price"
msgstr "Minsteprisen kan ikke være større enn maksimal pris"
-#: part/serializers.py:1306
+#: part/serializers.py:1324
msgid "Maximum price must not be less than minimum price"
msgstr "Maksimal pris kan ikke være mindre enn minstepris"
-#: part/serializers.py:1632
+#: part/serializers.py:1660
msgid "Select part to copy BOM from"
msgstr "Velg del å kopiere BOM fra"
-#: part/serializers.py:1640
+#: part/serializers.py:1668
msgid "Remove Existing Data"
msgstr "Fjern eksisterende data"
-#: part/serializers.py:1641
+#: part/serializers.py:1669
msgid "Remove existing BOM items before copying"
msgstr "Fjern eksisterende BOM-artikler før kopiering"
-#: part/serializers.py:1646
+#: part/serializers.py:1674
msgid "Include Inherited"
msgstr "Inkluder arvede"
-#: part/serializers.py:1647
+#: part/serializers.py:1675
msgid "Include BOM items which are inherited from templated parts"
msgstr "Inkluder BOM-artikler som er arvet fra maldeler"
-#: part/serializers.py:1652
+#: part/serializers.py:1680
msgid "Skip Invalid Rows"
msgstr "Hopp over ugyldige rader"
-#: part/serializers.py:1653
+#: part/serializers.py:1681
msgid "Enable this option to skip invalid rows"
msgstr "Aktiver dette alternativet for å hoppe over ugyldige rader"
-#: part/serializers.py:1658
+#: part/serializers.py:1686
msgid "Copy Substitute Parts"
msgstr "Kopier erstatningsdeler"
-#: part/serializers.py:1659
+#: part/serializers.py:1687
msgid "Copy substitute parts when duplicate BOM items"
msgstr "Kopier erstatningsdeler når BOM-elementer dupliseres"
-#: part/serializers.py:1693
+#: part/serializers.py:1721
msgid "Clear Existing BOM"
msgstr "Nullstill eksisterende BOM"
-#: part/serializers.py:1694
+#: part/serializers.py:1722
msgid "Delete existing BOM items before uploading"
msgstr "Fjern eksisterende BOM-artikler før opplastning"
-#: part/serializers.py:1724
+#: part/serializers.py:1752
msgid "No part column specified"
msgstr "Ingen del-kolonne angitt"
-#: part/serializers.py:1768
+#: part/serializers.py:1796
msgid "Multiple matching parts found"
msgstr "Flere samsvarende deler funnet"
-#: part/serializers.py:1771
+#: part/serializers.py:1799
msgid "No matching part found"
msgstr "Ingen samsvarende del funnet"
-#: part/serializers.py:1774
+#: part/serializers.py:1802
msgid "Part is not designated as a component"
msgstr "Delen er ikke betegnet som en komponent"
-#: part/serializers.py:1783
+#: part/serializers.py:1811
msgid "Quantity not provided"
msgstr "Antall ikke oppgitt"
-#: part/serializers.py:1791
+#: part/serializers.py:1819
msgid "Invalid quantity"
msgstr "Ugyldig antall"
-#: part/serializers.py:1812
+#: part/serializers.py:1840
msgid "At least one BOM item is required"
msgstr "Minst en BOM-artikkel kreves"
@@ -7221,7 +7253,7 @@ msgid "Validate BOM"
msgstr "Godkjenn BOM"
#: part/templates/part/detail.html:283 part/templates/part/detail.html:284
-#: templates/js/translated/bom.js:1314 templates/js/translated/bom.js:1315
+#: templates/js/translated/bom.js:1320 templates/js/translated/bom.js:1321
msgid "Add BOM Item"
msgstr "Legg til BOM-artikkel"
@@ -7405,7 +7437,7 @@ msgstr "Tildelt til produksjonsordrer"
msgid "Allocated to Sales Orders"
msgstr "Tildelt til Salgsordrer"
-#: part/templates/part/part_base.html:235 templates/js/translated/bom.js:1213
+#: part/templates/part/part_base.html:235 templates/js/translated/bom.js:1219
msgid "Can Build"
msgstr "Kan Produsere"
@@ -8784,7 +8816,7 @@ msgstr "Velg en tilsvarende leverandørdel for denne lagervaren"
msgid "Where is this stock item located?"
msgstr "Hvor er denne lagervaren plassert?"
-#: stock/models.py:786 stock/serializers.py:1318
+#: stock/models.py:786 stock/serializers.py:1324
msgid "Packaging this stock item is stored in"
msgstr "Inpakningen denne lagervaren er lagret i"
@@ -8796,7 +8828,7 @@ msgstr "Er denne artikkelen montert i en annen artikkel?"
msgid "Serial number for this item"
msgstr "Serienummer for denne artikkelen"
-#: stock/models.py:830 stock/serializers.py:1301
+#: stock/models.py:830 stock/serializers.py:1307
msgid "Batch code for this stock item"
msgstr "Batchkode for denne lagervaren"
@@ -8905,7 +8937,7 @@ msgstr "Lagervare er for tiden i produksjon"
msgid "Serialized stock cannot be merged"
msgstr "Serialisert lagerbeholdning kan ikke slås sammen"
-#: stock/models.py:1639 stock/serializers.py:1207
+#: stock/models.py:1639 stock/serializers.py:1213
msgid "Duplicate stock items"
msgstr "Duplisert lagervare"
@@ -8986,7 +9018,7 @@ msgstr "Antall kan ikke overstige tilgjengelig lagerbeholdning ({q})"
msgid "Enter serial numbers for new items"
msgstr "Angi serienummer for nye artikler"
-#: stock/serializers.py:473 stock/serializers.py:1164 stock/serializers.py:1420
+#: stock/serializers.py:473 stock/serializers.py:1170 stock/serializers.py:1426
msgid "Destination stock location"
msgstr "Til Lagerplassering"
@@ -9059,77 +9091,78 @@ msgstr "Velg lagervarer for å endre status"
msgid "No stock items selected"
msgstr "Ingen lagervarer valgt"
-#: stock/serializers.py:863 stock/templates/stock/location.html:165
+#: stock/serializers.py:863 stock/serializers.py:926
+#: stock/templates/stock/location.html:165
#: stock/templates/stock/location.html:213
#: stock/templates/stock/location_sidebar.html:5
msgid "Sublocations"
msgstr "Underplasseringer"
-#: stock/serializers.py:1036
+#: stock/serializers.py:1042
msgid "Part must be salable"
msgstr "Delen må være salgbar"
-#: stock/serializers.py:1040
+#: stock/serializers.py:1046
msgid "Item is allocated to a sales order"
msgstr "Artikkelen er tildelt en salgsordre"
-#: stock/serializers.py:1044
+#: stock/serializers.py:1050
msgid "Item is allocated to a build order"
msgstr "Artikkelen er tildelt en produksjonsordre"
-#: stock/serializers.py:1068
+#: stock/serializers.py:1074
msgid "Customer to assign stock items"
msgstr "Kunde å tilordne lagervarer"
-#: stock/serializers.py:1074
+#: stock/serializers.py:1080
msgid "Selected company is not a customer"
msgstr "Valgt firma er ikke en kunde"
-#: stock/serializers.py:1082
+#: stock/serializers.py:1088
msgid "Stock assignment notes"
msgstr "Lagervare-tildelignsnotater"
-#: stock/serializers.py:1092 stock/serializers.py:1346
+#: stock/serializers.py:1098 stock/serializers.py:1352
msgid "A list of stock items must be provided"
msgstr "En liste av lagervarer må oppgis"
-#: stock/serializers.py:1171
+#: stock/serializers.py:1177
msgid "Stock merging notes"
msgstr "Notater om lagersammenslåing"
-#: stock/serializers.py:1176
+#: stock/serializers.py:1182
msgid "Allow mismatched suppliers"
msgstr "Tillat forskjellige leverandører"
-#: stock/serializers.py:1177
+#: stock/serializers.py:1183
msgid "Allow stock items with different supplier parts to be merged"
msgstr "Tillat lagervarer med forskjellige leverandørdeler å slås sammen"
-#: stock/serializers.py:1182
+#: stock/serializers.py:1188
msgid "Allow mismatched status"
msgstr "Tillat forskjellig status"
-#: stock/serializers.py:1183
+#: stock/serializers.py:1189
msgid "Allow stock items with different status codes to be merged"
msgstr "Tillat lagervarer med forskjellige statuskoder å slås sammen"
-#: stock/serializers.py:1193
+#: stock/serializers.py:1199
msgid "At least two stock items must be provided"
msgstr "Minst to lagervarer må oppgis"
-#: stock/serializers.py:1260
+#: stock/serializers.py:1266
msgid "No Change"
msgstr ""
-#: stock/serializers.py:1289
+#: stock/serializers.py:1295
msgid "StockItem primary key value"
msgstr "Lagervare primærnøkkel verdi"
-#: stock/serializers.py:1308
+#: stock/serializers.py:1314
msgid "Stock item status code"
msgstr "Lagervare statuskode"
-#: stock/serializers.py:1336
+#: stock/serializers.py:1342
msgid "Stock transaction notes"
msgstr "Lager transaksjonsnotater"
@@ -10662,7 +10695,7 @@ msgid "The following parts are low on required stock"
msgstr "Følgende deler har for lav lagerbeholdning"
#: templates/email/build_order_required_stock.html:18
-#: templates/js/translated/bom.js:1668 templates/js/translated/build.js:2557
+#: templates/js/translated/bom.js:1674 templates/js/translated/build.js:2557
msgid "Required Quantity"
msgstr "Antall som kreves"
@@ -10676,7 +10709,7 @@ msgid "Click on the following link to view this part"
msgstr "Klikk på følgende lenke for å se denne delen"
#: templates/email/low_stock_notification.html:18
-#: templates/js/translated/part.js:3209
+#: templates/js/translated/part.js:3218
msgid "Minimum Quantity"
msgstr "Minimum antall"
@@ -11051,62 +11084,68 @@ msgstr ""
msgid "No pricing available"
msgstr ""
-#: templates/js/translated/bom.js:1182 templates/js/translated/build.js:2596
+#: templates/js/translated/bom.js:1184 templates/js/translated/build.js:2622
+#, fuzzy
+#| msgid "External Link"
+msgid "External stock"
+msgstr "Ekstern lenke"
+
+#: templates/js/translated/bom.js:1188 templates/js/translated/build.js:2596
#: templates/js/translated/sales_order.js:1910
msgid "No Stock Available"
msgstr ""
-#: templates/js/translated/bom.js:1187 templates/js/translated/build.js:2600
+#: templates/js/translated/bom.js:1193 templates/js/translated/build.js:2600
msgid "Includes variant and substitute stock"
msgstr ""
-#: templates/js/translated/bom.js:1189 templates/js/translated/build.js:2602
+#: templates/js/translated/bom.js:1195 templates/js/translated/build.js:2602
#: templates/js/translated/part.js:1256
#: templates/js/translated/sales_order.js:1907
msgid "Includes variant stock"
msgstr ""
-#: templates/js/translated/bom.js:1191 templates/js/translated/build.js:2604
+#: templates/js/translated/bom.js:1197 templates/js/translated/build.js:2604
msgid "Includes substitute stock"
msgstr ""
-#: templates/js/translated/bom.js:1219 templates/js/translated/build.js:2587
+#: templates/js/translated/bom.js:1225 templates/js/translated/build.js:2587
msgid "Consumable item"
msgstr ""
-#: templates/js/translated/bom.js:1279
+#: templates/js/translated/bom.js:1285
msgid "Validate BOM Item"
msgstr ""
-#: templates/js/translated/bom.js:1281
+#: templates/js/translated/bom.js:1287
msgid "This line has been validated"
msgstr ""
-#: templates/js/translated/bom.js:1283
+#: templates/js/translated/bom.js:1289
msgid "Edit substitute parts"
msgstr ""
-#: templates/js/translated/bom.js:1285 templates/js/translated/bom.js:1480
+#: templates/js/translated/bom.js:1291 templates/js/translated/bom.js:1486
msgid "Edit BOM Item"
msgstr ""
-#: templates/js/translated/bom.js:1287
+#: templates/js/translated/bom.js:1293
msgid "Delete BOM Item"
msgstr ""
-#: templates/js/translated/bom.js:1307
+#: templates/js/translated/bom.js:1313
msgid "View BOM"
msgstr ""
-#: templates/js/translated/bom.js:1391
+#: templates/js/translated/bom.js:1397
msgid "No BOM items found"
msgstr ""
-#: templates/js/translated/bom.js:1651 templates/js/translated/build.js:2486
+#: templates/js/translated/bom.js:1657 templates/js/translated/build.js:2486
msgid "Required Part"
msgstr ""
-#: templates/js/translated/bom.js:1677
+#: templates/js/translated/bom.js:1683
msgid "Inherited from parent BOM"
msgstr ""
@@ -11449,29 +11488,29 @@ msgstr ""
msgid "Sufficient stock available"
msgstr ""
-#: templates/js/translated/build.js:2643
+#: templates/js/translated/build.js:2647
msgid "Consumable Item"
msgstr ""
-#: templates/js/translated/build.js:2648
+#: templates/js/translated/build.js:2652
msgid "Tracked item"
msgstr ""
-#: templates/js/translated/build.js:2655
+#: templates/js/translated/build.js:2659
#: templates/js/translated/sales_order.js:2016
msgid "Build stock"
msgstr ""
-#: templates/js/translated/build.js:2660 templates/js/translated/stock.js:1829
+#: templates/js/translated/build.js:2664 templates/js/translated/stock.js:1829
msgid "Order stock"
msgstr ""
-#: templates/js/translated/build.js:2664
+#: templates/js/translated/build.js:2668
#: templates/js/translated/sales_order.js:2010
msgid "Allocate stock"
msgstr ""
-#: templates/js/translated/build.js:2668
+#: templates/js/translated/build.js:2672
msgid "Remove stock allocation"
msgstr ""
@@ -12313,64 +12352,64 @@ msgstr ""
msgid "Subscribed category"
msgstr ""
-#: templates/js/translated/part.js:2855
+#: templates/js/translated/part.js:2864
msgid "No test templates matching query"
msgstr ""
-#: templates/js/translated/part.js:2877 templates/js/translated/search.js:342
+#: templates/js/translated/part.js:2886 templates/js/translated/search.js:342
msgid "results"
msgstr ""
-#: templates/js/translated/part.js:2927 templates/js/translated/stock.js:1446
+#: templates/js/translated/part.js:2936 templates/js/translated/stock.js:1446
msgid "Edit test result"
msgstr ""
-#: templates/js/translated/part.js:2928 templates/js/translated/stock.js:1447
+#: templates/js/translated/part.js:2937 templates/js/translated/stock.js:1447
#: templates/js/translated/stock.js:1692
msgid "Delete test result"
msgstr ""
-#: templates/js/translated/part.js:2932
+#: templates/js/translated/part.js:2941
msgid "This test is defined for a parent part"
msgstr ""
-#: templates/js/translated/part.js:2948
+#: templates/js/translated/part.js:2957
msgid "Edit Test Result Template"
msgstr ""
-#: templates/js/translated/part.js:2962
+#: templates/js/translated/part.js:2971
msgid "Delete Test Result Template"
msgstr ""
-#: templates/js/translated/part.js:3041 templates/js/translated/part.js:3042
+#: templates/js/translated/part.js:3050 templates/js/translated/part.js:3051
msgid "No date specified"
msgstr ""
-#: templates/js/translated/part.js:3044
+#: templates/js/translated/part.js:3053
msgid "Specified date is in the past"
msgstr ""
-#: templates/js/translated/part.js:3050
+#: templates/js/translated/part.js:3059
msgid "Speculative"
msgstr ""
-#: templates/js/translated/part.js:3100
+#: templates/js/translated/part.js:3109
msgid "No scheduling information available for this part"
msgstr ""
-#: templates/js/translated/part.js:3106
+#: templates/js/translated/part.js:3115
msgid "Error fetching scheduling information for this part"
msgstr ""
-#: templates/js/translated/part.js:3202
+#: templates/js/translated/part.js:3211
msgid "Scheduled Stock Quantities"
msgstr ""
-#: templates/js/translated/part.js:3218
+#: templates/js/translated/part.js:3227
msgid "Maximum Quantity"
msgstr ""
-#: templates/js/translated/part.js:3263
+#: templates/js/translated/part.js:3272
msgid "Minimum Stock Level"
msgstr ""
@@ -14052,4 +14091,3 @@ msgstr "Tillatelse til å endre elementer"
#: users/models.py:413
msgid "Permission to delete items"
msgstr "Tillatelse til å slette elementer"
-
diff --git a/InvenTree/locale/pl/LC_MESSAGES/django.po b/InvenTree/locale/pl/LC_MESSAGES/django.po
index 9e8ff1ccb7..2717fa3ce1 100644
--- a/InvenTree/locale/pl/LC_MESSAGES/django.po
+++ b/InvenTree/locale/pl/LC_MESSAGES/django.po
@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: inventree\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2024-02-28 04:05+0000\n"
-"PO-Revision-Date: 2024-02-28 07:23\n"
+"POT-Creation-Date: 2024-03-02 07:22+0000\n"
+"PO-Revision-Date: 2024-03-06 10:36\n"
"Last-Translator: \n"
"Language-Team: Polish\n"
"Language: pl_PL\n"
@@ -28,7 +28,7 @@ msgstr "Użytkownik nie ma uprawnień do przeglądania tego modelu"
#: InvenTree/conversion.py:160
#, python-brace-format
msgid "Invalid unit provided ({unit})"
-msgstr ""
+msgstr "Nieprawidłowa jednostka ({unit})"
#: InvenTree/conversion.py:170
msgid "No value provided"
@@ -66,9 +66,9 @@ msgstr "Wprowadź dane"
#: report/templates/report/inventree_build_order_base.html:172
#: stock/admin.py:226 stock/models.py:2335 stock/models.py:2451
#: stock/serializers.py:479 stock/serializers.py:632 stock/serializers.py:728
-#: stock/serializers.py:778 stock/serializers.py:1081 stock/serializers.py:1170
-#: stock/serializers.py:1335 stock/templates/stock/stock_sidebar.html:25
-#: templates/js/translated/barcode.js:143 templates/js/translated/bom.js:1259
+#: stock/serializers.py:778 stock/serializers.py:1087 stock/serializers.py:1176
+#: stock/serializers.py:1341 stock/templates/stock/stock_sidebar.html:25
+#: templates/js/translated/barcode.js:143 templates/js/translated/bom.js:1265
#: templates/js/translated/company.js:1674 templates/js/translated/order.js:347
#: templates/js/translated/part.js:1080
#: templates/js/translated/purchase_order.js:2201
@@ -523,7 +523,7 @@ msgstr "Nazwa"
#: templates/js/translated/order.js:298 templates/js/translated/part.js:1238
#: templates/js/translated/part.js:1483 templates/js/translated/part.js:1621
#: templates/js/translated/part.js:1958 templates/js/translated/part.js:2355
-#: templates/js/translated/part.js:2785 templates/js/translated/part.js:2887
+#: templates/js/translated/part.js:2785 templates/js/translated/part.js:2896
#: templates/js/translated/plugin.js:80
#: templates/js/translated/purchase_order.js:1707
#: templates/js/translated/purchase_order.js:1850
@@ -678,7 +678,7 @@ msgstr "Adres URL zdalnego pliku obrazu"
msgid "Downloading images from remote URL is not enabled"
msgstr "Pobieranie obrazów ze zdalnego URL nie jest włączone"
-#: InvenTree/status.py:66 part/serializers.py:1120
+#: InvenTree/status.py:66 part/serializers.py:1138
msgid "Background worker check failed"
msgstr "Sprawdzenie robotnika w tle nie powiodło się"
@@ -960,7 +960,7 @@ msgid "Tracked"
msgstr "Śledzony"
#: build/api.py:285 part/admin.py:144 templates/js/translated/build.js:1741
-#: templates/js/translated/build.js:2626
+#: templates/js/translated/build.js:2630
#: templates/js/translated/sales_order.js:1929
#: templates/js/translated/table_filters.js:571
msgid "Allocated"
@@ -1044,11 +1044,11 @@ msgstr "Zamówienie budowy, do którego budowa jest przypisana"
#: build/models.py:199 build/templates/build/build_base.html:97
#: build/templates/build/detail.html:29 company/models.py:1044
#: order/models.py:1389 order/models.py:1532 order/models.py:1533
-#: part/api.py:1528 part/models.py:389 part/models.py:3003 part/models.py:3147
-#: part/models.py:3291 part/models.py:3314 part/models.py:3335
-#: part/models.py:3357 part/models.py:3458 part/models.py:3754
-#: part/models.py:3885 part/models.py:3978 part/models.py:4339
-#: part/serializers.py:1066 part/serializers.py:1631
+#: part/api.py:1528 part/api.py:1820 part/models.py:389 part/models.py:3003
+#: part/models.py:3147 part/models.py:3291 part/models.py:3314
+#: part/models.py:3335 part/models.py:3357 part/models.py:3458
+#: part/models.py:3754 part/models.py:3885 part/models.py:3978
+#: part/models.py:4339 part/serializers.py:1084 part/serializers.py:1659
#: part/templates/part/part_app_base.html:8
#: part/templates/part/part_pricing.html:12
#: part/templates/part/upload_bom.html:52
@@ -1147,7 +1147,7 @@ msgid "Build status code"
msgstr "Kod statusu budowania"
#: build/models.py:264 build/serializers.py:280 order/serializers.py:549
-#: stock/models.py:826 stock/serializers.py:1300
+#: stock/models.py:826 stock/serializers.py:1306
#: templates/js/translated/purchase_order.js:1129
msgid "Batch Code"
msgstr "Kod partii"
@@ -1242,48 +1242,48 @@ msgstr "Kod projektu"
msgid "Project code for this build order"
msgstr "Kod projektu dla tego zlecenia produkcji"
-#: build/models.py:559
+#: build/models.py:575
#, python-brace-format
msgid "Build order {build} has been completed"
msgstr "Kolejność kompilacji {build} została zakończona"
-#: build/models.py:565
+#: build/models.py:581
msgid "A build order has been completed"
msgstr "Kolejność kompilacji została zakończona"
-#: build/models.py:783 build/models.py:858
+#: build/models.py:799 build/models.py:874
msgid "No build output specified"
msgstr "Nie określono danych wyjściowych budowy"
-#: build/models.py:786
+#: build/models.py:802
msgid "Build output is already completed"
msgstr "Budowanie wyjścia jest już ukończone"
-#: build/models.py:789
+#: build/models.py:805
msgid "Build output does not match Build Order"
msgstr "Skompilowane dane wyjściowe nie pasują do kolejności kompilacji"
-#: build/models.py:862 build/serializers.py:223 build/serializers.py:262
+#: build/models.py:878 build/serializers.py:223 build/serializers.py:262
#: build/serializers.py:831 order/models.py:526 order/serializers.py:401
-#: order/serializers.py:544 part/serializers.py:1423 part/serializers.py:1789
+#: order/serializers.py:544 part/serializers.py:1442 part/serializers.py:1817
#: stock/models.py:665 stock/models.py:1477 stock/serializers.py:450
msgid "Quantity must be greater than zero"
msgstr "Ilość musi być większa niż zero"
-#: build/models.py:867 build/serializers.py:228
+#: build/models.py:883 build/serializers.py:228
msgid "Quantity cannot be greater than the output quantity"
msgstr "Ilość nie może być większa niż ilość wyjściowa"
-#: build/models.py:924 build/serializers.py:533
+#: build/models.py:940 build/serializers.py:533
#, python-brace-format
msgid "Build output {serial} has not passed all required tests"
-msgstr ""
+msgstr "Wyjście budowy {serial} nie przeszło wszystkich testów"
-#: build/models.py:1286
+#: build/models.py:1302
msgid "Build object"
-msgstr ""
+msgstr "Zbuduj obiekt"
-#: build/models.py:1300 build/models.py:1558 build/serializers.py:210
+#: build/models.py:1316 build/models.py:1574 build/serializers.py:210
#: build/serializers.py:247 build/templates/build/build_base.html:102
#: build/templates/build/detail.html:34 common/models.py:2432
#: order/models.py:1247 order/models.py:1902 order/serializers.py:1306
@@ -1310,7 +1310,7 @@ msgstr ""
#: templates/js/translated/company.js:1808
#: templates/js/translated/model_renderers.js:230
#: templates/js/translated/order.js:304 templates/js/translated/part.js:961
-#: templates/js/translated/part.js:1811 templates/js/translated/part.js:3332
+#: templates/js/translated/part.js:1811 templates/js/translated/part.js:3341
#: templates/js/translated/pricing.js:381
#: templates/js/translated/pricing.js:474
#: templates/js/translated/pricing.js:522
@@ -1330,38 +1330,38 @@ msgstr ""
msgid "Quantity"
msgstr "Ilość"
-#: build/models.py:1301
+#: build/models.py:1317
msgid "Required quantity for build order"
msgstr "Wymagana ilość dla zlecenia produkcji"
-#: build/models.py:1381
+#: build/models.py:1397
msgid "Build item must specify a build output, as master part is marked as trackable"
msgstr ""
-#: build/models.py:1390
+#: build/models.py:1406
#, python-brace-format
msgid "Allocated quantity ({q}) must not exceed available stock quantity ({a})"
msgstr ""
-#: build/models.py:1400 order/models.py:1853
+#: build/models.py:1416 order/models.py:1853
msgid "Stock item is over-allocated"
msgstr ""
-#: build/models.py:1406 order/models.py:1856
+#: build/models.py:1422 order/models.py:1856
msgid "Allocation quantity must be greater than zero"
msgstr "Alokowana ilość musi być większa niż zero"
-#: build/models.py:1412
+#: build/models.py:1428
msgid "Quantity must be 1 for serialized stock"
msgstr ""
-#: build/models.py:1473
+#: build/models.py:1489
msgid "Selected stock item does not match BOM line"
msgstr ""
-#: build/models.py:1545 build/serializers.py:811 order/serializers.py:1150
-#: order/serializers.py:1171 stock/serializers.py:544 stock/serializers.py:1019
-#: stock/serializers.py:1131 stock/templates/stock/item_base.html:10
+#: build/models.py:1561 build/serializers.py:811 order/serializers.py:1150
+#: order/serializers.py:1171 stock/serializers.py:544 stock/serializers.py:1025
+#: stock/serializers.py:1137 stock/templates/stock/item_base.html:10
#: stock/templates/stock/item_base.html:23
#: stock/templates/stock/item_base.html:194
#: templates/js/translated/build.js:1742
@@ -1376,19 +1376,19 @@ msgstr ""
msgid "Stock Item"
msgstr "Element magazynowy"
-#: build/models.py:1546
+#: build/models.py:1562
msgid "Source stock item"
msgstr "Lokalizacja magazynowania przedmiotu"
-#: build/models.py:1559
+#: build/models.py:1575
msgid "Stock quantity to allocate to build"
msgstr ""
-#: build/models.py:1567
+#: build/models.py:1583
msgid "Install into"
msgstr "Zainstaluj do"
-#: build/models.py:1568
+#: build/models.py:1584
msgid "Destination stock item"
msgstr "Docelowa lokalizacja magazynowa przedmiotu"
@@ -1452,9 +1452,9 @@ msgid "A list of build outputs must be provided"
msgstr ""
#: build/serializers.py:426 build/serializers.py:498 order/serializers.py:533
-#: order/serializers.py:641 order/serializers.py:1646 part/serializers.py:1086
+#: order/serializers.py:641 order/serializers.py:1646 part/serializers.py:1104
#: stock/serializers.py:472 stock/serializers.py:627 stock/serializers.py:723
-#: stock/serializers.py:1163 stock/serializers.py:1419
+#: stock/serializers.py:1169 stock/serializers.py:1425
#: stock/templates/stock/item_base.html:394
#: templates/js/translated/barcode.js:547
#: templates/js/translated/barcode.js:795 templates/js/translated/build.js:999
@@ -1494,7 +1494,7 @@ msgstr ""
#: build/serializers.py:505 build/templates/build/build_base.html:151
#: build/templates/build/detail.html:62 order/models.py:910
#: order/models.py:2005 order/serializers.py:565 stock/admin.py:165
-#: stock/serializers.py:774 stock/serializers.py:1307
+#: stock/serializers.py:774 stock/serializers.py:1313
#: stock/templates/stock/item_base.html:427
#: templates/js/translated/barcode.js:252 templates/js/translated/build.js:2189
#: templates/js/translated/purchase_order.js:1308
@@ -1602,7 +1602,7 @@ msgstr ""
msgid "bom_item.part must point to the same part as the build order"
msgstr ""
-#: build/serializers.py:817 stock/serializers.py:1032
+#: build/serializers.py:817 stock/serializers.py:1038
msgid "Item must be in stock"
msgstr "Towar musi znajdować się w magazynie"
@@ -1659,44 +1659,45 @@ msgstr "Przedmiot opcjonalny"
msgid "Allocate optional BOM items to build order"
msgstr ""
-#: build/serializers.py:1096 part/models.py:3895 part/models.py:4331
+#: build/serializers.py:1097 part/models.py:3895 part/models.py:4331
#: stock/api.py:745
msgid "BOM Item"
msgstr "Element BOM"
-#: build/serializers.py:1105 templates/js/translated/index.js:130
+#: build/serializers.py:1106 templates/js/translated/index.js:130
msgid "Allocated Stock"
msgstr ""
-#: build/serializers.py:1110 part/admin.py:132 part/bom.py:173
-#: part/serializers.py:1441 part/templates/part/part_base.html:210
-#: templates/js/translated/bom.js:1202 templates/js/translated/build.js:2614
-#: templates/js/translated/part.js:709 templates/js/translated/part.js:2148
+#: build/serializers.py:1111 part/admin.py:132 part/bom.py:173
+#: part/serializers.py:798 part/serializers.py:1460
+#: part/templates/part/part_base.html:210 templates/js/translated/bom.js:1208
+#: templates/js/translated/build.js:2614 templates/js/translated/part.js:709
+#: templates/js/translated/part.js:2148
#: templates/js/translated/table_filters.js:170
msgid "On Order"
msgstr "W Zamówieniu"
-#: build/serializers.py:1115 part/serializers.py:1443
+#: build/serializers.py:1116 part/serializers.py:1462
#: templates/js/translated/build.js:2618
#: templates/js/translated/table_filters.js:360
msgid "In Production"
-msgstr ""
+msgstr "W produkcji"
-#: build/serializers.py:1120 part/bom.py:172 part/serializers.py:1454
+#: build/serializers.py:1121 part/bom.py:172 part/serializers.py:1473
#: part/templates/part/part_base.html:192
#: templates/js/translated/sales_order.js:1893
msgid "Available Stock"
msgstr "Dostępna ilość"
-#: build/tasks.py:149
+#: build/tasks.py:171
msgid "Stock required for build order"
msgstr ""
-#: build/tasks.py:166
+#: build/tasks.py:188
msgid "Overdue Build Order"
msgstr ""
-#: build/tasks.py:171
+#: build/tasks.py:193
#, python-brace-format
msgid "Build order {bo} is now overdue"
msgstr ""
@@ -1990,27 +1991,31 @@ msgstr "Zamów wymagane komponenty"
msgid "Order Parts"
msgstr "Zamów komponent"
-#: build/templates/build/detail.html:210
-msgid "Incomplete Build Outputs"
-msgstr ""
-
-#: build/templates/build/detail.html:214
-msgid "Create new build output"
+#: build/templates/build/detail.html:205
+msgid "Available stock has been filtered based on specified source location for this build order"
msgstr ""
#: build/templates/build/detail.html:215
+msgid "Incomplete Build Outputs"
+msgstr ""
+
+#: build/templates/build/detail.html:219
+msgid "Create new build output"
+msgstr ""
+
+#: build/templates/build/detail.html:220
msgid "New Build Output"
msgstr ""
-#: build/templates/build/detail.html:232 build/templates/build/sidebar.html:15
+#: build/templates/build/detail.html:237 build/templates/build/sidebar.html:15
msgid "Consumed Stock"
msgstr ""
-#: build/templates/build/detail.html:244
+#: build/templates/build/detail.html:249
msgid "Completed Build Outputs"
msgstr ""
-#: build/templates/build/detail.html:256 build/templates/build/sidebar.html:19
+#: build/templates/build/detail.html:261 build/templates/build/sidebar.html:19
#: company/templates/company/detail.html:229
#: company/templates/company/manufacturer_part.html:141
#: company/templates/company/manufacturer_part_sidebar.html:9
@@ -2026,15 +2031,15 @@ msgstr ""
msgid "Attachments"
msgstr "Załączniki"
-#: build/templates/build/detail.html:271
+#: build/templates/build/detail.html:276
msgid "Build Notes"
msgstr "Notatki tworzenia"
-#: build/templates/build/detail.html:426
+#: build/templates/build/detail.html:434
msgid "Allocation Complete"
msgstr ""
-#: build/templates/build/detail.html:427
+#: build/templates/build/detail.html:435
msgid "All lines have been fully allocated"
msgstr ""
@@ -2436,7 +2441,7 @@ msgid "Parts are templates by default"
msgstr ""
#: common/models.py:1456 part/admin.py:91 part/admin.py:431 part/models.py:1015
-#: templates/js/translated/bom.js:1633
+#: templates/js/translated/bom.js:1639
#: templates/js/translated/table_filters.js:330
#: templates/js/translated/table_filters.js:721
msgid "Assembly"
@@ -3495,7 +3500,7 @@ msgstr ""
msgid "Price break quantity"
msgstr ""
-#: common/models.py:2440 company/serializers.py:484 order/admin.py:42
+#: common/models.py:2440 company/serializers.py:486 order/admin.py:42
#: order/models.py:1321 order/models.py:2226
#: templates/js/translated/company.js:1813 templates/js/translated/part.js:1885
#: templates/js/translated/pricing.js:621
@@ -3972,7 +3977,7 @@ msgstr "Wybierz część"
#: company/models.py:495 company/templates/company/company_base.html:76
#: company/templates/company/manufacturer_part.html:90
-#: company/templates/company/supplier_part.html:145 part/serializers.py:497
+#: company/templates/company/supplier_part.html:145 part/serializers.py:505
#: stock/templates/stock/item_base.html:207
#: templates/js/translated/company.js:506
#: templates/js/translated/company.js:1108
@@ -3987,7 +3992,7 @@ msgid "Select manufacturer"
msgstr "Wybierz producenta"
#: company/models.py:502 company/templates/company/manufacturer_part.html:101
-#: company/templates/company/supplier_part.html:153 part/serializers.py:507
+#: company/templates/company/supplier_part.html:153 part/serializers.py:515
#: templates/js/translated/company.js:351
#: templates/js/translated/company.js:1107
#: templates/js/translated/company.js:1302
@@ -4059,7 +4064,7 @@ msgstr ""
#: company/models.py:795 company/templates/company/company_base.html:81
#: company/templates/company/supplier_part.html:129 order/models.py:453
#: order/templates/order/order_base.html:136 part/bom.py:272 part/bom.py:310
-#: part/serializers.py:481 plugin/builtin/suppliers/digikey.py:25
+#: part/serializers.py:489 plugin/builtin/suppliers/digikey.py:25
#: plugin/builtin/suppliers/lcsc.py:26 plugin/builtin/suppliers/mouser.py:24
#: plugin/builtin/suppliers/tme.py:26 stock/templates/stock/item_base.html:224
#: templates/email/overdue_purchase_order.html:16
@@ -4076,7 +4081,7 @@ msgstr "Dostawca"
msgid "Select supplier"
msgstr "Wybierz dostawcę"
-#: company/models.py:802 part/serializers.py:492
+#: company/models.py:802 part/serializers.py:500
msgid "Supplier stock keeping unit"
msgstr ""
@@ -4112,7 +4117,7 @@ msgid "Minimum charge (e.g. stocking fee)"
msgstr ""
#: company/models.py:851 company/templates/company/supplier_part.html:160
-#: stock/admin.py:224 stock/models.py:785 stock/serializers.py:1317
+#: stock/admin.py:224 stock/models.py:785 stock/serializers.py:1323
#: stock/templates/stock/item_base.html:240
#: templates/js/translated/company.js:1636
#: templates/js/translated/stock.js:2387
@@ -4157,7 +4162,7 @@ msgstr ""
msgid "Date of last update of availability data"
msgstr ""
-#: company/serializers.py:153
+#: company/serializers.py:155
msgid "Default currency used for this supplier"
msgstr "Domyślna waluta używana dla tego dostawcy"
@@ -4218,7 +4223,7 @@ msgstr ""
#: company/templates/company/company_base.html:86 order/models.py:898
#: order/models.py:1993 order/templates/order/return_order_base.html:131
#: order/templates/order/sales_order_base.html:144 stock/models.py:807
-#: stock/models.py:808 stock/serializers.py:1067
+#: stock/models.py:808 stock/serializers.py:1073
#: stock/templates/stock/item_base.html:405
#: templates/email/overdue_sales_order.html:16
#: templates/js/translated/company.js:502
@@ -4429,8 +4434,9 @@ msgstr ""
#: company/templates/company/manufacturer_part.html:119
#: company/templates/company/supplier_part.html:15 company/views.py:31
-#: part/admin.py:122 part/templates/part/part_sidebar.html:33
-#: templates/InvenTree/search.html:190 templates/navbar.html:48
+#: part/admin.py:122 part/serializers.py:802
+#: part/templates/part/part_sidebar.html:33 templates/InvenTree/search.html:190
+#: templates/navbar.html:48
msgid "Suppliers"
msgstr "Dostawcy"
@@ -4528,7 +4534,7 @@ msgid "No supplier information available"
msgstr ""
#: company/templates/company/supplier_part.html:139 part/bom.py:279
-#: part/bom.py:311 part/serializers.py:491
+#: part/bom.py:311 part/serializers.py:499
#: templates/js/translated/company.js:349 templates/js/translated/part.js:1786
#: templates/js/translated/pricing.js:510
#: templates/js/translated/purchase_order.js:1851
@@ -4577,10 +4583,12 @@ msgstr ""
msgid "Update Part Availability"
msgstr ""
-#: company/templates/company/supplier_part_sidebar.html:5 part/stocktake.py:223
+#: company/templates/company/supplier_part_sidebar.html:5
+#: part/serializers.py:801 part/stocktake.py:223
#: part/templates/part/category.html:183
#: part/templates/part/category_sidebar.html:17 stock/admin.py:69
-#: stock/serializers.py:760 stock/templates/stock/location.html:170
+#: stock/serializers.py:760 stock/serializers.py:924
+#: stock/templates/stock/location.html:170
#: stock/templates/stock/location.html:184
#: stock/templates/stock/location.html:196
#: stock/templates/stock/location_sidebar.html:7
@@ -4640,7 +4648,7 @@ msgid "Label template file"
msgstr ""
#: label/models.py:143 part/models.py:3484 report/models.py:322
-#: templates/js/translated/part.js:2891
+#: templates/js/translated/part.js:2900
#: templates/js/translated/table_filters.js:481
msgid "Enabled"
msgstr "Aktywne"
@@ -5733,7 +5741,7 @@ msgid "Pending Shipments"
msgstr "Oczekujące przesyłki"
#: order/templates/order/sales_order_detail.html:71
-#: templates/js/translated/bom.js:1271 templates/js/translated/filters.js:296
+#: templates/js/translated/bom.js:1277 templates/js/translated/filters.js:296
msgid "Actions"
msgstr "Akcje"
@@ -5861,10 +5869,10 @@ msgstr ""
msgid "Category Path"
msgstr "Ścieżka kategorii"
-#: part/admin.py:323 part/models.py:390 part/serializers.py:259
-#: part/serializers.py:373 part/templates/part/cat_link.html:3
-#: part/templates/part/category.html:23 part/templates/part/category.html:141
-#: part/templates/part/category.html:161
+#: part/admin.py:323 part/models.py:390 part/serializers.py:112
+#: part/serializers.py:265 part/serializers.py:381
+#: part/templates/part/cat_link.html:3 part/templates/part/category.html:23
+#: part/templates/part/category.html:141 part/templates/part/category.html:161
#: part/templates/part/category_sidebar.html:9
#: templates/InvenTree/index.html:36 templates/InvenTree/search.html:84
#: templates/InvenTree/settings/sidebar.html:47
@@ -5889,13 +5897,13 @@ msgstr ""
msgid "Part IPN"
msgstr "IPN komponentu"
-#: part/admin.py:421 part/serializers.py:1220
+#: part/admin.py:421 part/serializers.py:1238
#: templates/js/translated/pricing.js:358
#: templates/js/translated/pricing.js:1024
msgid "Minimum Price"
msgstr ""
-#: part/admin.py:426 part/serializers.py:1235
+#: part/admin.py:426 part/serializers.py:1253
#: templates/js/translated/pricing.js:353
#: templates/js/translated/pricing.js:1032
msgid "Maximum Price"
@@ -5974,7 +5982,7 @@ msgid "This option must be selected"
msgstr "Ta opcja musi być zaznaczona"
#: part/api.py:1541 part/models.py:895 part/models.py:3385 part/models.py:3831
-#: part/serializers.py:388 part/serializers.py:1076
+#: part/serializers.py:396 part/serializers.py:1094
#: part/templates/part/part_base.html:260 stock/api.py:733
#: templates/InvenTree/settings/settings_staff_js.html:300
#: templates/js/translated/notification.js:60
@@ -5982,12 +5990,17 @@ msgstr "Ta opcja musi być zaznaczona"
msgid "Category"
msgstr "Kategoria"
+#: part/api.py:1828
+msgid "Uses"
+msgstr ""
+
#: part/bom.py:170 part/models.py:100 part/models.py:938
#: part/templates/part/category.html:116 part/templates/part/part_base.html:367
msgid "Default Location"
msgstr "Domyślna lokalizacja"
-#: part/bom.py:171 templates/email/low_stock_notification.html:16
+#: part/bom.py:171 part/serializers.py:803
+#: templates/email/low_stock_notification.html:16
msgid "Total Stock"
msgstr ""
@@ -6010,7 +6023,8 @@ msgstr "Kategorie części"
msgid "Default location for parts in this category"
msgstr "Domyślna lokalizacja dla komponentów w tej kategorii"
-#: part/models.py:106 stock/models.py:165 templates/js/translated/stock.js:2736
+#: part/models.py:106 stock/models.py:165 templates/js/translated/part.js:2810
+#: templates/js/translated/stock.js:2736
#: templates/js/translated/table_filters.js:239
#: templates/js/translated/table_filters.js:283
msgid "Structural"
@@ -6418,7 +6432,7 @@ msgstr ""
msgid "Test with this name already exists for this part"
msgstr ""
-#: part/models.py:3464 templates/js/translated/part.js:2870
+#: part/models.py:3464 templates/js/translated/part.js:2879
msgid "Test Name"
msgstr "Nazwa testu"
@@ -6446,7 +6460,7 @@ msgstr "Wprowadź opis do tego testu"
msgid "Is this test enabled?"
msgstr ""
-#: part/models.py:3489 templates/js/translated/part.js:2899
+#: part/models.py:3489 templates/js/translated/part.js:2908
#: templates/js/translated/table_filters.js:477
msgid "Required"
msgstr "Wymagane"
@@ -6455,7 +6469,7 @@ msgstr "Wymagane"
msgid "Is this test required to pass?"
msgstr ""
-#: part/models.py:3495 templates/js/translated/part.js:2907
+#: part/models.py:3495 templates/js/translated/part.js:2916
msgid "Requires Value"
msgstr "Wymaga wartości"
@@ -6463,7 +6477,7 @@ msgstr "Wymaga wartości"
msgid "Does this test require a value when adding a test result?"
msgstr ""
-#: part/models.py:3501 templates/js/translated/part.js:2914
+#: part/models.py:3501 templates/js/translated/part.js:2923
msgid "Requires Attachment"
msgstr "Wymaga załącznika"
@@ -6685,311 +6699,323 @@ msgstr ""
msgid "Duplicate relationship already exists"
msgstr ""
-#: part/serializers.py:128 part/templates/part/category.html:122
-#: part/templates/part/category.html:207
+#: part/serializers.py:114 part/serializers.py:134
+#: part/templates/part/category.html:122 part/templates/part/category.html:207
#: part/templates/part/category_sidebar.html:7
msgid "Subcategories"
msgstr "Podkategorie"
-#: part/serializers.py:172
+#: part/serializers.py:178
msgid "Results"
msgstr ""
-#: part/serializers.py:173
+#: part/serializers.py:179
msgid "Number of results recorded against this template"
msgstr ""
-#: part/serializers.py:197 part/serializers.py:215 stock/serializers.py:384
+#: part/serializers.py:203 part/serializers.py:221 stock/serializers.py:384
msgid "Purchase currency of this stock item"
msgstr "Waluta zakupu tego towaru"
-#: part/serializers.py:260
+#: part/serializers.py:266
msgid "Number of parts using this template"
msgstr ""
-#: part/serializers.py:379
+#: part/serializers.py:387
msgid "No parts selected"
msgstr ""
-#: part/serializers.py:389
+#: part/serializers.py:397
msgid "Select category"
msgstr ""
-#: part/serializers.py:419
+#: part/serializers.py:427
msgid "Original Part"
msgstr ""
-#: part/serializers.py:420
+#: part/serializers.py:428
msgid "Select original part to duplicate"
msgstr ""
-#: part/serializers.py:425
+#: part/serializers.py:433
msgid "Copy Image"
msgstr "Kopiuj obraz"
-#: part/serializers.py:426
+#: part/serializers.py:434
msgid "Copy image from original part"
msgstr ""
-#: part/serializers.py:432 part/templates/part/detail.html:277
+#: part/serializers.py:440 part/templates/part/detail.html:277
msgid "Copy BOM"
msgstr "Kopiuj BOM"
-#: part/serializers.py:433
+#: part/serializers.py:441
msgid "Copy bill of materials from original part"
msgstr ""
-#: part/serializers.py:439
+#: part/serializers.py:447
msgid "Copy Parameters"
msgstr "Kopiuj parametry"
-#: part/serializers.py:440
+#: part/serializers.py:448
msgid "Copy parameter data from original part"
msgstr ""
-#: part/serializers.py:446
+#: part/serializers.py:454
msgid "Copy Notes"
msgstr ""
-#: part/serializers.py:447
+#: part/serializers.py:455
msgid "Copy notes from original part"
msgstr ""
-#: part/serializers.py:460
+#: part/serializers.py:468
msgid "Initial Stock Quantity"
msgstr ""
-#: part/serializers.py:462
+#: part/serializers.py:470
msgid "Specify initial stock quantity for this Part. If quantity is zero, no stock is added."
msgstr ""
-#: part/serializers.py:469
+#: part/serializers.py:477
msgid "Initial Stock Location"
msgstr ""
-#: part/serializers.py:470
+#: part/serializers.py:478
msgid "Specify initial stock location for this Part"
msgstr ""
-#: part/serializers.py:482
+#: part/serializers.py:490
msgid "Select supplier (or leave blank to skip)"
msgstr ""
-#: part/serializers.py:498
+#: part/serializers.py:506
msgid "Select manufacturer (or leave blank to skip)"
msgstr ""
-#: part/serializers.py:508
+#: part/serializers.py:516
msgid "Manufacturer part number"
msgstr ""
-#: part/serializers.py:515
+#: part/serializers.py:523
msgid "Selected company is not a valid supplier"
msgstr ""
-#: part/serializers.py:524
+#: part/serializers.py:532
msgid "Selected company is not a valid manufacturer"
msgstr ""
-#: part/serializers.py:535
+#: part/serializers.py:543
msgid "Manufacturer part matching this MPN already exists"
msgstr ""
-#: part/serializers.py:542
+#: part/serializers.py:550
msgid "Supplier part matching this SKU already exists"
msgstr ""
-#: part/serializers.py:815 part/templates/part/copy_part.html:9
+#: part/serializers.py:804
+msgid "External Stock"
+msgstr ""
+
+#: part/serializers.py:806
+msgid "Unallocated Stock"
+msgstr ""
+
+#: part/serializers.py:808
+msgid "Variant Stock"
+msgstr ""
+
+#: part/serializers.py:833 part/templates/part/copy_part.html:9
#: templates/js/translated/part.js:471
msgid "Duplicate Part"
msgstr "Duplikuj część"
-#: part/serializers.py:816
+#: part/serializers.py:834
msgid "Copy initial data from another Part"
msgstr ""
-#: part/serializers.py:822 templates/js/translated/part.js:102
+#: part/serializers.py:840 templates/js/translated/part.js:102
msgid "Initial Stock"
msgstr ""
-#: part/serializers.py:823
+#: part/serializers.py:841
msgid "Create Part with initial stock quantity"
msgstr ""
-#: part/serializers.py:829
+#: part/serializers.py:847
msgid "Supplier Information"
msgstr ""
-#: part/serializers.py:830
+#: part/serializers.py:848
msgid "Add initial supplier information for this part"
msgstr ""
-#: part/serializers.py:838
+#: part/serializers.py:856
msgid "Copy Category Parameters"
msgstr ""
-#: part/serializers.py:839
+#: part/serializers.py:857
msgid "Copy parameter templates from selected part category"
msgstr ""
-#: part/serializers.py:844
+#: part/serializers.py:862
msgid "Existing Image"
msgstr ""
-#: part/serializers.py:845
+#: part/serializers.py:863
msgid "Filename of an existing part image"
msgstr ""
-#: part/serializers.py:862
+#: part/serializers.py:880
msgid "Image file does not exist"
msgstr ""
-#: part/serializers.py:1068
+#: part/serializers.py:1086
msgid "Limit stocktake report to a particular part, and any variant parts"
msgstr ""
-#: part/serializers.py:1078
+#: part/serializers.py:1096
msgid "Limit stocktake report to a particular part category, and any child categories"
msgstr ""
-#: part/serializers.py:1088
+#: part/serializers.py:1106
msgid "Limit stocktake report to a particular stock location, and any child locations"
msgstr ""
-#: part/serializers.py:1094
+#: part/serializers.py:1112
msgid "Exclude External Stock"
msgstr ""
-#: part/serializers.py:1095
+#: part/serializers.py:1113
msgid "Exclude stock items in external locations"
msgstr ""
-#: part/serializers.py:1100
+#: part/serializers.py:1118
msgid "Generate Report"
msgstr ""
-#: part/serializers.py:1101
+#: part/serializers.py:1119
msgid "Generate report file containing calculated stocktake data"
msgstr ""
-#: part/serializers.py:1106
+#: part/serializers.py:1124
msgid "Update Parts"
msgstr ""
-#: part/serializers.py:1107
+#: part/serializers.py:1125
msgid "Update specified parts with calculated stocktake data"
msgstr ""
-#: part/serializers.py:1115
+#: part/serializers.py:1133
msgid "Stocktake functionality is not enabled"
msgstr ""
-#: part/serializers.py:1221
+#: part/serializers.py:1239
msgid "Override calculated value for minimum price"
msgstr ""
-#: part/serializers.py:1228
+#: part/serializers.py:1246
msgid "Minimum price currency"
msgstr ""
-#: part/serializers.py:1236
+#: part/serializers.py:1254
msgid "Override calculated value for maximum price"
msgstr ""
-#: part/serializers.py:1243
+#: part/serializers.py:1261
msgid "Maximum price currency"
msgstr ""
-#: part/serializers.py:1272
+#: part/serializers.py:1290
msgid "Update"
msgstr ""
-#: part/serializers.py:1273
+#: part/serializers.py:1291
msgid "Update pricing for this part"
msgstr ""
-#: part/serializers.py:1296
+#: part/serializers.py:1314
#, python-brace-format
msgid "Could not convert from provided currencies to {default_currency}"
msgstr ""
-#: part/serializers.py:1303
+#: part/serializers.py:1321
msgid "Minimum price must not be greater than maximum price"
msgstr ""
-#: part/serializers.py:1306
+#: part/serializers.py:1324
msgid "Maximum price must not be less than minimum price"
msgstr ""
-#: part/serializers.py:1632
+#: part/serializers.py:1660
msgid "Select part to copy BOM from"
msgstr ""
-#: part/serializers.py:1640
+#: part/serializers.py:1668
msgid "Remove Existing Data"
msgstr "Usuń istniejące dane"
-#: part/serializers.py:1641
+#: part/serializers.py:1669
msgid "Remove existing BOM items before copying"
msgstr ""
-#: part/serializers.py:1646
+#: part/serializers.py:1674
msgid "Include Inherited"
msgstr ""
-#: part/serializers.py:1647
+#: part/serializers.py:1675
msgid "Include BOM items which are inherited from templated parts"
msgstr ""
-#: part/serializers.py:1652
+#: part/serializers.py:1680
msgid "Skip Invalid Rows"
msgstr "Pomiń nieprawidłowe wiersze"
-#: part/serializers.py:1653
+#: part/serializers.py:1681
msgid "Enable this option to skip invalid rows"
msgstr "Włącz tę opcję, aby pominąć nieprawidłowe wiersze"
-#: part/serializers.py:1658
+#: part/serializers.py:1686
msgid "Copy Substitute Parts"
msgstr ""
-#: part/serializers.py:1659
+#: part/serializers.py:1687
msgid "Copy substitute parts when duplicate BOM items"
msgstr ""
-#: part/serializers.py:1693
+#: part/serializers.py:1721
msgid "Clear Existing BOM"
msgstr "Wyczyść istniejący BOM"
-#: part/serializers.py:1694
+#: part/serializers.py:1722
msgid "Delete existing BOM items before uploading"
msgstr ""
-#: part/serializers.py:1724
+#: part/serializers.py:1752
msgid "No part column specified"
msgstr ""
-#: part/serializers.py:1768
+#: part/serializers.py:1796
msgid "Multiple matching parts found"
msgstr ""
-#: part/serializers.py:1771
+#: part/serializers.py:1799
msgid "No matching part found"
msgstr ""
-#: part/serializers.py:1774
+#: part/serializers.py:1802
msgid "Part is not designated as a component"
msgstr ""
-#: part/serializers.py:1783
+#: part/serializers.py:1811
msgid "Quantity not provided"
msgstr "Nie podano ilości"
-#: part/serializers.py:1791
+#: part/serializers.py:1819
msgid "Invalid quantity"
msgstr "Nieprawidłowa ilość"
-#: part/serializers.py:1812
+#: part/serializers.py:1840
msgid "At least one BOM item is required"
msgstr ""
@@ -7221,7 +7247,7 @@ msgid "Validate BOM"
msgstr "Weryfikuj BOM"
#: part/templates/part/detail.html:283 part/templates/part/detail.html:284
-#: templates/js/translated/bom.js:1314 templates/js/translated/bom.js:1315
+#: templates/js/translated/bom.js:1320 templates/js/translated/bom.js:1321
msgid "Add BOM Item"
msgstr "Dodaj część do BOM"
@@ -7405,7 +7431,7 @@ msgstr ""
msgid "Allocated to Sales Orders"
msgstr "Przypisane do zamówień sprzedaży"
-#: part/templates/part/part_base.html:235 templates/js/translated/bom.js:1213
+#: part/templates/part/part_base.html:235 templates/js/translated/bom.js:1219
msgid "Can Build"
msgstr ""
@@ -8784,7 +8810,7 @@ msgstr "Wybierz pasującą część dostawcy dla tego towaru"
msgid "Where is this stock item located?"
msgstr ""
-#: stock/models.py:786 stock/serializers.py:1318
+#: stock/models.py:786 stock/serializers.py:1324
msgid "Packaging this stock item is stored in"
msgstr ""
@@ -8796,7 +8822,7 @@ msgstr ""
msgid "Serial number for this item"
msgstr ""
-#: stock/models.py:830 stock/serializers.py:1301
+#: stock/models.py:830 stock/serializers.py:1307
msgid "Batch code for this stock item"
msgstr ""
@@ -8905,7 +8931,7 @@ msgstr ""
msgid "Serialized stock cannot be merged"
msgstr ""
-#: stock/models.py:1639 stock/serializers.py:1207
+#: stock/models.py:1639 stock/serializers.py:1213
msgid "Duplicate stock items"
msgstr ""
@@ -8986,7 +9012,7 @@ msgstr ""
msgid "Enter serial numbers for new items"
msgstr ""
-#: stock/serializers.py:473 stock/serializers.py:1164 stock/serializers.py:1420
+#: stock/serializers.py:473 stock/serializers.py:1170 stock/serializers.py:1426
msgid "Destination stock location"
msgstr ""
@@ -9059,77 +9085,78 @@ msgstr ""
msgid "No stock items selected"
msgstr ""
-#: stock/serializers.py:863 stock/templates/stock/location.html:165
+#: stock/serializers.py:863 stock/serializers.py:926
+#: stock/templates/stock/location.html:165
#: stock/templates/stock/location.html:213
#: stock/templates/stock/location_sidebar.html:5
msgid "Sublocations"
msgstr "Podlokalizacje"
-#: stock/serializers.py:1036
+#: stock/serializers.py:1042
msgid "Part must be salable"
msgstr "Część musi być dostępna do sprzedaży"
-#: stock/serializers.py:1040
+#: stock/serializers.py:1046
msgid "Item is allocated to a sales order"
msgstr ""
-#: stock/serializers.py:1044
+#: stock/serializers.py:1050
msgid "Item is allocated to a build order"
msgstr ""
-#: stock/serializers.py:1068
+#: stock/serializers.py:1074
msgid "Customer to assign stock items"
msgstr ""
-#: stock/serializers.py:1074
+#: stock/serializers.py:1080
msgid "Selected company is not a customer"
msgstr ""
-#: stock/serializers.py:1082
+#: stock/serializers.py:1088
msgid "Stock assignment notes"
msgstr ""
-#: stock/serializers.py:1092 stock/serializers.py:1346
+#: stock/serializers.py:1098 stock/serializers.py:1352
msgid "A list of stock items must be provided"
msgstr ""
-#: stock/serializers.py:1171
+#: stock/serializers.py:1177
msgid "Stock merging notes"
msgstr ""
-#: stock/serializers.py:1176
+#: stock/serializers.py:1182
msgid "Allow mismatched suppliers"
msgstr ""
-#: stock/serializers.py:1177
+#: stock/serializers.py:1183
msgid "Allow stock items with different supplier parts to be merged"
msgstr ""
-#: stock/serializers.py:1182
+#: stock/serializers.py:1188
msgid "Allow mismatched status"
msgstr ""
-#: stock/serializers.py:1183
+#: stock/serializers.py:1189
msgid "Allow stock items with different status codes to be merged"
msgstr ""
-#: stock/serializers.py:1193
+#: stock/serializers.py:1199
msgid "At least two stock items must be provided"
msgstr ""
-#: stock/serializers.py:1260
+#: stock/serializers.py:1266
msgid "No Change"
msgstr ""
-#: stock/serializers.py:1289
+#: stock/serializers.py:1295
msgid "StockItem primary key value"
msgstr ""
-#: stock/serializers.py:1308
+#: stock/serializers.py:1314
msgid "Stock item status code"
msgstr ""
-#: stock/serializers.py:1336
+#: stock/serializers.py:1342
msgid "Stock transaction notes"
msgstr ""
@@ -10662,7 +10689,7 @@ msgid "The following parts are low on required stock"
msgstr ""
#: templates/email/build_order_required_stock.html:18
-#: templates/js/translated/bom.js:1668 templates/js/translated/build.js:2557
+#: templates/js/translated/bom.js:1674 templates/js/translated/build.js:2557
msgid "Required Quantity"
msgstr "Wymagana ilość"
@@ -10676,7 +10703,7 @@ msgid "Click on the following link to view this part"
msgstr ""
#: templates/email/low_stock_notification.html:18
-#: templates/js/translated/part.js:3209
+#: templates/js/translated/part.js:3218
msgid "Minimum Quantity"
msgstr "Minimalna ilość"
@@ -11051,62 +11078,66 @@ msgstr ""
msgid "No pricing available"
msgstr ""
-#: templates/js/translated/bom.js:1182 templates/js/translated/build.js:2596
+#: templates/js/translated/bom.js:1184 templates/js/translated/build.js:2622
+msgid "External stock"
+msgstr ""
+
+#: templates/js/translated/bom.js:1188 templates/js/translated/build.js:2596
#: templates/js/translated/sales_order.js:1910
msgid "No Stock Available"
msgstr ""
-#: templates/js/translated/bom.js:1187 templates/js/translated/build.js:2600
+#: templates/js/translated/bom.js:1193 templates/js/translated/build.js:2600
msgid "Includes variant and substitute stock"
msgstr ""
-#: templates/js/translated/bom.js:1189 templates/js/translated/build.js:2602
+#: templates/js/translated/bom.js:1195 templates/js/translated/build.js:2602
#: templates/js/translated/part.js:1256
#: templates/js/translated/sales_order.js:1907
msgid "Includes variant stock"
msgstr ""
-#: templates/js/translated/bom.js:1191 templates/js/translated/build.js:2604
+#: templates/js/translated/bom.js:1197 templates/js/translated/build.js:2604
msgid "Includes substitute stock"
msgstr ""
-#: templates/js/translated/bom.js:1219 templates/js/translated/build.js:2587
+#: templates/js/translated/bom.js:1225 templates/js/translated/build.js:2587
msgid "Consumable item"
msgstr ""
-#: templates/js/translated/bom.js:1279
+#: templates/js/translated/bom.js:1285
msgid "Validate BOM Item"
msgstr ""
-#: templates/js/translated/bom.js:1281
+#: templates/js/translated/bom.js:1287
msgid "This line has been validated"
msgstr ""
-#: templates/js/translated/bom.js:1283
+#: templates/js/translated/bom.js:1289
msgid "Edit substitute parts"
msgstr ""
-#: templates/js/translated/bom.js:1285 templates/js/translated/bom.js:1480
+#: templates/js/translated/bom.js:1291 templates/js/translated/bom.js:1486
msgid "Edit BOM Item"
msgstr ""
-#: templates/js/translated/bom.js:1287
+#: templates/js/translated/bom.js:1293
msgid "Delete BOM Item"
msgstr ""
-#: templates/js/translated/bom.js:1307
+#: templates/js/translated/bom.js:1313
msgid "View BOM"
msgstr ""
-#: templates/js/translated/bom.js:1391
+#: templates/js/translated/bom.js:1397
msgid "No BOM items found"
msgstr ""
-#: templates/js/translated/bom.js:1651 templates/js/translated/build.js:2486
+#: templates/js/translated/bom.js:1657 templates/js/translated/build.js:2486
msgid "Required Part"
msgstr ""
-#: templates/js/translated/bom.js:1677
+#: templates/js/translated/bom.js:1683
msgid "Inherited from parent BOM"
msgstr ""
@@ -11449,29 +11480,29 @@ msgstr ""
msgid "Sufficient stock available"
msgstr ""
-#: templates/js/translated/build.js:2643
+#: templates/js/translated/build.js:2647
msgid "Consumable Item"
msgstr ""
-#: templates/js/translated/build.js:2648
+#: templates/js/translated/build.js:2652
msgid "Tracked item"
msgstr ""
-#: templates/js/translated/build.js:2655
+#: templates/js/translated/build.js:2659
#: templates/js/translated/sales_order.js:2016
msgid "Build stock"
msgstr ""
-#: templates/js/translated/build.js:2660 templates/js/translated/stock.js:1829
+#: templates/js/translated/build.js:2664 templates/js/translated/stock.js:1829
msgid "Order stock"
msgstr ""
-#: templates/js/translated/build.js:2664
+#: templates/js/translated/build.js:2668
#: templates/js/translated/sales_order.js:2010
msgid "Allocate stock"
msgstr ""
-#: templates/js/translated/build.js:2668
+#: templates/js/translated/build.js:2672
msgid "Remove stock allocation"
msgstr ""
@@ -12313,64 +12344,64 @@ msgstr ""
msgid "Subscribed category"
msgstr ""
-#: templates/js/translated/part.js:2855
+#: templates/js/translated/part.js:2864
msgid "No test templates matching query"
msgstr ""
-#: templates/js/translated/part.js:2877 templates/js/translated/search.js:342
+#: templates/js/translated/part.js:2886 templates/js/translated/search.js:342
msgid "results"
msgstr ""
-#: templates/js/translated/part.js:2927 templates/js/translated/stock.js:1446
+#: templates/js/translated/part.js:2936 templates/js/translated/stock.js:1446
msgid "Edit test result"
msgstr ""
-#: templates/js/translated/part.js:2928 templates/js/translated/stock.js:1447
+#: templates/js/translated/part.js:2937 templates/js/translated/stock.js:1447
#: templates/js/translated/stock.js:1692
msgid "Delete test result"
msgstr ""
-#: templates/js/translated/part.js:2932
+#: templates/js/translated/part.js:2941
msgid "This test is defined for a parent part"
msgstr ""
-#: templates/js/translated/part.js:2948
+#: templates/js/translated/part.js:2957
msgid "Edit Test Result Template"
msgstr ""
-#: templates/js/translated/part.js:2962
+#: templates/js/translated/part.js:2971
msgid "Delete Test Result Template"
msgstr ""
-#: templates/js/translated/part.js:3041 templates/js/translated/part.js:3042
+#: templates/js/translated/part.js:3050 templates/js/translated/part.js:3051
msgid "No date specified"
msgstr ""
-#: templates/js/translated/part.js:3044
+#: templates/js/translated/part.js:3053
msgid "Specified date is in the past"
msgstr ""
-#: templates/js/translated/part.js:3050
+#: templates/js/translated/part.js:3059
msgid "Speculative"
msgstr ""
-#: templates/js/translated/part.js:3100
+#: templates/js/translated/part.js:3109
msgid "No scheduling information available for this part"
msgstr ""
-#: templates/js/translated/part.js:3106
+#: templates/js/translated/part.js:3115
msgid "Error fetching scheduling information for this part"
msgstr ""
-#: templates/js/translated/part.js:3202
+#: templates/js/translated/part.js:3211
msgid "Scheduled Stock Quantities"
msgstr ""
-#: templates/js/translated/part.js:3218
+#: templates/js/translated/part.js:3227
msgid "Maximum Quantity"
msgstr ""
-#: templates/js/translated/part.js:3263
+#: templates/js/translated/part.js:3272
msgid "Minimum Stock Level"
msgstr ""
@@ -14052,4 +14083,3 @@ msgstr "Uprawnienie do edycji przedmiotów"
#: users/models.py:413
msgid "Permission to delete items"
msgstr "Uprawnienie do usuwania przedmiotów"
-
diff --git a/InvenTree/locale/pt/LC_MESSAGES/django.po b/InvenTree/locale/pt/LC_MESSAGES/django.po
index 4760472c36..64791dc6ae 100644
--- a/InvenTree/locale/pt/LC_MESSAGES/django.po
+++ b/InvenTree/locale/pt/LC_MESSAGES/django.po
@@ -2,7 +2,7 @@ msgid ""
msgstr ""
"Project-Id-Version: inventree\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2024-02-28 04:05+0000\n"
+"POT-Creation-Date: 2024-03-05 00:41+0000\n"
"PO-Revision-Date: 2024-02-28 07:23\n"
"Last-Translator: \n"
"Language-Team: Portuguese, Brazilian\n"
@@ -66,9 +66,9 @@ msgstr "Insira uma Data"
#: report/templates/report/inventree_build_order_base.html:172
#: stock/admin.py:226 stock/models.py:2335 stock/models.py:2451
#: stock/serializers.py:479 stock/serializers.py:632 stock/serializers.py:728
-#: stock/serializers.py:778 stock/serializers.py:1081 stock/serializers.py:1170
-#: stock/serializers.py:1335 stock/templates/stock/stock_sidebar.html:25
-#: templates/js/translated/barcode.js:143 templates/js/translated/bom.js:1259
+#: stock/serializers.py:778 stock/serializers.py:1087 stock/serializers.py:1176
+#: stock/serializers.py:1341 stock/templates/stock/stock_sidebar.html:25
+#: templates/js/translated/barcode.js:143 templates/js/translated/bom.js:1265
#: templates/js/translated/company.js:1674 templates/js/translated/order.js:347
#: templates/js/translated/part.js:1080
#: templates/js/translated/purchase_order.js:2201
@@ -523,7 +523,7 @@ msgstr "Nome"
#: templates/js/translated/order.js:298 templates/js/translated/part.js:1238
#: templates/js/translated/part.js:1483 templates/js/translated/part.js:1621
#: templates/js/translated/part.js:1958 templates/js/translated/part.js:2355
-#: templates/js/translated/part.js:2785 templates/js/translated/part.js:2887
+#: templates/js/translated/part.js:2785 templates/js/translated/part.js:2896
#: templates/js/translated/plugin.js:80
#: templates/js/translated/purchase_order.js:1707
#: templates/js/translated/purchase_order.js:1850
@@ -678,7 +678,7 @@ msgstr "URL do arquivo de imagem remoto"
msgid "Downloading images from remote URL is not enabled"
msgstr "Baixar imagens de URL remota não está habilitado"
-#: InvenTree/status.py:66 part/serializers.py:1120
+#: InvenTree/status.py:66 part/serializers.py:1138
msgid "Background worker check failed"
msgstr "Falha em verificar o histórico do trabalhador"
@@ -960,7 +960,7 @@ msgid "Tracked"
msgstr "Monitorado"
#: build/api.py:285 part/admin.py:144 templates/js/translated/build.js:1741
-#: templates/js/translated/build.js:2626
+#: templates/js/translated/build.js:2630
#: templates/js/translated/sales_order.js:1929
#: templates/js/translated/table_filters.js:571
msgid "Allocated"
@@ -1044,11 +1044,11 @@ msgstr "Pedido de produção para qual este serviço está alocado"
#: build/models.py:199 build/templates/build/build_base.html:97
#: build/templates/build/detail.html:29 company/models.py:1044
#: order/models.py:1389 order/models.py:1532 order/models.py:1533
-#: part/api.py:1528 part/models.py:389 part/models.py:3003 part/models.py:3147
-#: part/models.py:3291 part/models.py:3314 part/models.py:3335
-#: part/models.py:3357 part/models.py:3458 part/models.py:3754
-#: part/models.py:3885 part/models.py:3978 part/models.py:4339
-#: part/serializers.py:1066 part/serializers.py:1631
+#: part/api.py:1528 part/api.py:1820 part/models.py:389 part/models.py:3003
+#: part/models.py:3147 part/models.py:3291 part/models.py:3314
+#: part/models.py:3335 part/models.py:3357 part/models.py:3458
+#: part/models.py:3754 part/models.py:3885 part/models.py:3978
+#: part/models.py:4339 part/serializers.py:1084 part/serializers.py:1659
#: part/templates/part/part_app_base.html:8
#: part/templates/part/part_pricing.html:12
#: part/templates/part/upload_bom.html:52
@@ -1147,7 +1147,7 @@ msgid "Build status code"
msgstr "Código de situação da produção"
#: build/models.py:264 build/serializers.py:280 order/serializers.py:549
-#: stock/models.py:826 stock/serializers.py:1300
+#: stock/models.py:826 stock/serializers.py:1306
#: templates/js/translated/purchase_order.js:1129
msgid "Batch Code"
msgstr "Código de Lote"
@@ -1242,48 +1242,48 @@ msgstr "Código do projeto"
msgid "Project code for this build order"
msgstr "Código do projeto para este pedido de produção"
-#: build/models.py:559
+#: build/models.py:575
#, python-brace-format
msgid "Build order {build} has been completed"
msgstr "O Pedido de produção {build} foi concluído!"
-#: build/models.py:565
+#: build/models.py:581
msgid "A build order has been completed"
msgstr "Um pedido de produção foi concluído"
-#: build/models.py:783 build/models.py:858
+#: build/models.py:799 build/models.py:874
msgid "No build output specified"
msgstr "Nenhuma saída de produção especificada"
-#: build/models.py:786
+#: build/models.py:802
msgid "Build output is already completed"
msgstr "Saída de produção já completada"
-#: build/models.py:789
+#: build/models.py:805
msgid "Build output does not match Build Order"
msgstr "Saída da produção não corresponde ao Pedido de Produção"
-#: build/models.py:862 build/serializers.py:223 build/serializers.py:262
+#: build/models.py:878 build/serializers.py:223 build/serializers.py:262
#: build/serializers.py:831 order/models.py:526 order/serializers.py:401
-#: order/serializers.py:544 part/serializers.py:1423 part/serializers.py:1789
+#: order/serializers.py:544 part/serializers.py:1442 part/serializers.py:1817
#: stock/models.py:665 stock/models.py:1477 stock/serializers.py:450
msgid "Quantity must be greater than zero"
msgstr "Quantidade deve ser maior que zero"
-#: build/models.py:867 build/serializers.py:228
+#: build/models.py:883 build/serializers.py:228
msgid "Quantity cannot be greater than the output quantity"
msgstr "Quantidade não pode ser maior do que a quantidade de saída"
-#: build/models.py:924 build/serializers.py:533
+#: build/models.py:940 build/serializers.py:533
#, python-brace-format
msgid "Build output {serial} has not passed all required tests"
msgstr ""
-#: build/models.py:1286
+#: build/models.py:1302
msgid "Build object"
msgstr "Objeto de produção"
-#: build/models.py:1300 build/models.py:1558 build/serializers.py:210
+#: build/models.py:1316 build/models.py:1574 build/serializers.py:210
#: build/serializers.py:247 build/templates/build/build_base.html:102
#: build/templates/build/detail.html:34 common/models.py:2432
#: order/models.py:1247 order/models.py:1902 order/serializers.py:1306
@@ -1310,7 +1310,7 @@ msgstr "Objeto de produção"
#: templates/js/translated/company.js:1808
#: templates/js/translated/model_renderers.js:230
#: templates/js/translated/order.js:304 templates/js/translated/part.js:961
-#: templates/js/translated/part.js:1811 templates/js/translated/part.js:3332
+#: templates/js/translated/part.js:1811 templates/js/translated/part.js:3341
#: templates/js/translated/pricing.js:381
#: templates/js/translated/pricing.js:474
#: templates/js/translated/pricing.js:522
@@ -1330,38 +1330,38 @@ msgstr "Objeto de produção"
msgid "Quantity"
msgstr "Quantidade"
-#: build/models.py:1301
+#: build/models.py:1317
msgid "Required quantity for build order"
msgstr "Quantidade necessária para o pedido de produção"
-#: build/models.py:1381
+#: build/models.py:1397
msgid "Build item must specify a build output, as master part is marked as trackable"
msgstr "Item de produção deve especificar a saída, pois peças mestres estão marcadas como rastreáveis"
-#: build/models.py:1390
+#: build/models.py:1406
#, python-brace-format
msgid "Allocated quantity ({q}) must not exceed available stock quantity ({a})"
msgstr "Quantidade alocada ({q}) não deve exceder a quantidade disponível em estoque ({a})"
-#: build/models.py:1400 order/models.py:1853
+#: build/models.py:1416 order/models.py:1853
msgid "Stock item is over-allocated"
msgstr "O item do estoque está sobre-alocado"
-#: build/models.py:1406 order/models.py:1856
+#: build/models.py:1422 order/models.py:1856
msgid "Allocation quantity must be greater than zero"
msgstr "Quantidade alocada deve ser maior que zero"
-#: build/models.py:1412
+#: build/models.py:1428
msgid "Quantity must be 1 for serialized stock"
msgstr "Quantidade deve ser 1 para estoque serializado"
-#: build/models.py:1473
+#: build/models.py:1489
msgid "Selected stock item does not match BOM line"
msgstr "Item estoque selecionado não coincide com linha da LDM"
-#: build/models.py:1545 build/serializers.py:811 order/serializers.py:1150
-#: order/serializers.py:1171 stock/serializers.py:544 stock/serializers.py:1019
-#: stock/serializers.py:1131 stock/templates/stock/item_base.html:10
+#: build/models.py:1561 build/serializers.py:811 order/serializers.py:1150
+#: order/serializers.py:1171 stock/serializers.py:544 stock/serializers.py:1025
+#: stock/serializers.py:1137 stock/templates/stock/item_base.html:10
#: stock/templates/stock/item_base.html:23
#: stock/templates/stock/item_base.html:194
#: templates/js/translated/build.js:1742
@@ -1376,19 +1376,19 @@ msgstr "Item estoque selecionado não coincide com linha da LDM"
msgid "Stock Item"
msgstr "Item de estoque"
-#: build/models.py:1546
+#: build/models.py:1562
msgid "Source stock item"
msgstr "Origem do item em estoque"
-#: build/models.py:1559
+#: build/models.py:1575
msgid "Stock quantity to allocate to build"
msgstr "Quantidade do estoque para alocar à produção"
-#: build/models.py:1567
+#: build/models.py:1583
msgid "Install into"
msgstr "Instalar em"
-#: build/models.py:1568
+#: build/models.py:1584
msgid "Destination stock item"
msgstr "Destino do Item do Estoque"
@@ -1452,9 +1452,9 @@ msgid "A list of build outputs must be provided"
msgstr "Uma lista de saídas de produção deve ser fornecida"
#: build/serializers.py:426 build/serializers.py:498 order/serializers.py:533
-#: order/serializers.py:641 order/serializers.py:1646 part/serializers.py:1086
+#: order/serializers.py:641 order/serializers.py:1646 part/serializers.py:1104
#: stock/serializers.py:472 stock/serializers.py:627 stock/serializers.py:723
-#: stock/serializers.py:1163 stock/serializers.py:1419
+#: stock/serializers.py:1169 stock/serializers.py:1425
#: stock/templates/stock/item_base.html:394
#: templates/js/translated/barcode.js:547
#: templates/js/translated/barcode.js:795 templates/js/translated/build.js:999
@@ -1494,7 +1494,7 @@ msgstr "Local para saídas de produção concluídas"
#: build/serializers.py:505 build/templates/build/build_base.html:151
#: build/templates/build/detail.html:62 order/models.py:910
#: order/models.py:2005 order/serializers.py:565 stock/admin.py:165
-#: stock/serializers.py:774 stock/serializers.py:1307
+#: stock/serializers.py:774 stock/serializers.py:1313
#: stock/templates/stock/item_base.html:427
#: templates/js/translated/barcode.js:252 templates/js/translated/build.js:2189
#: templates/js/translated/purchase_order.js:1308
@@ -1602,7 +1602,7 @@ msgstr "Item da linha de produção"
msgid "bom_item.part must point to the same part as the build order"
msgstr "bin_item.part deve indicar a mesma peça do pedido de produção"
-#: build/serializers.py:817 stock/serializers.py:1032
+#: build/serializers.py:817 stock/serializers.py:1038
msgid "Item must be in stock"
msgstr "Item deve estar em estoque"
@@ -1659,44 +1659,45 @@ msgstr "Itens opcionais"
msgid "Allocate optional BOM items to build order"
msgstr "Alocar itens LDM opcionais para o pedido de produção"
-#: build/serializers.py:1096 part/models.py:3895 part/models.py:4331
+#: build/serializers.py:1097 part/models.py:3895 part/models.py:4331
#: stock/api.py:745
msgid "BOM Item"
msgstr "Item LDM"
-#: build/serializers.py:1105 templates/js/translated/index.js:130
+#: build/serializers.py:1106 templates/js/translated/index.js:130
msgid "Allocated Stock"
msgstr "Estoque Alocado"
-#: build/serializers.py:1110 part/admin.py:132 part/bom.py:173
-#: part/serializers.py:1441 part/templates/part/part_base.html:210
-#: templates/js/translated/bom.js:1202 templates/js/translated/build.js:2614
-#: templates/js/translated/part.js:709 templates/js/translated/part.js:2148
+#: build/serializers.py:1111 part/admin.py:132 part/bom.py:173
+#: part/serializers.py:798 part/serializers.py:1460
+#: part/templates/part/part_base.html:210 templates/js/translated/bom.js:1208
+#: templates/js/translated/build.js:2614 templates/js/translated/part.js:709
+#: templates/js/translated/part.js:2148
#: templates/js/translated/table_filters.js:170
msgid "On Order"
msgstr "No pedido"
-#: build/serializers.py:1115 part/serializers.py:1443
+#: build/serializers.py:1116 part/serializers.py:1462
#: templates/js/translated/build.js:2618
#: templates/js/translated/table_filters.js:360
msgid "In Production"
msgstr "Em Produção"
-#: build/serializers.py:1120 part/bom.py:172 part/serializers.py:1454
+#: build/serializers.py:1121 part/bom.py:172 part/serializers.py:1473
#: part/templates/part/part_base.html:192
#: templates/js/translated/sales_order.js:1893
msgid "Available Stock"
msgstr "Estoque Disponível"
-#: build/tasks.py:149
+#: build/tasks.py:171
msgid "Stock required for build order"
msgstr "Estoque obrigatório para o pedido de produção"
-#: build/tasks.py:166
+#: build/tasks.py:188
msgid "Overdue Build Order"
msgstr "Pedido de produção vencido"
-#: build/tasks.py:171
+#: build/tasks.py:193
#, python-brace-format
msgid "Build order {bo} is now overdue"
msgstr "Pedido de produção {bo} está atrasada"
@@ -1990,27 +1991,31 @@ msgstr "Pedir peças necessárias"
msgid "Order Parts"
msgstr "Pedir Peças"
-#: build/templates/build/detail.html:210
+#: build/templates/build/detail.html:205
+msgid "Available stock has been filtered based on specified source location for this build order"
+msgstr ""
+
+#: build/templates/build/detail.html:215
msgid "Incomplete Build Outputs"
msgstr "Saída de Produção Incompletas"
-#: build/templates/build/detail.html:214
+#: build/templates/build/detail.html:219
msgid "Create new build output"
msgstr "Criar nova saída de produção"
-#: build/templates/build/detail.html:215
+#: build/templates/build/detail.html:220
msgid "New Build Output"
msgstr "Nova saída de produção"
-#: build/templates/build/detail.html:232 build/templates/build/sidebar.html:15
+#: build/templates/build/detail.html:237 build/templates/build/sidebar.html:15
msgid "Consumed Stock"
msgstr "Consumir estoque"
-#: build/templates/build/detail.html:244
+#: build/templates/build/detail.html:249
msgid "Completed Build Outputs"
msgstr "Saídas de Produção concluídas"
-#: build/templates/build/detail.html:256 build/templates/build/sidebar.html:19
+#: build/templates/build/detail.html:261 build/templates/build/sidebar.html:19
#: company/templates/company/detail.html:229
#: company/templates/company/manufacturer_part.html:141
#: company/templates/company/manufacturer_part_sidebar.html:9
@@ -2026,15 +2031,15 @@ msgstr "Saídas de Produção concluídas"
msgid "Attachments"
msgstr "Anexos"
-#: build/templates/build/detail.html:271
+#: build/templates/build/detail.html:276
msgid "Build Notes"
msgstr "Notas de produção"
-#: build/templates/build/detail.html:426
+#: build/templates/build/detail.html:434
msgid "Allocation Complete"
msgstr "Alocação Completa"
-#: build/templates/build/detail.html:427
+#: build/templates/build/detail.html:435
msgid "All lines have been fully allocated"
msgstr "Todas as linhas foram totalmente alocadas"
@@ -2436,7 +2441,7 @@ msgid "Parts are templates by default"
msgstr "Peças são modelos por padrão"
#: common/models.py:1456 part/admin.py:91 part/admin.py:431 part/models.py:1015
-#: templates/js/translated/bom.js:1633
+#: templates/js/translated/bom.js:1639
#: templates/js/translated/table_filters.js:330
#: templates/js/translated/table_filters.js:721
msgid "Assembly"
@@ -3495,7 +3500,7 @@ msgstr "Salvar as últimas máquinas de impressão usadas para um usuário"
msgid "Price break quantity"
msgstr "Quantidade de Parcelamentos"
-#: common/models.py:2440 company/serializers.py:484 order/admin.py:42
+#: common/models.py:2440 company/serializers.py:486 order/admin.py:42
#: order/models.py:1321 order/models.py:2226
#: templates/js/translated/company.js:1813 templates/js/translated/part.js:1885
#: templates/js/translated/pricing.js:621
@@ -3972,7 +3977,7 @@ msgstr "Selecionar peça"
#: company/models.py:495 company/templates/company/company_base.html:76
#: company/templates/company/manufacturer_part.html:90
-#: company/templates/company/supplier_part.html:145 part/serializers.py:497
+#: company/templates/company/supplier_part.html:145 part/serializers.py:505
#: stock/templates/stock/item_base.html:207
#: templates/js/translated/company.js:506
#: templates/js/translated/company.js:1108
@@ -3987,7 +3992,7 @@ msgid "Select manufacturer"
msgstr "Selecionar fabricante"
#: company/models.py:502 company/templates/company/manufacturer_part.html:101
-#: company/templates/company/supplier_part.html:153 part/serializers.py:507
+#: company/templates/company/supplier_part.html:153 part/serializers.py:515
#: templates/js/translated/company.js:351
#: templates/js/translated/company.js:1107
#: templates/js/translated/company.js:1302
@@ -4059,7 +4064,7 @@ msgstr "Parte do fabricante vinculado deve fazer referência à mesma peça base
#: company/models.py:795 company/templates/company/company_base.html:81
#: company/templates/company/supplier_part.html:129 order/models.py:453
#: order/templates/order/order_base.html:136 part/bom.py:272 part/bom.py:310
-#: part/serializers.py:481 plugin/builtin/suppliers/digikey.py:25
+#: part/serializers.py:489 plugin/builtin/suppliers/digikey.py:25
#: plugin/builtin/suppliers/lcsc.py:26 plugin/builtin/suppliers/mouser.py:24
#: plugin/builtin/suppliers/tme.py:26 stock/templates/stock/item_base.html:224
#: templates/email/overdue_purchase_order.html:16
@@ -4076,7 +4081,7 @@ msgstr "Fornecedor"
msgid "Select supplier"
msgstr "Selecione o fornecedor"
-#: company/models.py:802 part/serializers.py:492
+#: company/models.py:802 part/serializers.py:500
msgid "Supplier stock keeping unit"
msgstr "Unidade de reserva de estoque fornecedor"
@@ -4112,7 +4117,7 @@ msgid "Minimum charge (e.g. stocking fee)"
msgstr "Taxa mínima (ex.: taxa de estoque)"
#: company/models.py:851 company/templates/company/supplier_part.html:160
-#: stock/admin.py:224 stock/models.py:785 stock/serializers.py:1317
+#: stock/admin.py:224 stock/models.py:785 stock/serializers.py:1323
#: stock/templates/stock/item_base.html:240
#: templates/js/translated/company.js:1636
#: templates/js/translated/stock.js:2387
@@ -4157,7 +4162,7 @@ msgstr "Disponibilidade Atualizada"
msgid "Date of last update of availability data"
msgstr "Data da última atualização da disponibilidade dos dados"
-#: company/serializers.py:153
+#: company/serializers.py:155
msgid "Default currency used for this supplier"
msgstr "Moeda padrão utilizada para este fornecedor"
@@ -4218,7 +4223,7 @@ msgstr "Excluir imagem"
#: company/templates/company/company_base.html:86 order/models.py:898
#: order/models.py:1993 order/templates/order/return_order_base.html:131
#: order/templates/order/sales_order_base.html:144 stock/models.py:807
-#: stock/models.py:808 stock/serializers.py:1067
+#: stock/models.py:808 stock/serializers.py:1073
#: stock/templates/stock/item_base.html:405
#: templates/email/overdue_sales_order.html:16
#: templates/js/translated/company.js:502
@@ -4429,8 +4434,9 @@ msgstr "Nenhuma informação do fabricante disponível"
#: company/templates/company/manufacturer_part.html:119
#: company/templates/company/supplier_part.html:15 company/views.py:31
-#: part/admin.py:122 part/templates/part/part_sidebar.html:33
-#: templates/InvenTree/search.html:190 templates/navbar.html:48
+#: part/admin.py:122 part/serializers.py:802
+#: part/templates/part/part_sidebar.html:33 templates/InvenTree/search.html:190
+#: templates/navbar.html:48
msgid "Suppliers"
msgstr "Fornecedores"
@@ -4528,7 +4534,7 @@ msgid "No supplier information available"
msgstr "Nenhuma informação do fornecedor está disponível"
#: company/templates/company/supplier_part.html:139 part/bom.py:279
-#: part/bom.py:311 part/serializers.py:491
+#: part/bom.py:311 part/serializers.py:499
#: templates/js/translated/company.js:349 templates/js/translated/part.js:1786
#: templates/js/translated/pricing.js:510
#: templates/js/translated/purchase_order.js:1851
@@ -4577,10 +4583,12 @@ msgstr "Vincular Código de Barras à Peça do Fornecedor"
msgid "Update Part Availability"
msgstr "Atualizar Disponibilidade de Peças"
-#: company/templates/company/supplier_part_sidebar.html:5 part/stocktake.py:223
+#: company/templates/company/supplier_part_sidebar.html:5
+#: part/serializers.py:801 part/stocktake.py:223
#: part/templates/part/category.html:183
#: part/templates/part/category_sidebar.html:17 stock/admin.py:69
-#: stock/serializers.py:760 stock/templates/stock/location.html:170
+#: stock/serializers.py:760 stock/serializers.py:924
+#: stock/templates/stock/location.html:170
#: stock/templates/stock/location.html:184
#: stock/templates/stock/location.html:196
#: stock/templates/stock/location_sidebar.html:7
@@ -4640,7 +4648,7 @@ msgid "Label template file"
msgstr "Arquivo de modelo de etiqueta"
#: label/models.py:143 part/models.py:3484 report/models.py:322
-#: templates/js/translated/part.js:2891
+#: templates/js/translated/part.js:2900
#: templates/js/translated/table_filters.js:481
msgid "Enabled"
msgstr "Habilitado"
@@ -5733,7 +5741,7 @@ msgid "Pending Shipments"
msgstr "Envios Pendentes"
#: order/templates/order/sales_order_detail.html:71
-#: templates/js/translated/bom.js:1271 templates/js/translated/filters.js:296
+#: templates/js/translated/bom.js:1277 templates/js/translated/filters.js:296
msgid "Actions"
msgstr "Ações"
@@ -5861,10 +5869,10 @@ msgstr "Nome Paternal"
msgid "Category Path"
msgstr "Caminho da Categoria"
-#: part/admin.py:323 part/models.py:390 part/serializers.py:259
-#: part/serializers.py:373 part/templates/part/cat_link.html:3
-#: part/templates/part/category.html:23 part/templates/part/category.html:141
-#: part/templates/part/category.html:161
+#: part/admin.py:323 part/models.py:390 part/serializers.py:112
+#: part/serializers.py:265 part/serializers.py:381
+#: part/templates/part/cat_link.html:3 part/templates/part/category.html:23
+#: part/templates/part/category.html:141 part/templates/part/category.html:161
#: part/templates/part/category_sidebar.html:9
#: templates/InvenTree/index.html:36 templates/InvenTree/search.html:84
#: templates/InvenTree/settings/sidebar.html:47
@@ -5889,13 +5897,13 @@ msgstr "IPN Paternal"
msgid "Part IPN"
msgstr "IPN da Peça"
-#: part/admin.py:421 part/serializers.py:1220
+#: part/admin.py:421 part/serializers.py:1238
#: templates/js/translated/pricing.js:358
#: templates/js/translated/pricing.js:1024
msgid "Minimum Price"
msgstr "Preço Mínimo"
-#: part/admin.py:426 part/serializers.py:1235
+#: part/admin.py:426 part/serializers.py:1253
#: templates/js/translated/pricing.js:353
#: templates/js/translated/pricing.js:1032
msgid "Maximum Price"
@@ -5974,7 +5982,7 @@ msgid "This option must be selected"
msgstr "Esta opção deve ser selecionada"
#: part/api.py:1541 part/models.py:895 part/models.py:3385 part/models.py:3831
-#: part/serializers.py:388 part/serializers.py:1076
+#: part/serializers.py:396 part/serializers.py:1094
#: part/templates/part/part_base.html:260 stock/api.py:733
#: templates/InvenTree/settings/settings_staff_js.html:300
#: templates/js/translated/notification.js:60
@@ -5982,12 +5990,17 @@ msgstr "Esta opção deve ser selecionada"
msgid "Category"
msgstr "Categoria"
+#: part/api.py:1828
+msgid "Uses"
+msgstr ""
+
#: part/bom.py:170 part/models.py:100 part/models.py:938
#: part/templates/part/category.html:116 part/templates/part/part_base.html:367
msgid "Default Location"
msgstr "Local Padrão"
-#: part/bom.py:171 templates/email/low_stock_notification.html:16
+#: part/bom.py:171 part/serializers.py:803
+#: templates/email/low_stock_notification.html:16
msgid "Total Stock"
msgstr "Estoque Total"
@@ -6010,7 +6023,8 @@ msgstr "Categorias de Peça"
msgid "Default location for parts in this category"
msgstr "Local padrão para peças desta categoria"
-#: part/models.py:106 stock/models.py:165 templates/js/translated/stock.js:2736
+#: part/models.py:106 stock/models.py:165 templates/js/translated/part.js:2810
+#: templates/js/translated/stock.js:2736
#: templates/js/translated/table_filters.js:239
#: templates/js/translated/table_filters.js:283
msgid "Structural"
@@ -6418,7 +6432,7 @@ msgstr "Modelos de teste só podem ser criados para peças rastreáveis"
msgid "Test with this name already exists for this part"
msgstr "O teste com este nome já existe para esta peça"
-#: part/models.py:3464 templates/js/translated/part.js:2870
+#: part/models.py:3464 templates/js/translated/part.js:2879
msgid "Test Name"
msgstr "Nome de Teste"
@@ -6446,7 +6460,7 @@ msgstr "Digite a descrição para este teste"
msgid "Is this test enabled?"
msgstr ""
-#: part/models.py:3489 templates/js/translated/part.js:2899
+#: part/models.py:3489 templates/js/translated/part.js:2908
#: templates/js/translated/table_filters.js:477
msgid "Required"
msgstr "Requerido"
@@ -6455,7 +6469,7 @@ msgstr "Requerido"
msgid "Is this test required to pass?"
msgstr "Este teste é obrigatório passar?"
-#: part/models.py:3495 templates/js/translated/part.js:2907
+#: part/models.py:3495 templates/js/translated/part.js:2916
msgid "Requires Value"
msgstr "Requer Valor"
@@ -6463,7 +6477,7 @@ msgstr "Requer Valor"
msgid "Does this test require a value when adding a test result?"
msgstr "Este teste requer um valor ao adicionar um resultado de teste?"
-#: part/models.py:3501 templates/js/translated/part.js:2914
+#: part/models.py:3501 templates/js/translated/part.js:2923
msgid "Requires Attachment"
msgstr "Anexo obrigatório"
@@ -6685,311 +6699,329 @@ msgstr "Relacionamento da peça não pode ser criada com ela mesma"
msgid "Duplicate relationship already exists"
msgstr "Relação duplicada já existe"
-#: part/serializers.py:128 part/templates/part/category.html:122
-#: part/templates/part/category.html:207
+#: part/serializers.py:114 part/serializers.py:134
+#: part/templates/part/category.html:122 part/templates/part/category.html:207
#: part/templates/part/category_sidebar.html:7
msgid "Subcategories"
msgstr "Sub-categorias"
-#: part/serializers.py:172
+#: part/serializers.py:178
msgid "Results"
msgstr ""
-#: part/serializers.py:173
+#: part/serializers.py:179
msgid "Number of results recorded against this template"
msgstr ""
-#: part/serializers.py:197 part/serializers.py:215 stock/serializers.py:384
+#: part/serializers.py:203 part/serializers.py:221 stock/serializers.py:384
msgid "Purchase currency of this stock item"
msgstr "Moeda de compra deste item de estoque"
-#: part/serializers.py:260
+#: part/serializers.py:266
msgid "Number of parts using this template"
msgstr ""
-#: part/serializers.py:379
+#: part/serializers.py:387
msgid "No parts selected"
msgstr "Nenhuma parte selecionada"
-#: part/serializers.py:389
+#: part/serializers.py:397
msgid "Select category"
msgstr "Selecionar categoria"
-#: part/serializers.py:419
+#: part/serializers.py:427
msgid "Original Part"
msgstr "Peça Original"
-#: part/serializers.py:420
+#: part/serializers.py:428
msgid "Select original part to duplicate"
msgstr "Selecione a peça original para duplicar"
-#: part/serializers.py:425
+#: part/serializers.py:433
msgid "Copy Image"
msgstr "Copiar imagem"
-#: part/serializers.py:426
+#: part/serializers.py:434
msgid "Copy image from original part"
msgstr "Copiar imagem da peça original"
-#: part/serializers.py:432 part/templates/part/detail.html:277
+#: part/serializers.py:440 part/templates/part/detail.html:277
msgid "Copy BOM"
msgstr "Copiar LDM"
-#: part/serializers.py:433
+#: part/serializers.py:441
msgid "Copy bill of materials from original part"
msgstr "Copiar lista de materiais da peça original"
-#: part/serializers.py:439
+#: part/serializers.py:447
msgid "Copy Parameters"
msgstr "Copiar Parâmetros"
-#: part/serializers.py:440
+#: part/serializers.py:448
msgid "Copy parameter data from original part"
msgstr "Copiar dados do parâmetro da peça original"
-#: part/serializers.py:446
+#: part/serializers.py:454
msgid "Copy Notes"
msgstr "Copiar Notas"
-#: part/serializers.py:447
+#: part/serializers.py:455
msgid "Copy notes from original part"
msgstr "Copiar imagem da peça original"
-#: part/serializers.py:460
+#: part/serializers.py:468
msgid "Initial Stock Quantity"
msgstr "Quantidade Inicial de Estoque"
-#: part/serializers.py:462
+#: part/serializers.py:470
msgid "Specify initial stock quantity for this Part. If quantity is zero, no stock is added."
msgstr "Especificar a quantidade inicial de estoque para a peça. Se for zero, nenhum estoque é adicionado."
-#: part/serializers.py:469
+#: part/serializers.py:477
msgid "Initial Stock Location"
msgstr "Local Inicial do Estoque"
-#: part/serializers.py:470
+#: part/serializers.py:478
msgid "Specify initial stock location for this Part"
msgstr "Especifique o local do estoque inicial para esta Peça"
-#: part/serializers.py:482
+#: part/serializers.py:490
msgid "Select supplier (or leave blank to skip)"
msgstr "Selecione o fornecedor (ou deixe em branco para pular)"
-#: part/serializers.py:498
+#: part/serializers.py:506
msgid "Select manufacturer (or leave blank to skip)"
msgstr "Selecione fabricante (ou deixe em branco para pular)"
-#: part/serializers.py:508
+#: part/serializers.py:516
msgid "Manufacturer part number"
msgstr "Número de Peça do Fabricante"
-#: part/serializers.py:515
+#: part/serializers.py:523
msgid "Selected company is not a valid supplier"
msgstr "A empresa selecionada não é um fornecedor válido"
-#: part/serializers.py:524
+#: part/serializers.py:532
msgid "Selected company is not a valid manufacturer"
msgstr "A empresa selecionada não é um fabricante válido"
-#: part/serializers.py:535
+#: part/serializers.py:543
msgid "Manufacturer part matching this MPN already exists"
msgstr "A peça do fabricante que corresponde a essa MPN já existe"
-#: part/serializers.py:542
+#: part/serializers.py:550
msgid "Supplier part matching this SKU already exists"
msgstr "A peça do fornecedor que corresponde a essa SKU já existe"
-#: part/serializers.py:815 part/templates/part/copy_part.html:9
+#: part/serializers.py:804
+#, fuzzy
+#| msgid "Exclude External Stock"
+msgid "External Stock"
+msgstr "Excluir Estoque externo"
+
+#: part/serializers.py:806
+#, fuzzy
+#| msgid "Allocated Stock"
+msgid "Unallocated Stock"
+msgstr "Estoque Alocado"
+
+#: part/serializers.py:808
+#, fuzzy
+#| msgid "Part Stock"
+msgid "Variant Stock"
+msgstr "Estoque da Peça"
+
+#: part/serializers.py:833 part/templates/part/copy_part.html:9
#: templates/js/translated/part.js:471
msgid "Duplicate Part"
msgstr "Peça duplicada"
-#: part/serializers.py:816
+#: part/serializers.py:834
msgid "Copy initial data from another Part"
msgstr "Copiar dados iniciais de outra peça"
-#: part/serializers.py:822 templates/js/translated/part.js:102
+#: part/serializers.py:840 templates/js/translated/part.js:102
msgid "Initial Stock"
msgstr "Estoque inicial"
-#: part/serializers.py:823
+#: part/serializers.py:841
msgid "Create Part with initial stock quantity"
msgstr "Criar peça com a quantidade inicial de estoque"
-#: part/serializers.py:829
+#: part/serializers.py:847
msgid "Supplier Information"
msgstr "Informações do Fornecedor"
-#: part/serializers.py:830
+#: part/serializers.py:848
msgid "Add initial supplier information for this part"
msgstr "Adicionar informação inicial de fornecedor para esta peça"
-#: part/serializers.py:838
+#: part/serializers.py:856
msgid "Copy Category Parameters"
msgstr "Copiar Parâmetros da Categoria"
-#: part/serializers.py:839
+#: part/serializers.py:857
msgid "Copy parameter templates from selected part category"
msgstr "Copiar modelos de parâmetros a partir de categoria de peça selecionada"
-#: part/serializers.py:844
+#: part/serializers.py:862
msgid "Existing Image"
msgstr "Imagem Existente"
-#: part/serializers.py:845
+#: part/serializers.py:863
msgid "Filename of an existing part image"
msgstr "Nome de arquivo de uma imagem de peça existente"
-#: part/serializers.py:862
+#: part/serializers.py:880
msgid "Image file does not exist"
msgstr "A imagem não existe"
-#: part/serializers.py:1068
+#: part/serializers.py:1086
msgid "Limit stocktake report to a particular part, and any variant parts"
msgstr "Limitar o relatório de balanço a uma determinada peça e quaisquer peças variantes"
-#: part/serializers.py:1078
+#: part/serializers.py:1096
msgid "Limit stocktake report to a particular part category, and any child categories"
msgstr "Limitar o relatório de balanço a uma determinada categoria, e qualquer peças filhas"
-#: part/serializers.py:1088
+#: part/serializers.py:1106
msgid "Limit stocktake report to a particular stock location, and any child locations"
msgstr "Limitar o relatório de balanço a um determinado local de estoque, e qualquer local filho"
-#: part/serializers.py:1094
+#: part/serializers.py:1112
msgid "Exclude External Stock"
msgstr "Excluir Estoque externo"
-#: part/serializers.py:1095
+#: part/serializers.py:1113
msgid "Exclude stock items in external locations"
msgstr "Excluir itens de estoque em locais externos"
-#: part/serializers.py:1100
+#: part/serializers.py:1118
msgid "Generate Report"
msgstr "Gerar relatório"
-#: part/serializers.py:1101
+#: part/serializers.py:1119
msgid "Generate report file containing calculated stocktake data"
msgstr "Gerar arquivo de relatório contendo dados de estoque calculados"
-#: part/serializers.py:1106
+#: part/serializers.py:1124
msgid "Update Parts"
msgstr "Atualizar Peças"
-#: part/serializers.py:1107
+#: part/serializers.py:1125
msgid "Update specified parts with calculated stocktake data"
msgstr "Atualizar peças especificadas com dados de estoque calculados"
-#: part/serializers.py:1115
+#: part/serializers.py:1133
msgid "Stocktake functionality is not enabled"
msgstr "Função de Balanço de Estoque não está ativada"
-#: part/serializers.py:1221
+#: part/serializers.py:1239
msgid "Override calculated value for minimum price"
msgstr "Sobrepor valor calculado para preço mínimo"
-#: part/serializers.py:1228
+#: part/serializers.py:1246
msgid "Minimum price currency"
msgstr "Moeda do preço mínimo"
-#: part/serializers.py:1236
+#: part/serializers.py:1254
msgid "Override calculated value for maximum price"
msgstr "Sobrepor valor calculado para preço máximo"
-#: part/serializers.py:1243
+#: part/serializers.py:1261
msgid "Maximum price currency"
msgstr "Moeda do preço máximo"
-#: part/serializers.py:1272
+#: part/serializers.py:1290
msgid "Update"
msgstr "Atualizar"
-#: part/serializers.py:1273
+#: part/serializers.py:1291
msgid "Update pricing for this part"
msgstr "Atualizar preços desta peça"
-#: part/serializers.py:1296
+#: part/serializers.py:1314
#, python-brace-format
msgid "Could not convert from provided currencies to {default_currency}"
msgstr "Não foi possível converter das moedas fornecidas para {default_currency}"
-#: part/serializers.py:1303
+#: part/serializers.py:1321
msgid "Minimum price must not be greater than maximum price"
msgstr "Preço mínimo não pode ser maior que o preço máximo"
-#: part/serializers.py:1306
+#: part/serializers.py:1324
msgid "Maximum price must not be less than minimum price"
msgstr "Preço máximo não pode ser menor que o preço mínimo"
-#: part/serializers.py:1632
+#: part/serializers.py:1660
msgid "Select part to copy BOM from"
msgstr "Selecionar peça para copiar a LDM"
-#: part/serializers.py:1640
+#: part/serializers.py:1668
msgid "Remove Existing Data"
msgstr "Remover Dado Existente"
-#: part/serializers.py:1641
+#: part/serializers.py:1669
msgid "Remove existing BOM items before copying"
msgstr "Remova itens LDM existentes antes de copiar"
-#: part/serializers.py:1646
+#: part/serializers.py:1674
msgid "Include Inherited"
msgstr "Incluir Herdados"
-#: part/serializers.py:1647
+#: part/serializers.py:1675
msgid "Include BOM items which are inherited from templated parts"
msgstr "Incluir itens LDM que são herdados de peças modelo"
-#: part/serializers.py:1652
+#: part/serializers.py:1680
msgid "Skip Invalid Rows"
msgstr "Pular Linhas inválidas"
-#: part/serializers.py:1653
+#: part/serializers.py:1681
msgid "Enable this option to skip invalid rows"
msgstr "Habilitar esta opção para pular linhas inválidas"
-#: part/serializers.py:1658
+#: part/serializers.py:1686
msgid "Copy Substitute Parts"
msgstr "Copiar Peças Substitutas"
-#: part/serializers.py:1659
+#: part/serializers.py:1687
msgid "Copy substitute parts when duplicate BOM items"
msgstr "Copiar peças de substitutas quando duplicar itens de LDM"
-#: part/serializers.py:1693
+#: part/serializers.py:1721
msgid "Clear Existing BOM"
msgstr "Limpar LDM Existente"
-#: part/serializers.py:1694
+#: part/serializers.py:1722
msgid "Delete existing BOM items before uploading"
msgstr "Apagar itens LDM existentes antes de carregar"
-#: part/serializers.py:1724
+#: part/serializers.py:1752
msgid "No part column specified"
msgstr "Nenhuma coluna de peça especificada"
-#: part/serializers.py:1768
+#: part/serializers.py:1796
msgid "Multiple matching parts found"
msgstr "Múltiplas peças correspondentes encontradas"
-#: part/serializers.py:1771
+#: part/serializers.py:1799
msgid "No matching part found"
msgstr "Nenhuma peça correspondente encontrada"
-#: part/serializers.py:1774
+#: part/serializers.py:1802
msgid "Part is not designated as a component"
msgstr "Peça não está designada como componente"
-#: part/serializers.py:1783
+#: part/serializers.py:1811
msgid "Quantity not provided"
msgstr "Quantidade não foi fornecida"
-#: part/serializers.py:1791
+#: part/serializers.py:1819
msgid "Invalid quantity"
msgstr "Quantidade Inválida"
-#: part/serializers.py:1812
+#: part/serializers.py:1840
msgid "At least one BOM item is required"
msgstr "Pelo menos um item LDM é necessário"
@@ -7221,7 +7253,7 @@ msgid "Validate BOM"
msgstr "Validar LDM"
#: part/templates/part/detail.html:283 part/templates/part/detail.html:284
-#: templates/js/translated/bom.js:1314 templates/js/translated/bom.js:1315
+#: templates/js/translated/bom.js:1320 templates/js/translated/bom.js:1321
msgid "Add BOM Item"
msgstr "Adicionar Item LDM"
@@ -7405,7 +7437,7 @@ msgstr "Alocado para Pedidos de Construção"
msgid "Allocated to Sales Orders"
msgstr "Alocado para Pedidos de Venda"
-#: part/templates/part/part_base.html:235 templates/js/translated/bom.js:1213
+#: part/templates/part/part_base.html:235 templates/js/translated/bom.js:1219
msgid "Can Build"
msgstr "Pode Produzir"
@@ -8784,7 +8816,7 @@ msgstr "Selecione uma peça do fornecedor correspondente para este item de estoq
msgid "Where is this stock item located?"
msgstr "Onde está localizado este item de estoque?"
-#: stock/models.py:786 stock/serializers.py:1318
+#: stock/models.py:786 stock/serializers.py:1324
msgid "Packaging this stock item is stored in"
msgstr "Embalagem deste item de estoque está armazenado em"
@@ -8796,7 +8828,7 @@ msgstr "Este item está instalado em outro item?"
msgid "Serial number for this item"
msgstr "Número de série para este item"
-#: stock/models.py:830 stock/serializers.py:1301
+#: stock/models.py:830 stock/serializers.py:1307
msgid "Batch code for this stock item"
msgstr "Código do lote para este item de estoque"
@@ -8905,7 +8937,7 @@ msgstr "Item no estoque está em produção no momento"
msgid "Serialized stock cannot be merged"
msgstr "Itens de série não podem ser mesclados"
-#: stock/models.py:1639 stock/serializers.py:1207
+#: stock/models.py:1639 stock/serializers.py:1213
msgid "Duplicate stock items"
msgstr "Item de estoque duplicado"
@@ -8986,7 +9018,7 @@ msgstr "Quantidade não deve exceder a quantidade disponível em estoque ({q})"
msgid "Enter serial numbers for new items"
msgstr "Inserir número de série para novos itens"
-#: stock/serializers.py:473 stock/serializers.py:1164 stock/serializers.py:1420
+#: stock/serializers.py:473 stock/serializers.py:1170 stock/serializers.py:1426
msgid "Destination stock location"
msgstr "Local de destino do estoque"
@@ -9059,77 +9091,78 @@ msgstr "Selecionar itens de estoque para mudar estados"
msgid "No stock items selected"
msgstr "Nenhum item de estoque selecionado"
-#: stock/serializers.py:863 stock/templates/stock/location.html:165
+#: stock/serializers.py:863 stock/serializers.py:926
+#: stock/templates/stock/location.html:165
#: stock/templates/stock/location.html:213
#: stock/templates/stock/location_sidebar.html:5
msgid "Sublocations"
msgstr "Sub-locais"
-#: stock/serializers.py:1036
+#: stock/serializers.py:1042
msgid "Part must be salable"
msgstr "Parte deve ser comercializável"
-#: stock/serializers.py:1040
+#: stock/serializers.py:1046
msgid "Item is allocated to a sales order"
msgstr "Item é alocado para um pedido de venda"
-#: stock/serializers.py:1044
+#: stock/serializers.py:1050
msgid "Item is allocated to a build order"
msgstr "Item está alocado a um pedido de produção"
-#: stock/serializers.py:1068
+#: stock/serializers.py:1074
msgid "Customer to assign stock items"
msgstr "Cliente para atribuir itens de estoque"
-#: stock/serializers.py:1074
+#: stock/serializers.py:1080
msgid "Selected company is not a customer"
msgstr "A empresa selecionada não é um cliente"
-#: stock/serializers.py:1082
+#: stock/serializers.py:1088
msgid "Stock assignment notes"
msgstr "Nodas atribuídas a estoque"
-#: stock/serializers.py:1092 stock/serializers.py:1346
+#: stock/serializers.py:1098 stock/serializers.py:1352
msgid "A list of stock items must be provided"
msgstr "Uma lista de item de estoque deve ser providenciada"
-#: stock/serializers.py:1171
+#: stock/serializers.py:1177
msgid "Stock merging notes"
msgstr "Notas de fusão de estoque"
-#: stock/serializers.py:1176
+#: stock/serializers.py:1182
msgid "Allow mismatched suppliers"
msgstr "Permitir fornecedores divergentes"
-#: stock/serializers.py:1177
+#: stock/serializers.py:1183
msgid "Allow stock items with different supplier parts to be merged"
msgstr "Permitir a fusão de itens de estoque de fornecedores diferentes"
-#: stock/serializers.py:1182
+#: stock/serializers.py:1188
msgid "Allow mismatched status"
msgstr "Permitir estado incompatível"
-#: stock/serializers.py:1183
+#: stock/serializers.py:1189
msgid "Allow stock items with different status codes to be merged"
msgstr "Permitir a fusão de itens de estoque com estado diferentes"
-#: stock/serializers.py:1193
+#: stock/serializers.py:1199
msgid "At least two stock items must be provided"
msgstr "Ao menos dois itens de estoque devem ser providenciados"
-#: stock/serializers.py:1260
+#: stock/serializers.py:1266
msgid "No Change"
msgstr ""
-#: stock/serializers.py:1289
+#: stock/serializers.py:1295
msgid "StockItem primary key value"
msgstr "Valor da chave primária do Item Estoque"
-#: stock/serializers.py:1308
+#: stock/serializers.py:1314
msgid "Stock item status code"
msgstr "Código de estado do item estoque"
-#: stock/serializers.py:1336
+#: stock/serializers.py:1342
msgid "Stock transaction notes"
msgstr "Notas da transação de estoque"
@@ -10662,7 +10695,7 @@ msgid "The following parts are low on required stock"
msgstr "As peças a seguir estão abaixo do estoque requerido"
#: templates/email/build_order_required_stock.html:18
-#: templates/js/translated/bom.js:1668 templates/js/translated/build.js:2557
+#: templates/js/translated/bom.js:1674 templates/js/translated/build.js:2557
msgid "Required Quantity"
msgstr "Quantidade Requerida"
@@ -10676,7 +10709,7 @@ msgid "Click on the following link to view this part"
msgstr "Clique no link abaixo para ver esta peça"
#: templates/email/low_stock_notification.html:18
-#: templates/js/translated/part.js:3209
+#: templates/js/translated/part.js:3218
msgid "Minimum Quantity"
msgstr "Quantidade Mínima"
@@ -11051,62 +11084,68 @@ msgstr "Preços da BOM estão incompletos"
msgid "No pricing available"
msgstr "Nenhum preço disponível"
-#: templates/js/translated/bom.js:1182 templates/js/translated/build.js:2596
+#: templates/js/translated/bom.js:1184 templates/js/translated/build.js:2622
+#, fuzzy
+#| msgid "External Link"
+msgid "External stock"
+msgstr "Link Externo"
+
+#: templates/js/translated/bom.js:1188 templates/js/translated/build.js:2596
#: templates/js/translated/sales_order.js:1910
msgid "No Stock Available"
msgstr "Nenhum Estoque Disponível"
-#: templates/js/translated/bom.js:1187 templates/js/translated/build.js:2600
+#: templates/js/translated/bom.js:1193 templates/js/translated/build.js:2600
msgid "Includes variant and substitute stock"
msgstr "Incluir estoque de variantes e substitutos"
-#: templates/js/translated/bom.js:1189 templates/js/translated/build.js:2602
+#: templates/js/translated/bom.js:1195 templates/js/translated/build.js:2602
#: templates/js/translated/part.js:1256
#: templates/js/translated/sales_order.js:1907
msgid "Includes variant stock"
msgstr "Incluir estoque de variantes"
-#: templates/js/translated/bom.js:1191 templates/js/translated/build.js:2604
+#: templates/js/translated/bom.js:1197 templates/js/translated/build.js:2604
msgid "Includes substitute stock"
msgstr "Incluir estoque de substitutos"
-#: templates/js/translated/bom.js:1219 templates/js/translated/build.js:2587
+#: templates/js/translated/bom.js:1225 templates/js/translated/build.js:2587
msgid "Consumable item"
msgstr "Itens consumíveis"
-#: templates/js/translated/bom.js:1279
+#: templates/js/translated/bom.js:1285
msgid "Validate BOM Item"
msgstr "Validar Item da BOM"
-#: templates/js/translated/bom.js:1281
+#: templates/js/translated/bom.js:1287
msgid "This line has been validated"
msgstr "Esta linha foi validada"
-#: templates/js/translated/bom.js:1283
+#: templates/js/translated/bom.js:1289
msgid "Edit substitute parts"
msgstr "Editar peças substitutas"
-#: templates/js/translated/bom.js:1285 templates/js/translated/bom.js:1480
+#: templates/js/translated/bom.js:1291 templates/js/translated/bom.js:1486
msgid "Edit BOM Item"
msgstr "Editar Item da BOM"
-#: templates/js/translated/bom.js:1287
+#: templates/js/translated/bom.js:1293
msgid "Delete BOM Item"
msgstr "Apagar Item da BOM"
-#: templates/js/translated/bom.js:1307
+#: templates/js/translated/bom.js:1313
msgid "View BOM"
msgstr "Ver BOM"
-#: templates/js/translated/bom.js:1391
+#: templates/js/translated/bom.js:1397
msgid "No BOM items found"
msgstr "Nenhum item da BOM encontrado"
-#: templates/js/translated/bom.js:1651 templates/js/translated/build.js:2486
+#: templates/js/translated/bom.js:1657 templates/js/translated/build.js:2486
msgid "Required Part"
msgstr "Peça Requerida"
-#: templates/js/translated/bom.js:1677
+#: templates/js/translated/bom.js:1683
msgid "Inherited from parent BOM"
msgstr "Herdado da BOM paternal"
@@ -11449,29 +11488,29 @@ msgstr "Quantidade Unitária"
msgid "Sufficient stock available"
msgstr "Estoque suficiente disponível"
-#: templates/js/translated/build.js:2643
+#: templates/js/translated/build.js:2647
msgid "Consumable Item"
msgstr "Item Consumível"
-#: templates/js/translated/build.js:2648
+#: templates/js/translated/build.js:2652
msgid "Tracked item"
msgstr "Item rastreado"
-#: templates/js/translated/build.js:2655
+#: templates/js/translated/build.js:2659
#: templates/js/translated/sales_order.js:2016
msgid "Build stock"
msgstr "Estoque de produção"
-#: templates/js/translated/build.js:2660 templates/js/translated/stock.js:1829
+#: templates/js/translated/build.js:2664 templates/js/translated/stock.js:1829
msgid "Order stock"
msgstr "Pedir Estoque"
-#: templates/js/translated/build.js:2664
+#: templates/js/translated/build.js:2668
#: templates/js/translated/sales_order.js:2010
msgid "Allocate stock"
msgstr "Alocar Estoque"
-#: templates/js/translated/build.js:2668
+#: templates/js/translated/build.js:2672
msgid "Remove stock allocation"
msgstr "Remover alocação de estoque"
@@ -12313,64 +12352,64 @@ msgstr "Carregar Subcategorias"
msgid "Subscribed category"
msgstr "Categoria inscrita"
-#: templates/js/translated/part.js:2855
+#: templates/js/translated/part.js:2864
msgid "No test templates matching query"
msgstr "Nenhum modelo de teste corresponde à consulta"
-#: templates/js/translated/part.js:2877 templates/js/translated/search.js:342
+#: templates/js/translated/part.js:2886 templates/js/translated/search.js:342
msgid "results"
msgstr ""
-#: templates/js/translated/part.js:2927 templates/js/translated/stock.js:1446
+#: templates/js/translated/part.js:2936 templates/js/translated/stock.js:1446
msgid "Edit test result"
msgstr "Editar resultados de teste"
-#: templates/js/translated/part.js:2928 templates/js/translated/stock.js:1447
+#: templates/js/translated/part.js:2937 templates/js/translated/stock.js:1447
#: templates/js/translated/stock.js:1692
msgid "Delete test result"
msgstr "Excluir resultado do teste"
-#: templates/js/translated/part.js:2932
+#: templates/js/translated/part.js:2941
msgid "This test is defined for a parent part"
msgstr "Este teste é definido para uma peça parental"
-#: templates/js/translated/part.js:2948
+#: templates/js/translated/part.js:2957
msgid "Edit Test Result Template"
msgstr "Editar Modelo de Resultado de Teste"
-#: templates/js/translated/part.js:2962
+#: templates/js/translated/part.js:2971
msgid "Delete Test Result Template"
msgstr "Excluir Modelo de Resultado de Teste"
-#: templates/js/translated/part.js:3041 templates/js/translated/part.js:3042
+#: templates/js/translated/part.js:3050 templates/js/translated/part.js:3051
msgid "No date specified"
msgstr "Nenhuma data especificada"
-#: templates/js/translated/part.js:3044
+#: templates/js/translated/part.js:3053
msgid "Specified date is in the past"
msgstr "Data especificada está no passado"
-#: templates/js/translated/part.js:3050
+#: templates/js/translated/part.js:3059
msgid "Speculative"
msgstr "Especulativo"
-#: templates/js/translated/part.js:3100
+#: templates/js/translated/part.js:3109
msgid "No scheduling information available for this part"
msgstr "Nenhuma informação de agendamento para esta peça"
-#: templates/js/translated/part.js:3106
+#: templates/js/translated/part.js:3115
msgid "Error fetching scheduling information for this part"
msgstr "Erro ao obter informações de agendamento para esta peça"
-#: templates/js/translated/part.js:3202
+#: templates/js/translated/part.js:3211
msgid "Scheduled Stock Quantities"
msgstr "Quantidades de Estoque Agendadas"
-#: templates/js/translated/part.js:3218
+#: templates/js/translated/part.js:3227
msgid "Maximum Quantity"
msgstr "Quantidade Máxima"
-#: templates/js/translated/part.js:3263
+#: templates/js/translated/part.js:3272
msgid "Minimum Stock Level"
msgstr "Nível Mínimo de Estoque"
@@ -14052,4 +14091,3 @@ msgstr "Permissões para editar itens"
#: users/models.py:413
msgid "Permission to delete items"
msgstr "Permissão para excluir itens"
-
diff --git a/InvenTree/locale/ru/LC_MESSAGES/django.po b/InvenTree/locale/ru/LC_MESSAGES/django.po
index 07d58a56d0..9fe6057224 100644
--- a/InvenTree/locale/ru/LC_MESSAGES/django.po
+++ b/InvenTree/locale/ru/LC_MESSAGES/django.po
@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: inventree\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2024-02-28 04:05+0000\n"
-"PO-Revision-Date: 2024-02-28 07:23\n"
+"POT-Creation-Date: 2024-03-02 07:22+0000\n"
+"PO-Revision-Date: 2024-03-06 10:36\n"
"Last-Translator: \n"
"Language-Team: Russian\n"
"Language: ru_RU\n"
@@ -66,9 +66,9 @@ msgstr "Введите дату"
#: report/templates/report/inventree_build_order_base.html:172
#: stock/admin.py:226 stock/models.py:2335 stock/models.py:2451
#: stock/serializers.py:479 stock/serializers.py:632 stock/serializers.py:728
-#: stock/serializers.py:778 stock/serializers.py:1081 stock/serializers.py:1170
-#: stock/serializers.py:1335 stock/templates/stock/stock_sidebar.html:25
-#: templates/js/translated/barcode.js:143 templates/js/translated/bom.js:1259
+#: stock/serializers.py:778 stock/serializers.py:1087 stock/serializers.py:1176
+#: stock/serializers.py:1341 stock/templates/stock/stock_sidebar.html:25
+#: templates/js/translated/barcode.js:143 templates/js/translated/bom.js:1265
#: templates/js/translated/company.js:1674 templates/js/translated/order.js:347
#: templates/js/translated/part.js:1080
#: templates/js/translated/purchase_order.js:2201
@@ -523,7 +523,7 @@ msgstr "Название"
#: templates/js/translated/order.js:298 templates/js/translated/part.js:1238
#: templates/js/translated/part.js:1483 templates/js/translated/part.js:1621
#: templates/js/translated/part.js:1958 templates/js/translated/part.js:2355
-#: templates/js/translated/part.js:2785 templates/js/translated/part.js:2887
+#: templates/js/translated/part.js:2785 templates/js/translated/part.js:2896
#: templates/js/translated/plugin.js:80
#: templates/js/translated/purchase_order.js:1707
#: templates/js/translated/purchase_order.js:1850
@@ -678,7 +678,7 @@ msgstr "ССЫЛКА файла изображения на удаленном
msgid "Downloading images from remote URL is not enabled"
msgstr "Загрузка изображений с удаленного URL-адреса не включена"
-#: InvenTree/status.py:66 part/serializers.py:1120
+#: InvenTree/status.py:66 part/serializers.py:1138
msgid "Background worker check failed"
msgstr "Проверка фонового работника не удалась"
@@ -960,7 +960,7 @@ msgid "Tracked"
msgstr "Отслеживается"
#: build/api.py:285 part/admin.py:144 templates/js/translated/build.js:1741
-#: templates/js/translated/build.js:2626
+#: templates/js/translated/build.js:2630
#: templates/js/translated/sales_order.js:1929
#: templates/js/translated/table_filters.js:571
msgid "Allocated"
@@ -1044,11 +1044,11 @@ msgstr "Заказ на производство, которому принад
#: build/models.py:199 build/templates/build/build_base.html:97
#: build/templates/build/detail.html:29 company/models.py:1044
#: order/models.py:1389 order/models.py:1532 order/models.py:1533
-#: part/api.py:1528 part/models.py:389 part/models.py:3003 part/models.py:3147
-#: part/models.py:3291 part/models.py:3314 part/models.py:3335
-#: part/models.py:3357 part/models.py:3458 part/models.py:3754
-#: part/models.py:3885 part/models.py:3978 part/models.py:4339
-#: part/serializers.py:1066 part/serializers.py:1631
+#: part/api.py:1528 part/api.py:1820 part/models.py:389 part/models.py:3003
+#: part/models.py:3147 part/models.py:3291 part/models.py:3314
+#: part/models.py:3335 part/models.py:3357 part/models.py:3458
+#: part/models.py:3754 part/models.py:3885 part/models.py:3978
+#: part/models.py:4339 part/serializers.py:1084 part/serializers.py:1659
#: part/templates/part/part_app_base.html:8
#: part/templates/part/part_pricing.html:12
#: part/templates/part/upload_bom.html:52
@@ -1147,7 +1147,7 @@ msgid "Build status code"
msgstr "Код статуса заказа на производство"
#: build/models.py:264 build/serializers.py:280 order/serializers.py:549
-#: stock/models.py:826 stock/serializers.py:1300
+#: stock/models.py:826 stock/serializers.py:1306
#: templates/js/translated/purchase_order.js:1129
msgid "Batch Code"
msgstr "Код партии"
@@ -1242,48 +1242,48 @@ msgstr "Код проекта"
msgid "Project code for this build order"
msgstr "Код проекта для этого заказа на производство"
-#: build/models.py:559
+#: build/models.py:575
#, python-brace-format
msgid "Build order {build} has been completed"
msgstr "Заказ на производство {build} был завершен"
-#: build/models.py:565
+#: build/models.py:581
msgid "A build order has been completed"
msgstr "Заказ на производство был завершен"
-#: build/models.py:783 build/models.py:858
+#: build/models.py:799 build/models.py:874
msgid "No build output specified"
msgstr "Продукция не указана"
-#: build/models.py:786
+#: build/models.py:802
msgid "Build output is already completed"
msgstr "Продукция уже произведена"
-#: build/models.py:789
+#: build/models.py:805
msgid "Build output does not match Build Order"
msgstr "Продукция не совпадает с заказом на производство"
-#: build/models.py:862 build/serializers.py:223 build/serializers.py:262
+#: build/models.py:878 build/serializers.py:223 build/serializers.py:262
#: build/serializers.py:831 order/models.py:526 order/serializers.py:401
-#: order/serializers.py:544 part/serializers.py:1423 part/serializers.py:1789
+#: order/serializers.py:544 part/serializers.py:1442 part/serializers.py:1817
#: stock/models.py:665 stock/models.py:1477 stock/serializers.py:450
msgid "Quantity must be greater than zero"
msgstr "Количество должно быть больше нуля"
-#: build/models.py:867 build/serializers.py:228
+#: build/models.py:883 build/serializers.py:228
msgid "Quantity cannot be greater than the output quantity"
msgstr "Количество не может быть больше количества продукции"
-#: build/models.py:924 build/serializers.py:533
+#: build/models.py:940 build/serializers.py:533
#, python-brace-format
msgid "Build output {serial} has not passed all required tests"
msgstr ""
-#: build/models.py:1286
+#: build/models.py:1302
msgid "Build object"
msgstr "Объект производства"
-#: build/models.py:1300 build/models.py:1558 build/serializers.py:210
+#: build/models.py:1316 build/models.py:1574 build/serializers.py:210
#: build/serializers.py:247 build/templates/build/build_base.html:102
#: build/templates/build/detail.html:34 common/models.py:2432
#: order/models.py:1247 order/models.py:1902 order/serializers.py:1306
@@ -1310,7 +1310,7 @@ msgstr "Объект производства"
#: templates/js/translated/company.js:1808
#: templates/js/translated/model_renderers.js:230
#: templates/js/translated/order.js:304 templates/js/translated/part.js:961
-#: templates/js/translated/part.js:1811 templates/js/translated/part.js:3332
+#: templates/js/translated/part.js:1811 templates/js/translated/part.js:3341
#: templates/js/translated/pricing.js:381
#: templates/js/translated/pricing.js:474
#: templates/js/translated/pricing.js:522
@@ -1330,38 +1330,38 @@ msgstr "Объект производства"
msgid "Quantity"
msgstr "Количество"
-#: build/models.py:1301
+#: build/models.py:1317
msgid "Required quantity for build order"
msgstr "Требуемое количество для заказа на производство"
-#: build/models.py:1381
+#: build/models.py:1397
msgid "Build item must specify a build output, as master part is marked as trackable"
msgstr "Элемент производства должен указать продукцию, как главную деталь помеченную как отслеживаемая"
-#: build/models.py:1390
+#: build/models.py:1406
#, python-brace-format
msgid "Allocated quantity ({q}) must not exceed available stock quantity ({a})"
msgstr "Резервируемое количество ({q}) не должно превышать доступное количество на складе ({a})"
-#: build/models.py:1400 order/models.py:1853
+#: build/models.py:1416 order/models.py:1853
msgid "Stock item is over-allocated"
msgstr "Складская позиция перераспределена"
-#: build/models.py:1406 order/models.py:1856
+#: build/models.py:1422 order/models.py:1856
msgid "Allocation quantity must be greater than zero"
msgstr "Резервируемое количество должно быть больше нуля"
-#: build/models.py:1412
+#: build/models.py:1428
msgid "Quantity must be 1 for serialized stock"
msgstr "Количество должно быть 1 для сериализованных запасов"
-#: build/models.py:1473
+#: build/models.py:1489
msgid "Selected stock item does not match BOM line"
msgstr "Выбранная складская позиция не соответствует позиции в BOM"
-#: build/models.py:1545 build/serializers.py:811 order/serializers.py:1150
-#: order/serializers.py:1171 stock/serializers.py:544 stock/serializers.py:1019
-#: stock/serializers.py:1131 stock/templates/stock/item_base.html:10
+#: build/models.py:1561 build/serializers.py:811 order/serializers.py:1150
+#: order/serializers.py:1171 stock/serializers.py:544 stock/serializers.py:1025
+#: stock/serializers.py:1137 stock/templates/stock/item_base.html:10
#: stock/templates/stock/item_base.html:23
#: stock/templates/stock/item_base.html:194
#: templates/js/translated/build.js:1742
@@ -1376,19 +1376,19 @@ msgstr "Выбранная складская позиция не соответ
msgid "Stock Item"
msgstr "Складская позиция"
-#: build/models.py:1546
+#: build/models.py:1562
msgid "Source stock item"
msgstr "Исходная складская позиция"
-#: build/models.py:1559
+#: build/models.py:1575
msgid "Stock quantity to allocate to build"
msgstr "Количество на складе для производства"
-#: build/models.py:1567
+#: build/models.py:1583
msgid "Install into"
msgstr "Установить в"
-#: build/models.py:1568
+#: build/models.py:1584
msgid "Destination stock item"
msgstr "Целевая складская позиция"
@@ -1452,9 +1452,9 @@ msgid "A list of build outputs must be provided"
msgstr "Необходимо представить список выхода деталей"
#: build/serializers.py:426 build/serializers.py:498 order/serializers.py:533
-#: order/serializers.py:641 order/serializers.py:1646 part/serializers.py:1086
+#: order/serializers.py:641 order/serializers.py:1646 part/serializers.py:1104
#: stock/serializers.py:472 stock/serializers.py:627 stock/serializers.py:723
-#: stock/serializers.py:1163 stock/serializers.py:1419
+#: stock/serializers.py:1169 stock/serializers.py:1425
#: stock/templates/stock/item_base.html:394
#: templates/js/translated/barcode.js:547
#: templates/js/translated/barcode.js:795 templates/js/translated/build.js:999
@@ -1494,7 +1494,7 @@ msgstr "Место хранения для завершенной продукц
#: build/serializers.py:505 build/templates/build/build_base.html:151
#: build/templates/build/detail.html:62 order/models.py:910
#: order/models.py:2005 order/serializers.py:565 stock/admin.py:165
-#: stock/serializers.py:774 stock/serializers.py:1307
+#: stock/serializers.py:774 stock/serializers.py:1313
#: stock/templates/stock/item_base.html:427
#: templates/js/translated/barcode.js:252 templates/js/translated/build.js:2189
#: templates/js/translated/purchase_order.js:1308
@@ -1602,7 +1602,7 @@ msgstr "Позиция для производства"
msgid "bom_item.part must point to the same part as the build order"
msgstr "bom_item.part должна указывать на ту же часть, что и заказ на производство"
-#: build/serializers.py:817 stock/serializers.py:1032
+#: build/serializers.py:817 stock/serializers.py:1038
msgid "Item must be in stock"
msgstr "Элемент должен быть в наличии"
@@ -1659,44 +1659,45 @@ msgstr "Необязательные элементы"
msgid "Allocate optional BOM items to build order"
msgstr "Зарезервировать необязательные позиции BOM для заказа на производство"
-#: build/serializers.py:1096 part/models.py:3895 part/models.py:4331
+#: build/serializers.py:1097 part/models.py:3895 part/models.py:4331
#: stock/api.py:745
msgid "BOM Item"
msgstr "Позиция BOM"
-#: build/serializers.py:1105 templates/js/translated/index.js:130
+#: build/serializers.py:1106 templates/js/translated/index.js:130
msgid "Allocated Stock"
msgstr "Зарезервированные Запасы"
-#: build/serializers.py:1110 part/admin.py:132 part/bom.py:173
-#: part/serializers.py:1441 part/templates/part/part_base.html:210
-#: templates/js/translated/bom.js:1202 templates/js/translated/build.js:2614
-#: templates/js/translated/part.js:709 templates/js/translated/part.js:2148
+#: build/serializers.py:1111 part/admin.py:132 part/bom.py:173
+#: part/serializers.py:798 part/serializers.py:1460
+#: part/templates/part/part_base.html:210 templates/js/translated/bom.js:1208
+#: templates/js/translated/build.js:2614 templates/js/translated/part.js:709
+#: templates/js/translated/part.js:2148
#: templates/js/translated/table_filters.js:170
msgid "On Order"
msgstr "В заказе"
-#: build/serializers.py:1115 part/serializers.py:1443
+#: build/serializers.py:1116 part/serializers.py:1462
#: templates/js/translated/build.js:2618
#: templates/js/translated/table_filters.js:360
msgid "In Production"
msgstr "В производстве"
-#: build/serializers.py:1120 part/bom.py:172 part/serializers.py:1454
+#: build/serializers.py:1121 part/bom.py:172 part/serializers.py:1473
#: part/templates/part/part_base.html:192
#: templates/js/translated/sales_order.js:1893
msgid "Available Stock"
msgstr "Доступный запас"
-#: build/tasks.py:149
+#: build/tasks.py:171
msgid "Stock required for build order"
msgstr "Необходимый запас для заказа на производство"
-#: build/tasks.py:166
+#: build/tasks.py:188
msgid "Overdue Build Order"
msgstr "Просроченный заказ сборки"
-#: build/tasks.py:171
+#: build/tasks.py:193
#, python-brace-format
msgid "Build order {bo} is now overdue"
msgstr "Заказ на производство {bo} просрочен"
@@ -1990,27 +1991,31 @@ msgstr ""
msgid "Order Parts"
msgstr "Заказать детали"
-#: build/templates/build/detail.html:210
+#: build/templates/build/detail.html:205
+msgid "Available stock has been filtered based on specified source location for this build order"
+msgstr ""
+
+#: build/templates/build/detail.html:215
msgid "Incomplete Build Outputs"
msgstr "Незавершенная продукция"
-#: build/templates/build/detail.html:214
+#: build/templates/build/detail.html:219
msgid "Create new build output"
msgstr "Создать выход производства"
-#: build/templates/build/detail.html:215
+#: build/templates/build/detail.html:220
msgid "New Build Output"
msgstr "Новая продукция"
-#: build/templates/build/detail.html:232 build/templates/build/sidebar.html:15
+#: build/templates/build/detail.html:237 build/templates/build/sidebar.html:15
msgid "Consumed Stock"
msgstr "Поглощенные Остатки"
-#: build/templates/build/detail.html:244
+#: build/templates/build/detail.html:249
msgid "Completed Build Outputs"
msgstr "Завершенная продукция"
-#: build/templates/build/detail.html:256 build/templates/build/sidebar.html:19
+#: build/templates/build/detail.html:261 build/templates/build/sidebar.html:19
#: company/templates/company/detail.html:229
#: company/templates/company/manufacturer_part.html:141
#: company/templates/company/manufacturer_part_sidebar.html:9
@@ -2026,15 +2031,15 @@ msgstr "Завершенная продукция"
msgid "Attachments"
msgstr "Файлы"
-#: build/templates/build/detail.html:271
+#: build/templates/build/detail.html:276
msgid "Build Notes"
msgstr "Записи производства"
-#: build/templates/build/detail.html:426
+#: build/templates/build/detail.html:434
msgid "Allocation Complete"
msgstr "Резервирование Завершено"
-#: build/templates/build/detail.html:427
+#: build/templates/build/detail.html:435
msgid "All lines have been fully allocated"
msgstr "Все позиции были полностью зарезервированы"
@@ -2436,7 +2441,7 @@ msgid "Parts are templates by default"
msgstr "По умолчанию детали являются шаблонами"
#: common/models.py:1456 part/admin.py:91 part/admin.py:431 part/models.py:1015
-#: templates/js/translated/bom.js:1633
+#: templates/js/translated/bom.js:1639
#: templates/js/translated/table_filters.js:330
#: templates/js/translated/table_filters.js:721
msgid "Assembly"
@@ -3495,7 +3500,7 @@ msgstr ""
msgid "Price break quantity"
msgstr ""
-#: common/models.py:2440 company/serializers.py:484 order/admin.py:42
+#: common/models.py:2440 company/serializers.py:486 order/admin.py:42
#: order/models.py:1321 order/models.py:2226
#: templates/js/translated/company.js:1813 templates/js/translated/part.js:1885
#: templates/js/translated/pricing.js:621
@@ -3972,7 +3977,7 @@ msgstr "Выберите деталь"
#: company/models.py:495 company/templates/company/company_base.html:76
#: company/templates/company/manufacturer_part.html:90
-#: company/templates/company/supplier_part.html:145 part/serializers.py:497
+#: company/templates/company/supplier_part.html:145 part/serializers.py:505
#: stock/templates/stock/item_base.html:207
#: templates/js/translated/company.js:506
#: templates/js/translated/company.js:1108
@@ -3987,7 +3992,7 @@ msgid "Select manufacturer"
msgstr "Выберите производителя"
#: company/models.py:502 company/templates/company/manufacturer_part.html:101
-#: company/templates/company/supplier_part.html:153 part/serializers.py:507
+#: company/templates/company/supplier_part.html:153 part/serializers.py:515
#: templates/js/translated/company.js:351
#: templates/js/translated/company.js:1107
#: templates/js/translated/company.js:1302
@@ -4059,7 +4064,7 @@ msgstr ""
#: company/models.py:795 company/templates/company/company_base.html:81
#: company/templates/company/supplier_part.html:129 order/models.py:453
#: order/templates/order/order_base.html:136 part/bom.py:272 part/bom.py:310
-#: part/serializers.py:481 plugin/builtin/suppliers/digikey.py:25
+#: part/serializers.py:489 plugin/builtin/suppliers/digikey.py:25
#: plugin/builtin/suppliers/lcsc.py:26 plugin/builtin/suppliers/mouser.py:24
#: plugin/builtin/suppliers/tme.py:26 stock/templates/stock/item_base.html:224
#: templates/email/overdue_purchase_order.html:16
@@ -4076,7 +4081,7 @@ msgstr "Поставщик"
msgid "Select supplier"
msgstr "Выберите поставщика"
-#: company/models.py:802 part/serializers.py:492
+#: company/models.py:802 part/serializers.py:500
msgid "Supplier stock keeping unit"
msgstr "Код поставщика"
@@ -4112,7 +4117,7 @@ msgid "Minimum charge (e.g. stocking fee)"
msgstr ""
#: company/models.py:851 company/templates/company/supplier_part.html:160
-#: stock/admin.py:224 stock/models.py:785 stock/serializers.py:1317
+#: stock/admin.py:224 stock/models.py:785 stock/serializers.py:1323
#: stock/templates/stock/item_base.html:240
#: templates/js/translated/company.js:1636
#: templates/js/translated/stock.js:2387
@@ -4157,7 +4162,7 @@ msgstr ""
msgid "Date of last update of availability data"
msgstr ""
-#: company/serializers.py:153
+#: company/serializers.py:155
msgid "Default currency used for this supplier"
msgstr "Валюта по умолчанию для этого поставщика"
@@ -4218,7 +4223,7 @@ msgstr "Удалить изображение"
#: company/templates/company/company_base.html:86 order/models.py:898
#: order/models.py:1993 order/templates/order/return_order_base.html:131
#: order/templates/order/sales_order_base.html:144 stock/models.py:807
-#: stock/models.py:808 stock/serializers.py:1067
+#: stock/models.py:808 stock/serializers.py:1073
#: stock/templates/stock/item_base.html:405
#: templates/email/overdue_sales_order.html:16
#: templates/js/translated/company.js:502
@@ -4429,8 +4434,9 @@ msgstr ""
#: company/templates/company/manufacturer_part.html:119
#: company/templates/company/supplier_part.html:15 company/views.py:31
-#: part/admin.py:122 part/templates/part/part_sidebar.html:33
-#: templates/InvenTree/search.html:190 templates/navbar.html:48
+#: part/admin.py:122 part/serializers.py:802
+#: part/templates/part/part_sidebar.html:33 templates/InvenTree/search.html:190
+#: templates/navbar.html:48
msgid "Suppliers"
msgstr "Поставщики"
@@ -4528,7 +4534,7 @@ msgid "No supplier information available"
msgstr ""
#: company/templates/company/supplier_part.html:139 part/bom.py:279
-#: part/bom.py:311 part/serializers.py:491
+#: part/bom.py:311 part/serializers.py:499
#: templates/js/translated/company.js:349 templates/js/translated/part.js:1786
#: templates/js/translated/pricing.js:510
#: templates/js/translated/purchase_order.js:1851
@@ -4577,10 +4583,12 @@ msgstr ""
msgid "Update Part Availability"
msgstr ""
-#: company/templates/company/supplier_part_sidebar.html:5 part/stocktake.py:223
+#: company/templates/company/supplier_part_sidebar.html:5
+#: part/serializers.py:801 part/stocktake.py:223
#: part/templates/part/category.html:183
#: part/templates/part/category_sidebar.html:17 stock/admin.py:69
-#: stock/serializers.py:760 stock/templates/stock/location.html:170
+#: stock/serializers.py:760 stock/serializers.py:924
+#: stock/templates/stock/location.html:170
#: stock/templates/stock/location.html:184
#: stock/templates/stock/location.html:196
#: stock/templates/stock/location_sidebar.html:7
@@ -4640,7 +4648,7 @@ msgid "Label template file"
msgstr ""
#: label/models.py:143 part/models.py:3484 report/models.py:322
-#: templates/js/translated/part.js:2891
+#: templates/js/translated/part.js:2900
#: templates/js/translated/table_filters.js:481
msgid "Enabled"
msgstr "Включено"
@@ -5733,7 +5741,7 @@ msgid "Pending Shipments"
msgstr "Ожидающие отправления"
#: order/templates/order/sales_order_detail.html:71
-#: templates/js/translated/bom.js:1271 templates/js/translated/filters.js:296
+#: templates/js/translated/bom.js:1277 templates/js/translated/filters.js:296
msgid "Actions"
msgstr "Действия"
@@ -5861,10 +5869,10 @@ msgstr "Имя родителя"
msgid "Category Path"
msgstr "Путь к категории"
-#: part/admin.py:323 part/models.py:390 part/serializers.py:259
-#: part/serializers.py:373 part/templates/part/cat_link.html:3
-#: part/templates/part/category.html:23 part/templates/part/category.html:141
-#: part/templates/part/category.html:161
+#: part/admin.py:323 part/models.py:390 part/serializers.py:112
+#: part/serializers.py:265 part/serializers.py:381
+#: part/templates/part/cat_link.html:3 part/templates/part/category.html:23
+#: part/templates/part/category.html:141 part/templates/part/category.html:161
#: part/templates/part/category_sidebar.html:9
#: templates/InvenTree/index.html:36 templates/InvenTree/search.html:84
#: templates/InvenTree/settings/sidebar.html:47
@@ -5889,13 +5897,13 @@ msgstr "Родительский IPN"
msgid "Part IPN"
msgstr "IPN детали"
-#: part/admin.py:421 part/serializers.py:1220
+#: part/admin.py:421 part/serializers.py:1238
#: templates/js/translated/pricing.js:358
#: templates/js/translated/pricing.js:1024
msgid "Minimum Price"
msgstr "Минимальная цена"
-#: part/admin.py:426 part/serializers.py:1235
+#: part/admin.py:426 part/serializers.py:1253
#: templates/js/translated/pricing.js:353
#: templates/js/translated/pricing.js:1032
msgid "Maximum Price"
@@ -5974,7 +5982,7 @@ msgid "This option must be selected"
msgstr "Необходимо выбрать эту опцию"
#: part/api.py:1541 part/models.py:895 part/models.py:3385 part/models.py:3831
-#: part/serializers.py:388 part/serializers.py:1076
+#: part/serializers.py:396 part/serializers.py:1094
#: part/templates/part/part_base.html:260 stock/api.py:733
#: templates/InvenTree/settings/settings_staff_js.html:300
#: templates/js/translated/notification.js:60
@@ -5982,12 +5990,17 @@ msgstr "Необходимо выбрать эту опцию"
msgid "Category"
msgstr "Категория"
+#: part/api.py:1828
+msgid "Uses"
+msgstr ""
+
#: part/bom.py:170 part/models.py:100 part/models.py:938
#: part/templates/part/category.html:116 part/templates/part/part_base.html:367
msgid "Default Location"
msgstr "Место хранения по умолчанию"
-#: part/bom.py:171 templates/email/low_stock_notification.html:16
+#: part/bom.py:171 part/serializers.py:803
+#: templates/email/low_stock_notification.html:16
msgid "Total Stock"
msgstr "Общий запас"
@@ -6010,7 +6023,8 @@ msgstr "Категория детали"
msgid "Default location for parts in this category"
msgstr "Место хранения по умолчанию для деталей этой категории"
-#: part/models.py:106 stock/models.py:165 templates/js/translated/stock.js:2736
+#: part/models.py:106 stock/models.py:165 templates/js/translated/part.js:2810
+#: templates/js/translated/stock.js:2736
#: templates/js/translated/table_filters.js:239
#: templates/js/translated/table_filters.js:283
msgid "Structural"
@@ -6418,7 +6432,7 @@ msgstr "Шаблоны тестирования могут быть создан
msgid "Test with this name already exists for this part"
msgstr ""
-#: part/models.py:3464 templates/js/translated/part.js:2870
+#: part/models.py:3464 templates/js/translated/part.js:2879
msgid "Test Name"
msgstr "Название теста"
@@ -6446,7 +6460,7 @@ msgstr "Введите описание для этого теста"
msgid "Is this test enabled?"
msgstr ""
-#: part/models.py:3489 templates/js/translated/part.js:2899
+#: part/models.py:3489 templates/js/translated/part.js:2908
#: templates/js/translated/table_filters.js:477
msgid "Required"
msgstr "Требуется"
@@ -6455,7 +6469,7 @@ msgstr "Требуется"
msgid "Is this test required to pass?"
msgstr ""
-#: part/models.py:3495 templates/js/translated/part.js:2907
+#: part/models.py:3495 templates/js/translated/part.js:2916
msgid "Requires Value"
msgstr "Требуется значение"
@@ -6463,7 +6477,7 @@ msgstr "Требуется значение"
msgid "Does this test require a value when adding a test result?"
msgstr ""
-#: part/models.py:3501 templates/js/translated/part.js:2914
+#: part/models.py:3501 templates/js/translated/part.js:2923
msgid "Requires Attachment"
msgstr ""
@@ -6685,311 +6699,323 @@ msgstr ""
msgid "Duplicate relationship already exists"
msgstr ""
-#: part/serializers.py:128 part/templates/part/category.html:122
-#: part/templates/part/category.html:207
+#: part/serializers.py:114 part/serializers.py:134
+#: part/templates/part/category.html:122 part/templates/part/category.html:207
#: part/templates/part/category_sidebar.html:7
msgid "Subcategories"
msgstr "Подкатегории"
-#: part/serializers.py:172
+#: part/serializers.py:178
msgid "Results"
msgstr ""
-#: part/serializers.py:173
+#: part/serializers.py:179
msgid "Number of results recorded against this template"
msgstr ""
-#: part/serializers.py:197 part/serializers.py:215 stock/serializers.py:384
+#: part/serializers.py:203 part/serializers.py:221 stock/serializers.py:384
msgid "Purchase currency of this stock item"
msgstr "Валюта закупки складской позиции"
-#: part/serializers.py:260
+#: part/serializers.py:266
msgid "Number of parts using this template"
msgstr ""
-#: part/serializers.py:379
+#: part/serializers.py:387
msgid "No parts selected"
msgstr "Не выбрана ни одна деталь"
-#: part/serializers.py:389
+#: part/serializers.py:397
msgid "Select category"
msgstr "Выберите категорию"
-#: part/serializers.py:419
+#: part/serializers.py:427
msgid "Original Part"
msgstr "Оригинальная деталь"
-#: part/serializers.py:420
+#: part/serializers.py:428
msgid "Select original part to duplicate"
msgstr ""
-#: part/serializers.py:425
+#: part/serializers.py:433
msgid "Copy Image"
msgstr "Копировать Изображение"
-#: part/serializers.py:426
+#: part/serializers.py:434
msgid "Copy image from original part"
msgstr ""
-#: part/serializers.py:432 part/templates/part/detail.html:277
+#: part/serializers.py:440 part/templates/part/detail.html:277
msgid "Copy BOM"
msgstr "Скопировать BOM"
-#: part/serializers.py:433
+#: part/serializers.py:441
msgid "Copy bill of materials from original part"
msgstr ""
-#: part/serializers.py:439
+#: part/serializers.py:447
msgid "Copy Parameters"
msgstr "Скопировать параметры"
-#: part/serializers.py:440
+#: part/serializers.py:448
msgid "Copy parameter data from original part"
msgstr ""
-#: part/serializers.py:446
+#: part/serializers.py:454
msgid "Copy Notes"
msgstr "Копировать Записи"
-#: part/serializers.py:447
+#: part/serializers.py:455
msgid "Copy notes from original part"
msgstr "Скопировать записи из оригинальной детали"
-#: part/serializers.py:460
+#: part/serializers.py:468
msgid "Initial Stock Quantity"
msgstr ""
-#: part/serializers.py:462
+#: part/serializers.py:470
msgid "Specify initial stock quantity for this Part. If quantity is zero, no stock is added."
msgstr ""
-#: part/serializers.py:469
+#: part/serializers.py:477
msgid "Initial Stock Location"
msgstr ""
-#: part/serializers.py:470
+#: part/serializers.py:478
msgid "Specify initial stock location for this Part"
msgstr ""
-#: part/serializers.py:482
+#: part/serializers.py:490
msgid "Select supplier (or leave blank to skip)"
msgstr "Выберите поставщика (или оставьте поле пустым, чтобы пропустить)"
-#: part/serializers.py:498
+#: part/serializers.py:506
msgid "Select manufacturer (or leave blank to skip)"
msgstr "Выберите поставщика (или оставьте поле пустым, чтобы пропустить)"
-#: part/serializers.py:508
+#: part/serializers.py:516
msgid "Manufacturer part number"
msgstr "Код производителя"
-#: part/serializers.py:515
+#: part/serializers.py:523
msgid "Selected company is not a valid supplier"
msgstr ""
-#: part/serializers.py:524
+#: part/serializers.py:532
msgid "Selected company is not a valid manufacturer"
msgstr ""
-#: part/serializers.py:535
+#: part/serializers.py:543
msgid "Manufacturer part matching this MPN already exists"
msgstr ""
-#: part/serializers.py:542
+#: part/serializers.py:550
msgid "Supplier part matching this SKU already exists"
msgstr ""
-#: part/serializers.py:815 part/templates/part/copy_part.html:9
+#: part/serializers.py:804
+msgid "External Stock"
+msgstr ""
+
+#: part/serializers.py:806
+msgid "Unallocated Stock"
+msgstr ""
+
+#: part/serializers.py:808
+msgid "Variant Stock"
+msgstr ""
+
+#: part/serializers.py:833 part/templates/part/copy_part.html:9
#: templates/js/translated/part.js:471
msgid "Duplicate Part"
msgstr "Дублировать деталь"
-#: part/serializers.py:816
+#: part/serializers.py:834
msgid "Copy initial data from another Part"
msgstr ""
-#: part/serializers.py:822 templates/js/translated/part.js:102
+#: part/serializers.py:840 templates/js/translated/part.js:102
msgid "Initial Stock"
msgstr "Начальный запас"
-#: part/serializers.py:823
+#: part/serializers.py:841
msgid "Create Part with initial stock quantity"
msgstr ""
-#: part/serializers.py:829
+#: part/serializers.py:847
msgid "Supplier Information"
msgstr ""
-#: part/serializers.py:830
+#: part/serializers.py:848
msgid "Add initial supplier information for this part"
msgstr ""
-#: part/serializers.py:838
+#: part/serializers.py:856
msgid "Copy Category Parameters"
msgstr "Копировать параметры категории"
-#: part/serializers.py:839
+#: part/serializers.py:857
msgid "Copy parameter templates from selected part category"
msgstr "Копировать шаблоны параметров из выбранной категории деталей"
-#: part/serializers.py:844
+#: part/serializers.py:862
msgid "Existing Image"
msgstr "Существующее изображение"
-#: part/serializers.py:845
+#: part/serializers.py:863
msgid "Filename of an existing part image"
msgstr ""
-#: part/serializers.py:862
+#: part/serializers.py:880
msgid "Image file does not exist"
msgstr ""
-#: part/serializers.py:1068
+#: part/serializers.py:1086
msgid "Limit stocktake report to a particular part, and any variant parts"
msgstr ""
-#: part/serializers.py:1078
+#: part/serializers.py:1096
msgid "Limit stocktake report to a particular part category, and any child categories"
msgstr ""
-#: part/serializers.py:1088
+#: part/serializers.py:1106
msgid "Limit stocktake report to a particular stock location, and any child locations"
msgstr ""
-#: part/serializers.py:1094
+#: part/serializers.py:1112
msgid "Exclude External Stock"
msgstr ""
-#: part/serializers.py:1095
+#: part/serializers.py:1113
msgid "Exclude stock items in external locations"
msgstr "Исключить складские позиции в внешних местах хранения"
-#: part/serializers.py:1100
+#: part/serializers.py:1118
msgid "Generate Report"
msgstr "Создать отчет"
-#: part/serializers.py:1101
+#: part/serializers.py:1119
msgid "Generate report file containing calculated stocktake data"
msgstr ""
-#: part/serializers.py:1106
+#: part/serializers.py:1124
msgid "Update Parts"
msgstr "Обновить детали"
-#: part/serializers.py:1107
+#: part/serializers.py:1125
msgid "Update specified parts with calculated stocktake data"
msgstr ""
-#: part/serializers.py:1115
+#: part/serializers.py:1133
msgid "Stocktake functionality is not enabled"
msgstr ""
-#: part/serializers.py:1221
+#: part/serializers.py:1239
msgid "Override calculated value for minimum price"
msgstr ""
-#: part/serializers.py:1228
+#: part/serializers.py:1246
msgid "Minimum price currency"
msgstr ""
-#: part/serializers.py:1236
+#: part/serializers.py:1254
msgid "Override calculated value for maximum price"
msgstr ""
-#: part/serializers.py:1243
+#: part/serializers.py:1261
msgid "Maximum price currency"
msgstr ""
-#: part/serializers.py:1272
+#: part/serializers.py:1290
msgid "Update"
msgstr "Обновить"
-#: part/serializers.py:1273
+#: part/serializers.py:1291
msgid "Update pricing for this part"
msgstr ""
-#: part/serializers.py:1296
+#: part/serializers.py:1314
#, python-brace-format
msgid "Could not convert from provided currencies to {default_currency}"
msgstr ""
-#: part/serializers.py:1303
+#: part/serializers.py:1321
msgid "Minimum price must not be greater than maximum price"
msgstr ""
-#: part/serializers.py:1306
+#: part/serializers.py:1324
msgid "Maximum price must not be less than minimum price"
msgstr ""
-#: part/serializers.py:1632
+#: part/serializers.py:1660
msgid "Select part to copy BOM from"
msgstr ""
-#: part/serializers.py:1640
+#: part/serializers.py:1668
msgid "Remove Existing Data"
msgstr ""
-#: part/serializers.py:1641
+#: part/serializers.py:1669
msgid "Remove existing BOM items before copying"
msgstr ""
-#: part/serializers.py:1646
+#: part/serializers.py:1674
msgid "Include Inherited"
msgstr ""
-#: part/serializers.py:1647
+#: part/serializers.py:1675
msgid "Include BOM items which are inherited from templated parts"
msgstr ""
-#: part/serializers.py:1652
+#: part/serializers.py:1680
msgid "Skip Invalid Rows"
msgstr ""
-#: part/serializers.py:1653
+#: part/serializers.py:1681
msgid "Enable this option to skip invalid rows"
msgstr ""
-#: part/serializers.py:1658
+#: part/serializers.py:1686
msgid "Copy Substitute Parts"
msgstr ""
-#: part/serializers.py:1659
+#: part/serializers.py:1687
msgid "Copy substitute parts when duplicate BOM items"
msgstr ""
-#: part/serializers.py:1693
+#: part/serializers.py:1721
msgid "Clear Existing BOM"
msgstr ""
-#: part/serializers.py:1694
+#: part/serializers.py:1722
msgid "Delete existing BOM items before uploading"
msgstr ""
-#: part/serializers.py:1724
+#: part/serializers.py:1752
msgid "No part column specified"
msgstr ""
-#: part/serializers.py:1768
+#: part/serializers.py:1796
msgid "Multiple matching parts found"
msgstr ""
-#: part/serializers.py:1771
+#: part/serializers.py:1799
msgid "No matching part found"
msgstr "Подходящая деталь не найдена"
-#: part/serializers.py:1774
+#: part/serializers.py:1802
msgid "Part is not designated as a component"
msgstr ""
-#: part/serializers.py:1783
+#: part/serializers.py:1811
msgid "Quantity not provided"
msgstr ""
-#: part/serializers.py:1791
+#: part/serializers.py:1819
msgid "Invalid quantity"
msgstr "Некорректное количество"
-#: part/serializers.py:1812
+#: part/serializers.py:1840
msgid "At least one BOM item is required"
msgstr ""
@@ -7221,7 +7247,7 @@ msgid "Validate BOM"
msgstr "Проверить BOM"
#: part/templates/part/detail.html:283 part/templates/part/detail.html:284
-#: templates/js/translated/bom.js:1314 templates/js/translated/bom.js:1315
+#: templates/js/translated/bom.js:1320 templates/js/translated/bom.js:1321
msgid "Add BOM Item"
msgstr "Добавить элемент BOM"
@@ -7405,7 +7431,7 @@ msgstr "Зарезервировано заказами на производс
msgid "Allocated to Sales Orders"
msgstr ""
-#: part/templates/part/part_base.html:235 templates/js/translated/bom.js:1213
+#: part/templates/part/part_base.html:235 templates/js/translated/bom.js:1219
msgid "Can Build"
msgstr "Можно произвести"
@@ -8784,7 +8810,7 @@ msgstr "Выберите соответствующего поставщика
msgid "Where is this stock item located?"
msgstr "Где находиться эта складская позиция?"
-#: stock/models.py:786 stock/serializers.py:1318
+#: stock/models.py:786 stock/serializers.py:1324
msgid "Packaging this stock item is stored in"
msgstr "Упаковка этой складской позиции хранится в"
@@ -8796,7 +8822,7 @@ msgstr ""
msgid "Serial number for this item"
msgstr ""
-#: stock/models.py:830 stock/serializers.py:1301
+#: stock/models.py:830 stock/serializers.py:1307
msgid "Batch code for this stock item"
msgstr "Код партии для этой складской позиции"
@@ -8905,7 +8931,7 @@ msgstr "Складская позиция в производстве"
msgid "Serialized stock cannot be merged"
msgstr ""
-#: stock/models.py:1639 stock/serializers.py:1207
+#: stock/models.py:1639 stock/serializers.py:1213
msgid "Duplicate stock items"
msgstr "Дублировать складские позиции"
@@ -8986,7 +9012,7 @@ msgstr ""
msgid "Enter serial numbers for new items"
msgstr "Введите серийные номера для новых элементов"
-#: stock/serializers.py:473 stock/serializers.py:1164 stock/serializers.py:1420
+#: stock/serializers.py:473 stock/serializers.py:1170 stock/serializers.py:1426
msgid "Destination stock location"
msgstr ""
@@ -9059,77 +9085,78 @@ msgstr "Выберите складские позиции для изменен
msgid "No stock items selected"
msgstr "Не выбрано ни одной складской позиции"
-#: stock/serializers.py:863 stock/templates/stock/location.html:165
+#: stock/serializers.py:863 stock/serializers.py:926
+#: stock/templates/stock/location.html:165
#: stock/templates/stock/location.html:213
#: stock/templates/stock/location_sidebar.html:5
msgid "Sublocations"
msgstr "Места хранения"
-#: stock/serializers.py:1036
+#: stock/serializers.py:1042
msgid "Part must be salable"
msgstr ""
-#: stock/serializers.py:1040
+#: stock/serializers.py:1046
msgid "Item is allocated to a sales order"
msgstr ""
-#: stock/serializers.py:1044
+#: stock/serializers.py:1050
msgid "Item is allocated to a build order"
msgstr "Элемент зарезервирован для заказа на производство"
-#: stock/serializers.py:1068
+#: stock/serializers.py:1074
msgid "Customer to assign stock items"
msgstr "Покупатель для назначения складских позиций"
-#: stock/serializers.py:1074
+#: stock/serializers.py:1080
msgid "Selected company is not a customer"
msgstr "Выбранная компания не является покупателем"
-#: stock/serializers.py:1082
+#: stock/serializers.py:1088
msgid "Stock assignment notes"
msgstr "Записи о назначенных запасах"
-#: stock/serializers.py:1092 stock/serializers.py:1346
+#: stock/serializers.py:1098 stock/serializers.py:1352
msgid "A list of stock items must be provided"
msgstr "Необходимо предоставить список складских позиций"
-#: stock/serializers.py:1171
+#: stock/serializers.py:1177
msgid "Stock merging notes"
msgstr "Записи о слияниях запасов"
-#: stock/serializers.py:1176
+#: stock/serializers.py:1182
msgid "Allow mismatched suppliers"
msgstr ""
-#: stock/serializers.py:1177
+#: stock/serializers.py:1183
msgid "Allow stock items with different supplier parts to be merged"
msgstr "Разрешить слияние складских позиций с различными поставщиками"
-#: stock/serializers.py:1182
+#: stock/serializers.py:1188
msgid "Allow mismatched status"
msgstr ""
-#: stock/serializers.py:1183
+#: stock/serializers.py:1189
msgid "Allow stock items with different status codes to be merged"
msgstr "Разрешить слияние складских позиций с различными статусами"
-#: stock/serializers.py:1193
+#: stock/serializers.py:1199
msgid "At least two stock items must be provided"
msgstr "Необходимо предоставить как минимум 2 складские позиции"
-#: stock/serializers.py:1260
+#: stock/serializers.py:1266
msgid "No Change"
msgstr ""
-#: stock/serializers.py:1289
+#: stock/serializers.py:1295
msgid "StockItem primary key value"
msgstr ""
-#: stock/serializers.py:1308
+#: stock/serializers.py:1314
msgid "Stock item status code"
msgstr "Статус складской позиции"
-#: stock/serializers.py:1336
+#: stock/serializers.py:1342
msgid "Stock transaction notes"
msgstr "Записи о перемещениях запасов"
@@ -10074,7 +10101,7 @@ msgstr "Настройки пользователя"
#: templates/InvenTree/settings/sidebar.html:9
msgid "Account"
-msgstr "Аккуант"
+msgstr "Учетная запись"
#: templates/InvenTree/settings/sidebar.html:11
msgid "Display"
@@ -10662,7 +10689,7 @@ msgid "The following parts are low on required stock"
msgstr ""
#: templates/email/build_order_required_stock.html:18
-#: templates/js/translated/bom.js:1668 templates/js/translated/build.js:2557
+#: templates/js/translated/bom.js:1674 templates/js/translated/build.js:2557
msgid "Required Quantity"
msgstr "Требуемое кол-во"
@@ -10676,7 +10703,7 @@ msgid "Click on the following link to view this part"
msgstr ""
#: templates/email/low_stock_notification.html:18
-#: templates/js/translated/part.js:3209
+#: templates/js/translated/part.js:3218
msgid "Minimum Quantity"
msgstr "Минимальное количество"
@@ -11051,62 +11078,66 @@ msgstr ""
msgid "No pricing available"
msgstr ""
-#: templates/js/translated/bom.js:1182 templates/js/translated/build.js:2596
+#: templates/js/translated/bom.js:1184 templates/js/translated/build.js:2622
+msgid "External stock"
+msgstr ""
+
+#: templates/js/translated/bom.js:1188 templates/js/translated/build.js:2596
#: templates/js/translated/sales_order.js:1910
msgid "No Stock Available"
msgstr ""
-#: templates/js/translated/bom.js:1187 templates/js/translated/build.js:2600
+#: templates/js/translated/bom.js:1193 templates/js/translated/build.js:2600
msgid "Includes variant and substitute stock"
msgstr ""
-#: templates/js/translated/bom.js:1189 templates/js/translated/build.js:2602
+#: templates/js/translated/bom.js:1195 templates/js/translated/build.js:2602
#: templates/js/translated/part.js:1256
#: templates/js/translated/sales_order.js:1907
msgid "Includes variant stock"
msgstr ""
-#: templates/js/translated/bom.js:1191 templates/js/translated/build.js:2604
+#: templates/js/translated/bom.js:1197 templates/js/translated/build.js:2604
msgid "Includes substitute stock"
msgstr ""
-#: templates/js/translated/bom.js:1219 templates/js/translated/build.js:2587
+#: templates/js/translated/bom.js:1225 templates/js/translated/build.js:2587
msgid "Consumable item"
msgstr "Расходник"
-#: templates/js/translated/bom.js:1279
+#: templates/js/translated/bom.js:1285
msgid "Validate BOM Item"
msgstr ""
-#: templates/js/translated/bom.js:1281
+#: templates/js/translated/bom.js:1287
msgid "This line has been validated"
msgstr ""
-#: templates/js/translated/bom.js:1283
+#: templates/js/translated/bom.js:1289
msgid "Edit substitute parts"
msgstr ""
-#: templates/js/translated/bom.js:1285 templates/js/translated/bom.js:1480
+#: templates/js/translated/bom.js:1291 templates/js/translated/bom.js:1486
msgid "Edit BOM Item"
msgstr "Редактировать элемент BOM"
-#: templates/js/translated/bom.js:1287
+#: templates/js/translated/bom.js:1293
msgid "Delete BOM Item"
msgstr "Удалить элемент BOM"
-#: templates/js/translated/bom.js:1307
+#: templates/js/translated/bom.js:1313
msgid "View BOM"
msgstr "Просмотр BOM"
-#: templates/js/translated/bom.js:1391
+#: templates/js/translated/bom.js:1397
msgid "No BOM items found"
msgstr ""
-#: templates/js/translated/bom.js:1651 templates/js/translated/build.js:2486
+#: templates/js/translated/bom.js:1657 templates/js/translated/build.js:2486
msgid "Required Part"
msgstr "Необходимая деталь"
-#: templates/js/translated/bom.js:1677
+#: templates/js/translated/bom.js:1683
msgid "Inherited from parent BOM"
msgstr ""
@@ -11449,29 +11480,29 @@ msgstr "Количество единиц"
msgid "Sufficient stock available"
msgstr ""
-#: templates/js/translated/build.js:2643
+#: templates/js/translated/build.js:2647
msgid "Consumable Item"
msgstr "Расходник"
-#: templates/js/translated/build.js:2648
+#: templates/js/translated/build.js:2652
msgid "Tracked item"
msgstr "Отслеживаемый элемент"
-#: templates/js/translated/build.js:2655
+#: templates/js/translated/build.js:2659
#: templates/js/translated/sales_order.js:2016
msgid "Build stock"
msgstr "Запасы производства"
-#: templates/js/translated/build.js:2660 templates/js/translated/stock.js:1829
+#: templates/js/translated/build.js:2664 templates/js/translated/stock.js:1829
msgid "Order stock"
msgstr "Заказать запасы"
-#: templates/js/translated/build.js:2664
+#: templates/js/translated/build.js:2668
#: templates/js/translated/sales_order.js:2010
msgid "Allocate stock"
msgstr "Зарезервировать Остатки"
-#: templates/js/translated/build.js:2668
+#: templates/js/translated/build.js:2672
msgid "Remove stock allocation"
msgstr ""
@@ -12313,64 +12344,64 @@ msgstr ""
msgid "Subscribed category"
msgstr "Категория с подпиской"
-#: templates/js/translated/part.js:2855
+#: templates/js/translated/part.js:2864
msgid "No test templates matching query"
msgstr ""
-#: templates/js/translated/part.js:2877 templates/js/translated/search.js:342
+#: templates/js/translated/part.js:2886 templates/js/translated/search.js:342
msgid "results"
msgstr "результаты"
-#: templates/js/translated/part.js:2927 templates/js/translated/stock.js:1446
+#: templates/js/translated/part.js:2936 templates/js/translated/stock.js:1446
msgid "Edit test result"
msgstr "Редактировать результаты тестирования"
-#: templates/js/translated/part.js:2928 templates/js/translated/stock.js:1447
+#: templates/js/translated/part.js:2937 templates/js/translated/stock.js:1447
#: templates/js/translated/stock.js:1692
msgid "Delete test result"
msgstr ""
-#: templates/js/translated/part.js:2932
+#: templates/js/translated/part.js:2941
msgid "This test is defined for a parent part"
msgstr ""
-#: templates/js/translated/part.js:2948
+#: templates/js/translated/part.js:2957
msgid "Edit Test Result Template"
msgstr ""
-#: templates/js/translated/part.js:2962
+#: templates/js/translated/part.js:2971
msgid "Delete Test Result Template"
msgstr ""
-#: templates/js/translated/part.js:3041 templates/js/translated/part.js:3042
+#: templates/js/translated/part.js:3050 templates/js/translated/part.js:3051
msgid "No date specified"
msgstr ""
-#: templates/js/translated/part.js:3044
+#: templates/js/translated/part.js:3053
msgid "Specified date is in the past"
msgstr ""
-#: templates/js/translated/part.js:3050
+#: templates/js/translated/part.js:3059
msgid "Speculative"
msgstr "Приблизительный"
-#: templates/js/translated/part.js:3100
+#: templates/js/translated/part.js:3109
msgid "No scheduling information available for this part"
msgstr ""
-#: templates/js/translated/part.js:3106
+#: templates/js/translated/part.js:3115
msgid "Error fetching scheduling information for this part"
msgstr ""
-#: templates/js/translated/part.js:3202
+#: templates/js/translated/part.js:3211
msgid "Scheduled Stock Quantities"
msgstr ""
-#: templates/js/translated/part.js:3218
+#: templates/js/translated/part.js:3227
msgid "Maximum Quantity"
msgstr "Максимальное количество"
-#: templates/js/translated/part.js:3263
+#: templates/js/translated/part.js:3272
msgid "Minimum Stock Level"
msgstr ""
@@ -14052,4 +14083,3 @@ msgstr "Разрешение на редактирование элементо
#: users/models.py:413
msgid "Permission to delete items"
msgstr "Разрешение на удаление элементов"
-
diff --git a/InvenTree/locale/sk/LC_MESSAGES/django.po b/InvenTree/locale/sk/LC_MESSAGES/django.po
index 8a47436eff..cc3c548673 100644
--- a/InvenTree/locale/sk/LC_MESSAGES/django.po
+++ b/InvenTree/locale/sk/LC_MESSAGES/django.po
@@ -2,7 +2,7 @@ msgid ""
msgstr ""
"Project-Id-Version: inventree\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2024-02-28 04:05+0000\n"
+"POT-Creation-Date: 2024-03-05 00:41+0000\n"
"PO-Revision-Date: 2024-02-28 07:23\n"
"Last-Translator: \n"
"Language-Team: Slovak\n"
@@ -66,9 +66,9 @@ msgstr ""
#: report/templates/report/inventree_build_order_base.html:172
#: stock/admin.py:226 stock/models.py:2335 stock/models.py:2451
#: stock/serializers.py:479 stock/serializers.py:632 stock/serializers.py:728
-#: stock/serializers.py:778 stock/serializers.py:1081 stock/serializers.py:1170
-#: stock/serializers.py:1335 stock/templates/stock/stock_sidebar.html:25
-#: templates/js/translated/barcode.js:143 templates/js/translated/bom.js:1259
+#: stock/serializers.py:778 stock/serializers.py:1087 stock/serializers.py:1176
+#: stock/serializers.py:1341 stock/templates/stock/stock_sidebar.html:25
+#: templates/js/translated/barcode.js:143 templates/js/translated/bom.js:1265
#: templates/js/translated/company.js:1674 templates/js/translated/order.js:347
#: templates/js/translated/part.js:1080
#: templates/js/translated/purchase_order.js:2201
@@ -523,7 +523,7 @@ msgstr ""
#: templates/js/translated/order.js:298 templates/js/translated/part.js:1238
#: templates/js/translated/part.js:1483 templates/js/translated/part.js:1621
#: templates/js/translated/part.js:1958 templates/js/translated/part.js:2355
-#: templates/js/translated/part.js:2785 templates/js/translated/part.js:2887
+#: templates/js/translated/part.js:2785 templates/js/translated/part.js:2896
#: templates/js/translated/plugin.js:80
#: templates/js/translated/purchase_order.js:1707
#: templates/js/translated/purchase_order.js:1850
@@ -678,7 +678,7 @@ msgstr ""
msgid "Downloading images from remote URL is not enabled"
msgstr ""
-#: InvenTree/status.py:66 part/serializers.py:1120
+#: InvenTree/status.py:66 part/serializers.py:1138
msgid "Background worker check failed"
msgstr ""
@@ -960,7 +960,7 @@ msgid "Tracked"
msgstr ""
#: build/api.py:285 part/admin.py:144 templates/js/translated/build.js:1741
-#: templates/js/translated/build.js:2626
+#: templates/js/translated/build.js:2630
#: templates/js/translated/sales_order.js:1929
#: templates/js/translated/table_filters.js:571
msgid "Allocated"
@@ -1044,11 +1044,11 @@ msgstr ""
#: build/models.py:199 build/templates/build/build_base.html:97
#: build/templates/build/detail.html:29 company/models.py:1044
#: order/models.py:1389 order/models.py:1532 order/models.py:1533
-#: part/api.py:1528 part/models.py:389 part/models.py:3003 part/models.py:3147
-#: part/models.py:3291 part/models.py:3314 part/models.py:3335
-#: part/models.py:3357 part/models.py:3458 part/models.py:3754
-#: part/models.py:3885 part/models.py:3978 part/models.py:4339
-#: part/serializers.py:1066 part/serializers.py:1631
+#: part/api.py:1528 part/api.py:1820 part/models.py:389 part/models.py:3003
+#: part/models.py:3147 part/models.py:3291 part/models.py:3314
+#: part/models.py:3335 part/models.py:3357 part/models.py:3458
+#: part/models.py:3754 part/models.py:3885 part/models.py:3978
+#: part/models.py:4339 part/serializers.py:1084 part/serializers.py:1659
#: part/templates/part/part_app_base.html:8
#: part/templates/part/part_pricing.html:12
#: part/templates/part/upload_bom.html:52
@@ -1147,7 +1147,7 @@ msgid "Build status code"
msgstr ""
#: build/models.py:264 build/serializers.py:280 order/serializers.py:549
-#: stock/models.py:826 stock/serializers.py:1300
+#: stock/models.py:826 stock/serializers.py:1306
#: templates/js/translated/purchase_order.js:1129
msgid "Batch Code"
msgstr ""
@@ -1242,48 +1242,48 @@ msgstr ""
msgid "Project code for this build order"
msgstr ""
-#: build/models.py:559
+#: build/models.py:575
#, python-brace-format
msgid "Build order {build} has been completed"
msgstr ""
-#: build/models.py:565
+#: build/models.py:581
msgid "A build order has been completed"
msgstr ""
-#: build/models.py:783 build/models.py:858
+#: build/models.py:799 build/models.py:874
msgid "No build output specified"
msgstr ""
-#: build/models.py:786
+#: build/models.py:802
msgid "Build output is already completed"
msgstr ""
-#: build/models.py:789
+#: build/models.py:805
msgid "Build output does not match Build Order"
msgstr ""
-#: build/models.py:862 build/serializers.py:223 build/serializers.py:262
+#: build/models.py:878 build/serializers.py:223 build/serializers.py:262
#: build/serializers.py:831 order/models.py:526 order/serializers.py:401
-#: order/serializers.py:544 part/serializers.py:1423 part/serializers.py:1789
+#: order/serializers.py:544 part/serializers.py:1442 part/serializers.py:1817
#: stock/models.py:665 stock/models.py:1477 stock/serializers.py:450
msgid "Quantity must be greater than zero"
msgstr ""
-#: build/models.py:867 build/serializers.py:228
+#: build/models.py:883 build/serializers.py:228
msgid "Quantity cannot be greater than the output quantity"
msgstr ""
-#: build/models.py:924 build/serializers.py:533
+#: build/models.py:940 build/serializers.py:533
#, python-brace-format
msgid "Build output {serial} has not passed all required tests"
msgstr ""
-#: build/models.py:1286
+#: build/models.py:1302
msgid "Build object"
msgstr ""
-#: build/models.py:1300 build/models.py:1558 build/serializers.py:210
+#: build/models.py:1316 build/models.py:1574 build/serializers.py:210
#: build/serializers.py:247 build/templates/build/build_base.html:102
#: build/templates/build/detail.html:34 common/models.py:2432
#: order/models.py:1247 order/models.py:1902 order/serializers.py:1306
@@ -1310,7 +1310,7 @@ msgstr ""
#: templates/js/translated/company.js:1808
#: templates/js/translated/model_renderers.js:230
#: templates/js/translated/order.js:304 templates/js/translated/part.js:961
-#: templates/js/translated/part.js:1811 templates/js/translated/part.js:3332
+#: templates/js/translated/part.js:1811 templates/js/translated/part.js:3341
#: templates/js/translated/pricing.js:381
#: templates/js/translated/pricing.js:474
#: templates/js/translated/pricing.js:522
@@ -1330,38 +1330,38 @@ msgstr ""
msgid "Quantity"
msgstr ""
-#: build/models.py:1301
+#: build/models.py:1317
msgid "Required quantity for build order"
msgstr ""
-#: build/models.py:1381
+#: build/models.py:1397
msgid "Build item must specify a build output, as master part is marked as trackable"
msgstr ""
-#: build/models.py:1390
+#: build/models.py:1406
#, python-brace-format
msgid "Allocated quantity ({q}) must not exceed available stock quantity ({a})"
msgstr ""
-#: build/models.py:1400 order/models.py:1853
+#: build/models.py:1416 order/models.py:1853
msgid "Stock item is over-allocated"
msgstr ""
-#: build/models.py:1406 order/models.py:1856
+#: build/models.py:1422 order/models.py:1856
msgid "Allocation quantity must be greater than zero"
msgstr ""
-#: build/models.py:1412
+#: build/models.py:1428
msgid "Quantity must be 1 for serialized stock"
msgstr ""
-#: build/models.py:1473
+#: build/models.py:1489
msgid "Selected stock item does not match BOM line"
msgstr ""
-#: build/models.py:1545 build/serializers.py:811 order/serializers.py:1150
-#: order/serializers.py:1171 stock/serializers.py:544 stock/serializers.py:1019
-#: stock/serializers.py:1131 stock/templates/stock/item_base.html:10
+#: build/models.py:1561 build/serializers.py:811 order/serializers.py:1150
+#: order/serializers.py:1171 stock/serializers.py:544 stock/serializers.py:1025
+#: stock/serializers.py:1137 stock/templates/stock/item_base.html:10
#: stock/templates/stock/item_base.html:23
#: stock/templates/stock/item_base.html:194
#: templates/js/translated/build.js:1742
@@ -1376,19 +1376,19 @@ msgstr ""
msgid "Stock Item"
msgstr ""
-#: build/models.py:1546
+#: build/models.py:1562
msgid "Source stock item"
msgstr ""
-#: build/models.py:1559
+#: build/models.py:1575
msgid "Stock quantity to allocate to build"
msgstr ""
-#: build/models.py:1567
+#: build/models.py:1583
msgid "Install into"
msgstr ""
-#: build/models.py:1568
+#: build/models.py:1584
msgid "Destination stock item"
msgstr ""
@@ -1452,9 +1452,9 @@ msgid "A list of build outputs must be provided"
msgstr ""
#: build/serializers.py:426 build/serializers.py:498 order/serializers.py:533
-#: order/serializers.py:641 order/serializers.py:1646 part/serializers.py:1086
+#: order/serializers.py:641 order/serializers.py:1646 part/serializers.py:1104
#: stock/serializers.py:472 stock/serializers.py:627 stock/serializers.py:723
-#: stock/serializers.py:1163 stock/serializers.py:1419
+#: stock/serializers.py:1169 stock/serializers.py:1425
#: stock/templates/stock/item_base.html:394
#: templates/js/translated/barcode.js:547
#: templates/js/translated/barcode.js:795 templates/js/translated/build.js:999
@@ -1494,7 +1494,7 @@ msgstr ""
#: build/serializers.py:505 build/templates/build/build_base.html:151
#: build/templates/build/detail.html:62 order/models.py:910
#: order/models.py:2005 order/serializers.py:565 stock/admin.py:165
-#: stock/serializers.py:774 stock/serializers.py:1307
+#: stock/serializers.py:774 stock/serializers.py:1313
#: stock/templates/stock/item_base.html:427
#: templates/js/translated/barcode.js:252 templates/js/translated/build.js:2189
#: templates/js/translated/purchase_order.js:1308
@@ -1602,7 +1602,7 @@ msgstr ""
msgid "bom_item.part must point to the same part as the build order"
msgstr ""
-#: build/serializers.py:817 stock/serializers.py:1032
+#: build/serializers.py:817 stock/serializers.py:1038
msgid "Item must be in stock"
msgstr ""
@@ -1659,44 +1659,45 @@ msgstr ""
msgid "Allocate optional BOM items to build order"
msgstr ""
-#: build/serializers.py:1096 part/models.py:3895 part/models.py:4331
+#: build/serializers.py:1097 part/models.py:3895 part/models.py:4331
#: stock/api.py:745
msgid "BOM Item"
msgstr ""
-#: build/serializers.py:1105 templates/js/translated/index.js:130
+#: build/serializers.py:1106 templates/js/translated/index.js:130
msgid "Allocated Stock"
msgstr ""
-#: build/serializers.py:1110 part/admin.py:132 part/bom.py:173
-#: part/serializers.py:1441 part/templates/part/part_base.html:210
-#: templates/js/translated/bom.js:1202 templates/js/translated/build.js:2614
-#: templates/js/translated/part.js:709 templates/js/translated/part.js:2148
+#: build/serializers.py:1111 part/admin.py:132 part/bom.py:173
+#: part/serializers.py:798 part/serializers.py:1460
+#: part/templates/part/part_base.html:210 templates/js/translated/bom.js:1208
+#: templates/js/translated/build.js:2614 templates/js/translated/part.js:709
+#: templates/js/translated/part.js:2148
#: templates/js/translated/table_filters.js:170
msgid "On Order"
msgstr ""
-#: build/serializers.py:1115 part/serializers.py:1443
+#: build/serializers.py:1116 part/serializers.py:1462
#: templates/js/translated/build.js:2618
#: templates/js/translated/table_filters.js:360
msgid "In Production"
msgstr ""
-#: build/serializers.py:1120 part/bom.py:172 part/serializers.py:1454
+#: build/serializers.py:1121 part/bom.py:172 part/serializers.py:1473
#: part/templates/part/part_base.html:192
#: templates/js/translated/sales_order.js:1893
msgid "Available Stock"
msgstr ""
-#: build/tasks.py:149
+#: build/tasks.py:171
msgid "Stock required for build order"
msgstr ""
-#: build/tasks.py:166
+#: build/tasks.py:188
msgid "Overdue Build Order"
msgstr ""
-#: build/tasks.py:171
+#: build/tasks.py:193
#, python-brace-format
msgid "Build order {bo} is now overdue"
msgstr ""
@@ -1990,27 +1991,31 @@ msgstr ""
msgid "Order Parts"
msgstr ""
-#: build/templates/build/detail.html:210
-msgid "Incomplete Build Outputs"
-msgstr ""
-
-#: build/templates/build/detail.html:214
-msgid "Create new build output"
+#: build/templates/build/detail.html:205
+msgid "Available stock has been filtered based on specified source location for this build order"
msgstr ""
#: build/templates/build/detail.html:215
+msgid "Incomplete Build Outputs"
+msgstr ""
+
+#: build/templates/build/detail.html:219
+msgid "Create new build output"
+msgstr ""
+
+#: build/templates/build/detail.html:220
msgid "New Build Output"
msgstr ""
-#: build/templates/build/detail.html:232 build/templates/build/sidebar.html:15
+#: build/templates/build/detail.html:237 build/templates/build/sidebar.html:15
msgid "Consumed Stock"
msgstr ""
-#: build/templates/build/detail.html:244
+#: build/templates/build/detail.html:249
msgid "Completed Build Outputs"
msgstr ""
-#: build/templates/build/detail.html:256 build/templates/build/sidebar.html:19
+#: build/templates/build/detail.html:261 build/templates/build/sidebar.html:19
#: company/templates/company/detail.html:229
#: company/templates/company/manufacturer_part.html:141
#: company/templates/company/manufacturer_part_sidebar.html:9
@@ -2026,15 +2031,15 @@ msgstr ""
msgid "Attachments"
msgstr ""
-#: build/templates/build/detail.html:271
+#: build/templates/build/detail.html:276
msgid "Build Notes"
msgstr ""
-#: build/templates/build/detail.html:426
+#: build/templates/build/detail.html:434
msgid "Allocation Complete"
msgstr ""
-#: build/templates/build/detail.html:427
+#: build/templates/build/detail.html:435
msgid "All lines have been fully allocated"
msgstr ""
@@ -2436,7 +2441,7 @@ msgid "Parts are templates by default"
msgstr ""
#: common/models.py:1456 part/admin.py:91 part/admin.py:431 part/models.py:1015
-#: templates/js/translated/bom.js:1633
+#: templates/js/translated/bom.js:1639
#: templates/js/translated/table_filters.js:330
#: templates/js/translated/table_filters.js:721
msgid "Assembly"
@@ -3495,7 +3500,7 @@ msgstr ""
msgid "Price break quantity"
msgstr ""
-#: common/models.py:2440 company/serializers.py:484 order/admin.py:42
+#: common/models.py:2440 company/serializers.py:486 order/admin.py:42
#: order/models.py:1321 order/models.py:2226
#: templates/js/translated/company.js:1813 templates/js/translated/part.js:1885
#: templates/js/translated/pricing.js:621
@@ -3972,7 +3977,7 @@ msgstr ""
#: company/models.py:495 company/templates/company/company_base.html:76
#: company/templates/company/manufacturer_part.html:90
-#: company/templates/company/supplier_part.html:145 part/serializers.py:497
+#: company/templates/company/supplier_part.html:145 part/serializers.py:505
#: stock/templates/stock/item_base.html:207
#: templates/js/translated/company.js:506
#: templates/js/translated/company.js:1108
@@ -3987,7 +3992,7 @@ msgid "Select manufacturer"
msgstr ""
#: company/models.py:502 company/templates/company/manufacturer_part.html:101
-#: company/templates/company/supplier_part.html:153 part/serializers.py:507
+#: company/templates/company/supplier_part.html:153 part/serializers.py:515
#: templates/js/translated/company.js:351
#: templates/js/translated/company.js:1107
#: templates/js/translated/company.js:1302
@@ -4059,7 +4064,7 @@ msgstr ""
#: company/models.py:795 company/templates/company/company_base.html:81
#: company/templates/company/supplier_part.html:129 order/models.py:453
#: order/templates/order/order_base.html:136 part/bom.py:272 part/bom.py:310
-#: part/serializers.py:481 plugin/builtin/suppliers/digikey.py:25
+#: part/serializers.py:489 plugin/builtin/suppliers/digikey.py:25
#: plugin/builtin/suppliers/lcsc.py:26 plugin/builtin/suppliers/mouser.py:24
#: plugin/builtin/suppliers/tme.py:26 stock/templates/stock/item_base.html:224
#: templates/email/overdue_purchase_order.html:16
@@ -4076,7 +4081,7 @@ msgstr ""
msgid "Select supplier"
msgstr ""
-#: company/models.py:802 part/serializers.py:492
+#: company/models.py:802 part/serializers.py:500
msgid "Supplier stock keeping unit"
msgstr ""
@@ -4112,7 +4117,7 @@ msgid "Minimum charge (e.g. stocking fee)"
msgstr ""
#: company/models.py:851 company/templates/company/supplier_part.html:160
-#: stock/admin.py:224 stock/models.py:785 stock/serializers.py:1317
+#: stock/admin.py:224 stock/models.py:785 stock/serializers.py:1323
#: stock/templates/stock/item_base.html:240
#: templates/js/translated/company.js:1636
#: templates/js/translated/stock.js:2387
@@ -4157,7 +4162,7 @@ msgstr ""
msgid "Date of last update of availability data"
msgstr ""
-#: company/serializers.py:153
+#: company/serializers.py:155
msgid "Default currency used for this supplier"
msgstr ""
@@ -4218,7 +4223,7 @@ msgstr ""
#: company/templates/company/company_base.html:86 order/models.py:898
#: order/models.py:1993 order/templates/order/return_order_base.html:131
#: order/templates/order/sales_order_base.html:144 stock/models.py:807
-#: stock/models.py:808 stock/serializers.py:1067
+#: stock/models.py:808 stock/serializers.py:1073
#: stock/templates/stock/item_base.html:405
#: templates/email/overdue_sales_order.html:16
#: templates/js/translated/company.js:502
@@ -4429,8 +4434,9 @@ msgstr ""
#: company/templates/company/manufacturer_part.html:119
#: company/templates/company/supplier_part.html:15 company/views.py:31
-#: part/admin.py:122 part/templates/part/part_sidebar.html:33
-#: templates/InvenTree/search.html:190 templates/navbar.html:48
+#: part/admin.py:122 part/serializers.py:802
+#: part/templates/part/part_sidebar.html:33 templates/InvenTree/search.html:190
+#: templates/navbar.html:48
msgid "Suppliers"
msgstr ""
@@ -4528,7 +4534,7 @@ msgid "No supplier information available"
msgstr ""
#: company/templates/company/supplier_part.html:139 part/bom.py:279
-#: part/bom.py:311 part/serializers.py:491
+#: part/bom.py:311 part/serializers.py:499
#: templates/js/translated/company.js:349 templates/js/translated/part.js:1786
#: templates/js/translated/pricing.js:510
#: templates/js/translated/purchase_order.js:1851
@@ -4577,10 +4583,12 @@ msgstr ""
msgid "Update Part Availability"
msgstr ""
-#: company/templates/company/supplier_part_sidebar.html:5 part/stocktake.py:223
+#: company/templates/company/supplier_part_sidebar.html:5
+#: part/serializers.py:801 part/stocktake.py:223
#: part/templates/part/category.html:183
#: part/templates/part/category_sidebar.html:17 stock/admin.py:69
-#: stock/serializers.py:760 stock/templates/stock/location.html:170
+#: stock/serializers.py:760 stock/serializers.py:924
+#: stock/templates/stock/location.html:170
#: stock/templates/stock/location.html:184
#: stock/templates/stock/location.html:196
#: stock/templates/stock/location_sidebar.html:7
@@ -4640,7 +4648,7 @@ msgid "Label template file"
msgstr ""
#: label/models.py:143 part/models.py:3484 report/models.py:322
-#: templates/js/translated/part.js:2891
+#: templates/js/translated/part.js:2900
#: templates/js/translated/table_filters.js:481
msgid "Enabled"
msgstr ""
@@ -5733,7 +5741,7 @@ msgid "Pending Shipments"
msgstr ""
#: order/templates/order/sales_order_detail.html:71
-#: templates/js/translated/bom.js:1271 templates/js/translated/filters.js:296
+#: templates/js/translated/bom.js:1277 templates/js/translated/filters.js:296
msgid "Actions"
msgstr ""
@@ -5861,10 +5869,10 @@ msgstr ""
msgid "Category Path"
msgstr ""
-#: part/admin.py:323 part/models.py:390 part/serializers.py:259
-#: part/serializers.py:373 part/templates/part/cat_link.html:3
-#: part/templates/part/category.html:23 part/templates/part/category.html:141
-#: part/templates/part/category.html:161
+#: part/admin.py:323 part/models.py:390 part/serializers.py:112
+#: part/serializers.py:265 part/serializers.py:381
+#: part/templates/part/cat_link.html:3 part/templates/part/category.html:23
+#: part/templates/part/category.html:141 part/templates/part/category.html:161
#: part/templates/part/category_sidebar.html:9
#: templates/InvenTree/index.html:36 templates/InvenTree/search.html:84
#: templates/InvenTree/settings/sidebar.html:47
@@ -5889,13 +5897,13 @@ msgstr ""
msgid "Part IPN"
msgstr ""
-#: part/admin.py:421 part/serializers.py:1220
+#: part/admin.py:421 part/serializers.py:1238
#: templates/js/translated/pricing.js:358
#: templates/js/translated/pricing.js:1024
msgid "Minimum Price"
msgstr ""
-#: part/admin.py:426 part/serializers.py:1235
+#: part/admin.py:426 part/serializers.py:1253
#: templates/js/translated/pricing.js:353
#: templates/js/translated/pricing.js:1032
msgid "Maximum Price"
@@ -5974,7 +5982,7 @@ msgid "This option must be selected"
msgstr ""
#: part/api.py:1541 part/models.py:895 part/models.py:3385 part/models.py:3831
-#: part/serializers.py:388 part/serializers.py:1076
+#: part/serializers.py:396 part/serializers.py:1094
#: part/templates/part/part_base.html:260 stock/api.py:733
#: templates/InvenTree/settings/settings_staff_js.html:300
#: templates/js/translated/notification.js:60
@@ -5982,12 +5990,17 @@ msgstr ""
msgid "Category"
msgstr ""
+#: part/api.py:1828
+msgid "Uses"
+msgstr ""
+
#: part/bom.py:170 part/models.py:100 part/models.py:938
#: part/templates/part/category.html:116 part/templates/part/part_base.html:367
msgid "Default Location"
msgstr ""
-#: part/bom.py:171 templates/email/low_stock_notification.html:16
+#: part/bom.py:171 part/serializers.py:803
+#: templates/email/low_stock_notification.html:16
msgid "Total Stock"
msgstr ""
@@ -6010,7 +6023,8 @@ msgstr ""
msgid "Default location for parts in this category"
msgstr ""
-#: part/models.py:106 stock/models.py:165 templates/js/translated/stock.js:2736
+#: part/models.py:106 stock/models.py:165 templates/js/translated/part.js:2810
+#: templates/js/translated/stock.js:2736
#: templates/js/translated/table_filters.js:239
#: templates/js/translated/table_filters.js:283
msgid "Structural"
@@ -6418,7 +6432,7 @@ msgstr ""
msgid "Test with this name already exists for this part"
msgstr ""
-#: part/models.py:3464 templates/js/translated/part.js:2870
+#: part/models.py:3464 templates/js/translated/part.js:2879
msgid "Test Name"
msgstr ""
@@ -6446,7 +6460,7 @@ msgstr ""
msgid "Is this test enabled?"
msgstr ""
-#: part/models.py:3489 templates/js/translated/part.js:2899
+#: part/models.py:3489 templates/js/translated/part.js:2908
#: templates/js/translated/table_filters.js:477
msgid "Required"
msgstr ""
@@ -6455,7 +6469,7 @@ msgstr ""
msgid "Is this test required to pass?"
msgstr ""
-#: part/models.py:3495 templates/js/translated/part.js:2907
+#: part/models.py:3495 templates/js/translated/part.js:2916
msgid "Requires Value"
msgstr ""
@@ -6463,7 +6477,7 @@ msgstr ""
msgid "Does this test require a value when adding a test result?"
msgstr ""
-#: part/models.py:3501 templates/js/translated/part.js:2914
+#: part/models.py:3501 templates/js/translated/part.js:2923
msgid "Requires Attachment"
msgstr ""
@@ -6685,311 +6699,323 @@ msgstr ""
msgid "Duplicate relationship already exists"
msgstr ""
-#: part/serializers.py:128 part/templates/part/category.html:122
-#: part/templates/part/category.html:207
+#: part/serializers.py:114 part/serializers.py:134
+#: part/templates/part/category.html:122 part/templates/part/category.html:207
#: part/templates/part/category_sidebar.html:7
msgid "Subcategories"
msgstr ""
-#: part/serializers.py:172
+#: part/serializers.py:178
msgid "Results"
msgstr ""
-#: part/serializers.py:173
+#: part/serializers.py:179
msgid "Number of results recorded against this template"
msgstr ""
-#: part/serializers.py:197 part/serializers.py:215 stock/serializers.py:384
+#: part/serializers.py:203 part/serializers.py:221 stock/serializers.py:384
msgid "Purchase currency of this stock item"
msgstr ""
-#: part/serializers.py:260
+#: part/serializers.py:266
msgid "Number of parts using this template"
msgstr ""
-#: part/serializers.py:379
+#: part/serializers.py:387
msgid "No parts selected"
msgstr ""
-#: part/serializers.py:389
+#: part/serializers.py:397
msgid "Select category"
msgstr ""
-#: part/serializers.py:419
+#: part/serializers.py:427
msgid "Original Part"
msgstr ""
-#: part/serializers.py:420
+#: part/serializers.py:428
msgid "Select original part to duplicate"
msgstr ""
-#: part/serializers.py:425
+#: part/serializers.py:433
msgid "Copy Image"
msgstr ""
-#: part/serializers.py:426
+#: part/serializers.py:434
msgid "Copy image from original part"
msgstr ""
-#: part/serializers.py:432 part/templates/part/detail.html:277
+#: part/serializers.py:440 part/templates/part/detail.html:277
msgid "Copy BOM"
msgstr ""
-#: part/serializers.py:433
+#: part/serializers.py:441
msgid "Copy bill of materials from original part"
msgstr ""
-#: part/serializers.py:439
+#: part/serializers.py:447
msgid "Copy Parameters"
msgstr ""
-#: part/serializers.py:440
+#: part/serializers.py:448
msgid "Copy parameter data from original part"
msgstr ""
-#: part/serializers.py:446
+#: part/serializers.py:454
msgid "Copy Notes"
msgstr ""
-#: part/serializers.py:447
+#: part/serializers.py:455
msgid "Copy notes from original part"
msgstr ""
-#: part/serializers.py:460
+#: part/serializers.py:468
msgid "Initial Stock Quantity"
msgstr ""
-#: part/serializers.py:462
+#: part/serializers.py:470
msgid "Specify initial stock quantity for this Part. If quantity is zero, no stock is added."
msgstr ""
-#: part/serializers.py:469
+#: part/serializers.py:477
msgid "Initial Stock Location"
msgstr ""
-#: part/serializers.py:470
+#: part/serializers.py:478
msgid "Specify initial stock location for this Part"
msgstr ""
-#: part/serializers.py:482
+#: part/serializers.py:490
msgid "Select supplier (or leave blank to skip)"
msgstr ""
-#: part/serializers.py:498
+#: part/serializers.py:506
msgid "Select manufacturer (or leave blank to skip)"
msgstr ""
-#: part/serializers.py:508
+#: part/serializers.py:516
msgid "Manufacturer part number"
msgstr ""
-#: part/serializers.py:515
+#: part/serializers.py:523
msgid "Selected company is not a valid supplier"
msgstr ""
-#: part/serializers.py:524
+#: part/serializers.py:532
msgid "Selected company is not a valid manufacturer"
msgstr ""
-#: part/serializers.py:535
+#: part/serializers.py:543
msgid "Manufacturer part matching this MPN already exists"
msgstr ""
-#: part/serializers.py:542
+#: part/serializers.py:550
msgid "Supplier part matching this SKU already exists"
msgstr ""
-#: part/serializers.py:815 part/templates/part/copy_part.html:9
+#: part/serializers.py:804
+msgid "External Stock"
+msgstr ""
+
+#: part/serializers.py:806
+msgid "Unallocated Stock"
+msgstr ""
+
+#: part/serializers.py:808
+msgid "Variant Stock"
+msgstr ""
+
+#: part/serializers.py:833 part/templates/part/copy_part.html:9
#: templates/js/translated/part.js:471
msgid "Duplicate Part"
msgstr ""
-#: part/serializers.py:816
+#: part/serializers.py:834
msgid "Copy initial data from another Part"
msgstr ""
-#: part/serializers.py:822 templates/js/translated/part.js:102
+#: part/serializers.py:840 templates/js/translated/part.js:102
msgid "Initial Stock"
msgstr ""
-#: part/serializers.py:823
+#: part/serializers.py:841
msgid "Create Part with initial stock quantity"
msgstr ""
-#: part/serializers.py:829
+#: part/serializers.py:847
msgid "Supplier Information"
msgstr ""
-#: part/serializers.py:830
+#: part/serializers.py:848
msgid "Add initial supplier information for this part"
msgstr ""
-#: part/serializers.py:838
+#: part/serializers.py:856
msgid "Copy Category Parameters"
msgstr ""
-#: part/serializers.py:839
+#: part/serializers.py:857
msgid "Copy parameter templates from selected part category"
msgstr ""
-#: part/serializers.py:844
+#: part/serializers.py:862
msgid "Existing Image"
msgstr ""
-#: part/serializers.py:845
+#: part/serializers.py:863
msgid "Filename of an existing part image"
msgstr ""
-#: part/serializers.py:862
+#: part/serializers.py:880
msgid "Image file does not exist"
msgstr ""
-#: part/serializers.py:1068
+#: part/serializers.py:1086
msgid "Limit stocktake report to a particular part, and any variant parts"
msgstr ""
-#: part/serializers.py:1078
+#: part/serializers.py:1096
msgid "Limit stocktake report to a particular part category, and any child categories"
msgstr ""
-#: part/serializers.py:1088
+#: part/serializers.py:1106
msgid "Limit stocktake report to a particular stock location, and any child locations"
msgstr ""
-#: part/serializers.py:1094
+#: part/serializers.py:1112
msgid "Exclude External Stock"
msgstr ""
-#: part/serializers.py:1095
+#: part/serializers.py:1113
msgid "Exclude stock items in external locations"
msgstr ""
-#: part/serializers.py:1100
+#: part/serializers.py:1118
msgid "Generate Report"
msgstr ""
-#: part/serializers.py:1101
+#: part/serializers.py:1119
msgid "Generate report file containing calculated stocktake data"
msgstr ""
-#: part/serializers.py:1106
+#: part/serializers.py:1124
msgid "Update Parts"
msgstr ""
-#: part/serializers.py:1107
+#: part/serializers.py:1125
msgid "Update specified parts with calculated stocktake data"
msgstr ""
-#: part/serializers.py:1115
+#: part/serializers.py:1133
msgid "Stocktake functionality is not enabled"
msgstr ""
-#: part/serializers.py:1221
+#: part/serializers.py:1239
msgid "Override calculated value for minimum price"
msgstr ""
-#: part/serializers.py:1228
+#: part/serializers.py:1246
msgid "Minimum price currency"
msgstr ""
-#: part/serializers.py:1236
+#: part/serializers.py:1254
msgid "Override calculated value for maximum price"
msgstr ""
-#: part/serializers.py:1243
+#: part/serializers.py:1261
msgid "Maximum price currency"
msgstr ""
-#: part/serializers.py:1272
+#: part/serializers.py:1290
msgid "Update"
msgstr ""
-#: part/serializers.py:1273
+#: part/serializers.py:1291
msgid "Update pricing for this part"
msgstr ""
-#: part/serializers.py:1296
+#: part/serializers.py:1314
#, python-brace-format
msgid "Could not convert from provided currencies to {default_currency}"
msgstr ""
-#: part/serializers.py:1303
+#: part/serializers.py:1321
msgid "Minimum price must not be greater than maximum price"
msgstr ""
-#: part/serializers.py:1306
+#: part/serializers.py:1324
msgid "Maximum price must not be less than minimum price"
msgstr ""
-#: part/serializers.py:1632
+#: part/serializers.py:1660
msgid "Select part to copy BOM from"
msgstr ""
-#: part/serializers.py:1640
+#: part/serializers.py:1668
msgid "Remove Existing Data"
msgstr ""
-#: part/serializers.py:1641
+#: part/serializers.py:1669
msgid "Remove existing BOM items before copying"
msgstr ""
-#: part/serializers.py:1646
+#: part/serializers.py:1674
msgid "Include Inherited"
msgstr ""
-#: part/serializers.py:1647
+#: part/serializers.py:1675
msgid "Include BOM items which are inherited from templated parts"
msgstr ""
-#: part/serializers.py:1652
+#: part/serializers.py:1680
msgid "Skip Invalid Rows"
msgstr ""
-#: part/serializers.py:1653
+#: part/serializers.py:1681
msgid "Enable this option to skip invalid rows"
msgstr ""
-#: part/serializers.py:1658
+#: part/serializers.py:1686
msgid "Copy Substitute Parts"
msgstr ""
-#: part/serializers.py:1659
+#: part/serializers.py:1687
msgid "Copy substitute parts when duplicate BOM items"
msgstr ""
-#: part/serializers.py:1693
+#: part/serializers.py:1721
msgid "Clear Existing BOM"
msgstr ""
-#: part/serializers.py:1694
+#: part/serializers.py:1722
msgid "Delete existing BOM items before uploading"
msgstr ""
-#: part/serializers.py:1724
+#: part/serializers.py:1752
msgid "No part column specified"
msgstr ""
-#: part/serializers.py:1768
+#: part/serializers.py:1796
msgid "Multiple matching parts found"
msgstr ""
-#: part/serializers.py:1771
+#: part/serializers.py:1799
msgid "No matching part found"
msgstr ""
-#: part/serializers.py:1774
+#: part/serializers.py:1802
msgid "Part is not designated as a component"
msgstr ""
-#: part/serializers.py:1783
+#: part/serializers.py:1811
msgid "Quantity not provided"
msgstr ""
-#: part/serializers.py:1791
+#: part/serializers.py:1819
msgid "Invalid quantity"
msgstr ""
-#: part/serializers.py:1812
+#: part/serializers.py:1840
msgid "At least one BOM item is required"
msgstr ""
@@ -7221,7 +7247,7 @@ msgid "Validate BOM"
msgstr ""
#: part/templates/part/detail.html:283 part/templates/part/detail.html:284
-#: templates/js/translated/bom.js:1314 templates/js/translated/bom.js:1315
+#: templates/js/translated/bom.js:1320 templates/js/translated/bom.js:1321
msgid "Add BOM Item"
msgstr ""
@@ -7405,7 +7431,7 @@ msgstr ""
msgid "Allocated to Sales Orders"
msgstr ""
-#: part/templates/part/part_base.html:235 templates/js/translated/bom.js:1213
+#: part/templates/part/part_base.html:235 templates/js/translated/bom.js:1219
msgid "Can Build"
msgstr ""
@@ -8784,7 +8810,7 @@ msgstr ""
msgid "Where is this stock item located?"
msgstr ""
-#: stock/models.py:786 stock/serializers.py:1318
+#: stock/models.py:786 stock/serializers.py:1324
msgid "Packaging this stock item is stored in"
msgstr ""
@@ -8796,7 +8822,7 @@ msgstr ""
msgid "Serial number for this item"
msgstr ""
-#: stock/models.py:830 stock/serializers.py:1301
+#: stock/models.py:830 stock/serializers.py:1307
msgid "Batch code for this stock item"
msgstr ""
@@ -8905,7 +8931,7 @@ msgstr ""
msgid "Serialized stock cannot be merged"
msgstr ""
-#: stock/models.py:1639 stock/serializers.py:1207
+#: stock/models.py:1639 stock/serializers.py:1213
msgid "Duplicate stock items"
msgstr ""
@@ -8986,7 +9012,7 @@ msgstr ""
msgid "Enter serial numbers for new items"
msgstr ""
-#: stock/serializers.py:473 stock/serializers.py:1164 stock/serializers.py:1420
+#: stock/serializers.py:473 stock/serializers.py:1170 stock/serializers.py:1426
msgid "Destination stock location"
msgstr ""
@@ -9059,77 +9085,78 @@ msgstr ""
msgid "No stock items selected"
msgstr ""
-#: stock/serializers.py:863 stock/templates/stock/location.html:165
+#: stock/serializers.py:863 stock/serializers.py:926
+#: stock/templates/stock/location.html:165
#: stock/templates/stock/location.html:213
#: stock/templates/stock/location_sidebar.html:5
msgid "Sublocations"
msgstr ""
-#: stock/serializers.py:1036
+#: stock/serializers.py:1042
msgid "Part must be salable"
msgstr ""
-#: stock/serializers.py:1040
+#: stock/serializers.py:1046
msgid "Item is allocated to a sales order"
msgstr ""
-#: stock/serializers.py:1044
+#: stock/serializers.py:1050
msgid "Item is allocated to a build order"
msgstr ""
-#: stock/serializers.py:1068
+#: stock/serializers.py:1074
msgid "Customer to assign stock items"
msgstr ""
-#: stock/serializers.py:1074
+#: stock/serializers.py:1080
msgid "Selected company is not a customer"
msgstr ""
-#: stock/serializers.py:1082
+#: stock/serializers.py:1088
msgid "Stock assignment notes"
msgstr ""
-#: stock/serializers.py:1092 stock/serializers.py:1346
+#: stock/serializers.py:1098 stock/serializers.py:1352
msgid "A list of stock items must be provided"
msgstr ""
-#: stock/serializers.py:1171
+#: stock/serializers.py:1177
msgid "Stock merging notes"
msgstr ""
-#: stock/serializers.py:1176
+#: stock/serializers.py:1182
msgid "Allow mismatched suppliers"
msgstr ""
-#: stock/serializers.py:1177
+#: stock/serializers.py:1183
msgid "Allow stock items with different supplier parts to be merged"
msgstr ""
-#: stock/serializers.py:1182
+#: stock/serializers.py:1188
msgid "Allow mismatched status"
msgstr ""
-#: stock/serializers.py:1183
+#: stock/serializers.py:1189
msgid "Allow stock items with different status codes to be merged"
msgstr ""
-#: stock/serializers.py:1193
+#: stock/serializers.py:1199
msgid "At least two stock items must be provided"
msgstr ""
-#: stock/serializers.py:1260
+#: stock/serializers.py:1266
msgid "No Change"
msgstr ""
-#: stock/serializers.py:1289
+#: stock/serializers.py:1295
msgid "StockItem primary key value"
msgstr ""
-#: stock/serializers.py:1308
+#: stock/serializers.py:1314
msgid "Stock item status code"
msgstr ""
-#: stock/serializers.py:1336
+#: stock/serializers.py:1342
msgid "Stock transaction notes"
msgstr ""
@@ -10662,7 +10689,7 @@ msgid "The following parts are low on required stock"
msgstr ""
#: templates/email/build_order_required_stock.html:18
-#: templates/js/translated/bom.js:1668 templates/js/translated/build.js:2557
+#: templates/js/translated/bom.js:1674 templates/js/translated/build.js:2557
msgid "Required Quantity"
msgstr ""
@@ -10676,7 +10703,7 @@ msgid "Click on the following link to view this part"
msgstr ""
#: templates/email/low_stock_notification.html:18
-#: templates/js/translated/part.js:3209
+#: templates/js/translated/part.js:3218
msgid "Minimum Quantity"
msgstr ""
@@ -11051,62 +11078,66 @@ msgstr ""
msgid "No pricing available"
msgstr ""
-#: templates/js/translated/bom.js:1182 templates/js/translated/build.js:2596
+#: templates/js/translated/bom.js:1184 templates/js/translated/build.js:2622
+msgid "External stock"
+msgstr ""
+
+#: templates/js/translated/bom.js:1188 templates/js/translated/build.js:2596
#: templates/js/translated/sales_order.js:1910
msgid "No Stock Available"
msgstr ""
-#: templates/js/translated/bom.js:1187 templates/js/translated/build.js:2600
+#: templates/js/translated/bom.js:1193 templates/js/translated/build.js:2600
msgid "Includes variant and substitute stock"
msgstr ""
-#: templates/js/translated/bom.js:1189 templates/js/translated/build.js:2602
+#: templates/js/translated/bom.js:1195 templates/js/translated/build.js:2602
#: templates/js/translated/part.js:1256
#: templates/js/translated/sales_order.js:1907
msgid "Includes variant stock"
msgstr ""
-#: templates/js/translated/bom.js:1191 templates/js/translated/build.js:2604
+#: templates/js/translated/bom.js:1197 templates/js/translated/build.js:2604
msgid "Includes substitute stock"
msgstr ""
-#: templates/js/translated/bom.js:1219 templates/js/translated/build.js:2587
+#: templates/js/translated/bom.js:1225 templates/js/translated/build.js:2587
msgid "Consumable item"
msgstr ""
-#: templates/js/translated/bom.js:1279
+#: templates/js/translated/bom.js:1285
msgid "Validate BOM Item"
msgstr ""
-#: templates/js/translated/bom.js:1281
+#: templates/js/translated/bom.js:1287
msgid "This line has been validated"
msgstr ""
-#: templates/js/translated/bom.js:1283
+#: templates/js/translated/bom.js:1289
msgid "Edit substitute parts"
msgstr ""
-#: templates/js/translated/bom.js:1285 templates/js/translated/bom.js:1480
+#: templates/js/translated/bom.js:1291 templates/js/translated/bom.js:1486
msgid "Edit BOM Item"
msgstr ""
-#: templates/js/translated/bom.js:1287
+#: templates/js/translated/bom.js:1293
msgid "Delete BOM Item"
msgstr ""
-#: templates/js/translated/bom.js:1307
+#: templates/js/translated/bom.js:1313
msgid "View BOM"
msgstr ""
-#: templates/js/translated/bom.js:1391
+#: templates/js/translated/bom.js:1397
msgid "No BOM items found"
msgstr ""
-#: templates/js/translated/bom.js:1651 templates/js/translated/build.js:2486
+#: templates/js/translated/bom.js:1657 templates/js/translated/build.js:2486
msgid "Required Part"
msgstr ""
-#: templates/js/translated/bom.js:1677
+#: templates/js/translated/bom.js:1683
msgid "Inherited from parent BOM"
msgstr ""
@@ -11449,29 +11480,29 @@ msgstr ""
msgid "Sufficient stock available"
msgstr ""
-#: templates/js/translated/build.js:2643
+#: templates/js/translated/build.js:2647
msgid "Consumable Item"
msgstr ""
-#: templates/js/translated/build.js:2648
+#: templates/js/translated/build.js:2652
msgid "Tracked item"
msgstr ""
-#: templates/js/translated/build.js:2655
+#: templates/js/translated/build.js:2659
#: templates/js/translated/sales_order.js:2016
msgid "Build stock"
msgstr ""
-#: templates/js/translated/build.js:2660 templates/js/translated/stock.js:1829
+#: templates/js/translated/build.js:2664 templates/js/translated/stock.js:1829
msgid "Order stock"
msgstr ""
-#: templates/js/translated/build.js:2664
+#: templates/js/translated/build.js:2668
#: templates/js/translated/sales_order.js:2010
msgid "Allocate stock"
msgstr ""
-#: templates/js/translated/build.js:2668
+#: templates/js/translated/build.js:2672
msgid "Remove stock allocation"
msgstr ""
@@ -12313,64 +12344,64 @@ msgstr ""
msgid "Subscribed category"
msgstr ""
-#: templates/js/translated/part.js:2855
+#: templates/js/translated/part.js:2864
msgid "No test templates matching query"
msgstr ""
-#: templates/js/translated/part.js:2877 templates/js/translated/search.js:342
+#: templates/js/translated/part.js:2886 templates/js/translated/search.js:342
msgid "results"
msgstr ""
-#: templates/js/translated/part.js:2927 templates/js/translated/stock.js:1446
+#: templates/js/translated/part.js:2936 templates/js/translated/stock.js:1446
msgid "Edit test result"
msgstr ""
-#: templates/js/translated/part.js:2928 templates/js/translated/stock.js:1447
+#: templates/js/translated/part.js:2937 templates/js/translated/stock.js:1447
#: templates/js/translated/stock.js:1692
msgid "Delete test result"
msgstr ""
-#: templates/js/translated/part.js:2932
+#: templates/js/translated/part.js:2941
msgid "This test is defined for a parent part"
msgstr ""
-#: templates/js/translated/part.js:2948
+#: templates/js/translated/part.js:2957
msgid "Edit Test Result Template"
msgstr ""
-#: templates/js/translated/part.js:2962
+#: templates/js/translated/part.js:2971
msgid "Delete Test Result Template"
msgstr ""
-#: templates/js/translated/part.js:3041 templates/js/translated/part.js:3042
+#: templates/js/translated/part.js:3050 templates/js/translated/part.js:3051
msgid "No date specified"
msgstr ""
-#: templates/js/translated/part.js:3044
+#: templates/js/translated/part.js:3053
msgid "Specified date is in the past"
msgstr ""
-#: templates/js/translated/part.js:3050
+#: templates/js/translated/part.js:3059
msgid "Speculative"
msgstr ""
-#: templates/js/translated/part.js:3100
+#: templates/js/translated/part.js:3109
msgid "No scheduling information available for this part"
msgstr ""
-#: templates/js/translated/part.js:3106
+#: templates/js/translated/part.js:3115
msgid "Error fetching scheduling information for this part"
msgstr ""
-#: templates/js/translated/part.js:3202
+#: templates/js/translated/part.js:3211
msgid "Scheduled Stock Quantities"
msgstr ""
-#: templates/js/translated/part.js:3218
+#: templates/js/translated/part.js:3227
msgid "Maximum Quantity"
msgstr ""
-#: templates/js/translated/part.js:3263
+#: templates/js/translated/part.js:3272
msgid "Minimum Stock Level"
msgstr ""
@@ -14052,4 +14083,3 @@ msgstr ""
#: users/models.py:413
msgid "Permission to delete items"
msgstr ""
-
diff --git a/InvenTree/locale/sl/LC_MESSAGES/django.po b/InvenTree/locale/sl/LC_MESSAGES/django.po
index 710a9e9ef2..bf2f3ebd2b 100644
--- a/InvenTree/locale/sl/LC_MESSAGES/django.po
+++ b/InvenTree/locale/sl/LC_MESSAGES/django.po
@@ -2,7 +2,7 @@ msgid ""
msgstr ""
"Project-Id-Version: inventree\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2024-02-28 04:05+0000\n"
+"POT-Creation-Date: 2024-03-05 00:41+0000\n"
"PO-Revision-Date: 2024-02-28 07:23\n"
"Last-Translator: \n"
"Language-Team: Slovenian\n"
@@ -66,9 +66,9 @@ msgstr "Vnesi datum"
#: report/templates/report/inventree_build_order_base.html:172
#: stock/admin.py:226 stock/models.py:2335 stock/models.py:2451
#: stock/serializers.py:479 stock/serializers.py:632 stock/serializers.py:728
-#: stock/serializers.py:778 stock/serializers.py:1081 stock/serializers.py:1170
-#: stock/serializers.py:1335 stock/templates/stock/stock_sidebar.html:25
-#: templates/js/translated/barcode.js:143 templates/js/translated/bom.js:1259
+#: stock/serializers.py:778 stock/serializers.py:1087 stock/serializers.py:1176
+#: stock/serializers.py:1341 stock/templates/stock/stock_sidebar.html:25
+#: templates/js/translated/barcode.js:143 templates/js/translated/bom.js:1265
#: templates/js/translated/company.js:1674 templates/js/translated/order.js:347
#: templates/js/translated/part.js:1080
#: templates/js/translated/purchase_order.js:2201
@@ -523,7 +523,7 @@ msgstr "Ime"
#: templates/js/translated/order.js:298 templates/js/translated/part.js:1238
#: templates/js/translated/part.js:1483 templates/js/translated/part.js:1621
#: templates/js/translated/part.js:1958 templates/js/translated/part.js:2355
-#: templates/js/translated/part.js:2785 templates/js/translated/part.js:2887
+#: templates/js/translated/part.js:2785 templates/js/translated/part.js:2896
#: templates/js/translated/plugin.js:80
#: templates/js/translated/purchase_order.js:1707
#: templates/js/translated/purchase_order.js:1850
@@ -678,7 +678,7 @@ msgstr "Povezava do oddaljene slike"
msgid "Downloading images from remote URL is not enabled"
msgstr "Prenos slik iz oddaljene povezave ni omogočen"
-#: InvenTree/status.py:66 part/serializers.py:1120
+#: InvenTree/status.py:66 part/serializers.py:1138
msgid "Background worker check failed"
msgstr "Nadzor dela v ozadju neuspel"
@@ -960,7 +960,7 @@ msgid "Tracked"
msgstr ""
#: build/api.py:285 part/admin.py:144 templates/js/translated/build.js:1741
-#: templates/js/translated/build.js:2626
+#: templates/js/translated/build.js:2630
#: templates/js/translated/sales_order.js:1929
#: templates/js/translated/table_filters.js:571
msgid "Allocated"
@@ -1044,11 +1044,11 @@ msgstr "Nalog izgradnje na katerega se ta izgradnaj nanaša"
#: build/models.py:199 build/templates/build/build_base.html:97
#: build/templates/build/detail.html:29 company/models.py:1044
#: order/models.py:1389 order/models.py:1532 order/models.py:1533
-#: part/api.py:1528 part/models.py:389 part/models.py:3003 part/models.py:3147
-#: part/models.py:3291 part/models.py:3314 part/models.py:3335
-#: part/models.py:3357 part/models.py:3458 part/models.py:3754
-#: part/models.py:3885 part/models.py:3978 part/models.py:4339
-#: part/serializers.py:1066 part/serializers.py:1631
+#: part/api.py:1528 part/api.py:1820 part/models.py:389 part/models.py:3003
+#: part/models.py:3147 part/models.py:3291 part/models.py:3314
+#: part/models.py:3335 part/models.py:3357 part/models.py:3458
+#: part/models.py:3754 part/models.py:3885 part/models.py:3978
+#: part/models.py:4339 part/serializers.py:1084 part/serializers.py:1659
#: part/templates/part/part_app_base.html:8
#: part/templates/part/part_pricing.html:12
#: part/templates/part/upload_bom.html:52
@@ -1147,7 +1147,7 @@ msgid "Build status code"
msgstr "Koda statusa izgradnje"
#: build/models.py:264 build/serializers.py:280 order/serializers.py:549
-#: stock/models.py:826 stock/serializers.py:1300
+#: stock/models.py:826 stock/serializers.py:1306
#: templates/js/translated/purchase_order.js:1129
msgid "Batch Code"
msgstr "Številka serije"
@@ -1242,48 +1242,48 @@ msgstr ""
msgid "Project code for this build order"
msgstr ""
-#: build/models.py:559
+#: build/models.py:575
#, python-brace-format
msgid "Build order {build} has been completed"
msgstr "Nalog izgradnje {build} je dokončan"
-#: build/models.py:565
+#: build/models.py:581
msgid "A build order has been completed"
msgstr "Nalog izgradnej dokončan"
-#: build/models.py:783 build/models.py:858
+#: build/models.py:799 build/models.py:874
msgid "No build output specified"
msgstr "Ni določena izgradnja"
-#: build/models.py:786
+#: build/models.py:802
msgid "Build output is already completed"
msgstr "Igradnja je že dokončana"
-#: build/models.py:789
+#: build/models.py:805
msgid "Build output does not match Build Order"
msgstr "Izgradnja se ne ujema s nalogom izdelave"
-#: build/models.py:862 build/serializers.py:223 build/serializers.py:262
+#: build/models.py:878 build/serializers.py:223 build/serializers.py:262
#: build/serializers.py:831 order/models.py:526 order/serializers.py:401
-#: order/serializers.py:544 part/serializers.py:1423 part/serializers.py:1789
+#: order/serializers.py:544 part/serializers.py:1442 part/serializers.py:1817
#: stock/models.py:665 stock/models.py:1477 stock/serializers.py:450
msgid "Quantity must be greater than zero"
msgstr ""
-#: build/models.py:867 build/serializers.py:228
+#: build/models.py:883 build/serializers.py:228
msgid "Quantity cannot be greater than the output quantity"
msgstr ""
-#: build/models.py:924 build/serializers.py:533
+#: build/models.py:940 build/serializers.py:533
#, python-brace-format
msgid "Build output {serial} has not passed all required tests"
msgstr ""
-#: build/models.py:1286
+#: build/models.py:1302
msgid "Build object"
msgstr ""
-#: build/models.py:1300 build/models.py:1558 build/serializers.py:210
+#: build/models.py:1316 build/models.py:1574 build/serializers.py:210
#: build/serializers.py:247 build/templates/build/build_base.html:102
#: build/templates/build/detail.html:34 common/models.py:2432
#: order/models.py:1247 order/models.py:1902 order/serializers.py:1306
@@ -1310,7 +1310,7 @@ msgstr ""
#: templates/js/translated/company.js:1808
#: templates/js/translated/model_renderers.js:230
#: templates/js/translated/order.js:304 templates/js/translated/part.js:961
-#: templates/js/translated/part.js:1811 templates/js/translated/part.js:3332
+#: templates/js/translated/part.js:1811 templates/js/translated/part.js:3341
#: templates/js/translated/pricing.js:381
#: templates/js/translated/pricing.js:474
#: templates/js/translated/pricing.js:522
@@ -1330,38 +1330,38 @@ msgstr ""
msgid "Quantity"
msgstr "Količina"
-#: build/models.py:1301
+#: build/models.py:1317
msgid "Required quantity for build order"
msgstr ""
-#: build/models.py:1381
+#: build/models.py:1397
msgid "Build item must specify a build output, as master part is marked as trackable"
msgstr "Izdelana postavka mora imeti izgradnjo, če je glavni del označen kot sledljiv"
-#: build/models.py:1390
+#: build/models.py:1406
#, python-brace-format
msgid "Allocated quantity ({q}) must not exceed available stock quantity ({a})"
msgstr "Prestavljena zaloga ({q}) ne sme presegati zaloge ({a})"
-#: build/models.py:1400 order/models.py:1853
+#: build/models.py:1416 order/models.py:1853
msgid "Stock item is over-allocated"
msgstr "Preveč zaloge je prestavljene"
-#: build/models.py:1406 order/models.py:1856
+#: build/models.py:1422 order/models.py:1856
msgid "Allocation quantity must be greater than zero"
msgstr "Prestavljena količina mora biti večja od 0"
-#: build/models.py:1412
+#: build/models.py:1428
msgid "Quantity must be 1 for serialized stock"
msgstr "Količina za zalogo s serijsko številko mora biti 1"
-#: build/models.py:1473
+#: build/models.py:1489
msgid "Selected stock item does not match BOM line"
msgstr ""
-#: build/models.py:1545 build/serializers.py:811 order/serializers.py:1150
-#: order/serializers.py:1171 stock/serializers.py:544 stock/serializers.py:1019
-#: stock/serializers.py:1131 stock/templates/stock/item_base.html:10
+#: build/models.py:1561 build/serializers.py:811 order/serializers.py:1150
+#: order/serializers.py:1171 stock/serializers.py:544 stock/serializers.py:1025
+#: stock/serializers.py:1137 stock/templates/stock/item_base.html:10
#: stock/templates/stock/item_base.html:23
#: stock/templates/stock/item_base.html:194
#: templates/js/translated/build.js:1742
@@ -1376,19 +1376,19 @@ msgstr ""
msgid "Stock Item"
msgstr "Postavka zaloge"
-#: build/models.py:1546
+#: build/models.py:1562
msgid "Source stock item"
msgstr "Izvorna postavka zaloge"
-#: build/models.py:1559
+#: build/models.py:1575
msgid "Stock quantity to allocate to build"
msgstr "Količina zaloge za prestavljanje za izgradnjo"
-#: build/models.py:1567
+#: build/models.py:1583
msgid "Install into"
msgstr "Inštaliraj v"
-#: build/models.py:1568
+#: build/models.py:1584
msgid "Destination stock item"
msgstr "Destinacija postavke zaloge"
@@ -1452,9 +1452,9 @@ msgid "A list of build outputs must be provided"
msgstr ""
#: build/serializers.py:426 build/serializers.py:498 order/serializers.py:533
-#: order/serializers.py:641 order/serializers.py:1646 part/serializers.py:1086
+#: order/serializers.py:641 order/serializers.py:1646 part/serializers.py:1104
#: stock/serializers.py:472 stock/serializers.py:627 stock/serializers.py:723
-#: stock/serializers.py:1163 stock/serializers.py:1419
+#: stock/serializers.py:1169 stock/serializers.py:1425
#: stock/templates/stock/item_base.html:394
#: templates/js/translated/barcode.js:547
#: templates/js/translated/barcode.js:795 templates/js/translated/build.js:999
@@ -1494,7 +1494,7 @@ msgstr ""
#: build/serializers.py:505 build/templates/build/build_base.html:151
#: build/templates/build/detail.html:62 order/models.py:910
#: order/models.py:2005 order/serializers.py:565 stock/admin.py:165
-#: stock/serializers.py:774 stock/serializers.py:1307
+#: stock/serializers.py:774 stock/serializers.py:1313
#: stock/templates/stock/item_base.html:427
#: templates/js/translated/barcode.js:252 templates/js/translated/build.js:2189
#: templates/js/translated/purchase_order.js:1308
@@ -1602,7 +1602,7 @@ msgstr ""
msgid "bom_item.part must point to the same part as the build order"
msgstr ""
-#: build/serializers.py:817 stock/serializers.py:1032
+#: build/serializers.py:817 stock/serializers.py:1038
msgid "Item must be in stock"
msgstr ""
@@ -1659,44 +1659,45 @@ msgstr ""
msgid "Allocate optional BOM items to build order"
msgstr ""
-#: build/serializers.py:1096 part/models.py:3895 part/models.py:4331
+#: build/serializers.py:1097 part/models.py:3895 part/models.py:4331
#: stock/api.py:745
msgid "BOM Item"
msgstr ""
-#: build/serializers.py:1105 templates/js/translated/index.js:130
+#: build/serializers.py:1106 templates/js/translated/index.js:130
msgid "Allocated Stock"
msgstr ""
-#: build/serializers.py:1110 part/admin.py:132 part/bom.py:173
-#: part/serializers.py:1441 part/templates/part/part_base.html:210
-#: templates/js/translated/bom.js:1202 templates/js/translated/build.js:2614
-#: templates/js/translated/part.js:709 templates/js/translated/part.js:2148
+#: build/serializers.py:1111 part/admin.py:132 part/bom.py:173
+#: part/serializers.py:798 part/serializers.py:1460
+#: part/templates/part/part_base.html:210 templates/js/translated/bom.js:1208
+#: templates/js/translated/build.js:2614 templates/js/translated/part.js:709
+#: templates/js/translated/part.js:2148
#: templates/js/translated/table_filters.js:170
msgid "On Order"
msgstr ""
-#: build/serializers.py:1115 part/serializers.py:1443
+#: build/serializers.py:1116 part/serializers.py:1462
#: templates/js/translated/build.js:2618
#: templates/js/translated/table_filters.js:360
msgid "In Production"
msgstr ""
-#: build/serializers.py:1120 part/bom.py:172 part/serializers.py:1454
+#: build/serializers.py:1121 part/bom.py:172 part/serializers.py:1473
#: part/templates/part/part_base.html:192
#: templates/js/translated/sales_order.js:1893
msgid "Available Stock"
msgstr ""
-#: build/tasks.py:149
+#: build/tasks.py:171
msgid "Stock required for build order"
msgstr ""
-#: build/tasks.py:166
+#: build/tasks.py:188
msgid "Overdue Build Order"
msgstr ""
-#: build/tasks.py:171
+#: build/tasks.py:193
#, python-brace-format
msgid "Build order {bo} is now overdue"
msgstr ""
@@ -1990,27 +1991,31 @@ msgstr ""
msgid "Order Parts"
msgstr ""
-#: build/templates/build/detail.html:210
-msgid "Incomplete Build Outputs"
-msgstr ""
-
-#: build/templates/build/detail.html:214
-msgid "Create new build output"
+#: build/templates/build/detail.html:205
+msgid "Available stock has been filtered based on specified source location for this build order"
msgstr ""
#: build/templates/build/detail.html:215
+msgid "Incomplete Build Outputs"
+msgstr ""
+
+#: build/templates/build/detail.html:219
+msgid "Create new build output"
+msgstr ""
+
+#: build/templates/build/detail.html:220
msgid "New Build Output"
msgstr ""
-#: build/templates/build/detail.html:232 build/templates/build/sidebar.html:15
+#: build/templates/build/detail.html:237 build/templates/build/sidebar.html:15
msgid "Consumed Stock"
msgstr ""
-#: build/templates/build/detail.html:244
+#: build/templates/build/detail.html:249
msgid "Completed Build Outputs"
msgstr ""
-#: build/templates/build/detail.html:256 build/templates/build/sidebar.html:19
+#: build/templates/build/detail.html:261 build/templates/build/sidebar.html:19
#: company/templates/company/detail.html:229
#: company/templates/company/manufacturer_part.html:141
#: company/templates/company/manufacturer_part_sidebar.html:9
@@ -2026,15 +2031,15 @@ msgstr ""
msgid "Attachments"
msgstr ""
-#: build/templates/build/detail.html:271
+#: build/templates/build/detail.html:276
msgid "Build Notes"
msgstr ""
-#: build/templates/build/detail.html:426
+#: build/templates/build/detail.html:434
msgid "Allocation Complete"
msgstr ""
-#: build/templates/build/detail.html:427
+#: build/templates/build/detail.html:435
msgid "All lines have been fully allocated"
msgstr ""
@@ -2436,7 +2441,7 @@ msgid "Parts are templates by default"
msgstr ""
#: common/models.py:1456 part/admin.py:91 part/admin.py:431 part/models.py:1015
-#: templates/js/translated/bom.js:1633
+#: templates/js/translated/bom.js:1639
#: templates/js/translated/table_filters.js:330
#: templates/js/translated/table_filters.js:721
msgid "Assembly"
@@ -3495,7 +3500,7 @@ msgstr ""
msgid "Price break quantity"
msgstr ""
-#: common/models.py:2440 company/serializers.py:484 order/admin.py:42
+#: common/models.py:2440 company/serializers.py:486 order/admin.py:42
#: order/models.py:1321 order/models.py:2226
#: templates/js/translated/company.js:1813 templates/js/translated/part.js:1885
#: templates/js/translated/pricing.js:621
@@ -3972,7 +3977,7 @@ msgstr ""
#: company/models.py:495 company/templates/company/company_base.html:76
#: company/templates/company/manufacturer_part.html:90
-#: company/templates/company/supplier_part.html:145 part/serializers.py:497
+#: company/templates/company/supplier_part.html:145 part/serializers.py:505
#: stock/templates/stock/item_base.html:207
#: templates/js/translated/company.js:506
#: templates/js/translated/company.js:1108
@@ -3987,7 +3992,7 @@ msgid "Select manufacturer"
msgstr ""
#: company/models.py:502 company/templates/company/manufacturer_part.html:101
-#: company/templates/company/supplier_part.html:153 part/serializers.py:507
+#: company/templates/company/supplier_part.html:153 part/serializers.py:515
#: templates/js/translated/company.js:351
#: templates/js/translated/company.js:1107
#: templates/js/translated/company.js:1302
@@ -4059,7 +4064,7 @@ msgstr ""
#: company/models.py:795 company/templates/company/company_base.html:81
#: company/templates/company/supplier_part.html:129 order/models.py:453
#: order/templates/order/order_base.html:136 part/bom.py:272 part/bom.py:310
-#: part/serializers.py:481 plugin/builtin/suppliers/digikey.py:25
+#: part/serializers.py:489 plugin/builtin/suppliers/digikey.py:25
#: plugin/builtin/suppliers/lcsc.py:26 plugin/builtin/suppliers/mouser.py:24
#: plugin/builtin/suppliers/tme.py:26 stock/templates/stock/item_base.html:224
#: templates/email/overdue_purchase_order.html:16
@@ -4076,7 +4081,7 @@ msgstr ""
msgid "Select supplier"
msgstr ""
-#: company/models.py:802 part/serializers.py:492
+#: company/models.py:802 part/serializers.py:500
msgid "Supplier stock keeping unit"
msgstr ""
@@ -4112,7 +4117,7 @@ msgid "Minimum charge (e.g. stocking fee)"
msgstr ""
#: company/models.py:851 company/templates/company/supplier_part.html:160
-#: stock/admin.py:224 stock/models.py:785 stock/serializers.py:1317
+#: stock/admin.py:224 stock/models.py:785 stock/serializers.py:1323
#: stock/templates/stock/item_base.html:240
#: templates/js/translated/company.js:1636
#: templates/js/translated/stock.js:2387
@@ -4157,7 +4162,7 @@ msgstr ""
msgid "Date of last update of availability data"
msgstr ""
-#: company/serializers.py:153
+#: company/serializers.py:155
msgid "Default currency used for this supplier"
msgstr ""
@@ -4218,7 +4223,7 @@ msgstr ""
#: company/templates/company/company_base.html:86 order/models.py:898
#: order/models.py:1993 order/templates/order/return_order_base.html:131
#: order/templates/order/sales_order_base.html:144 stock/models.py:807
-#: stock/models.py:808 stock/serializers.py:1067
+#: stock/models.py:808 stock/serializers.py:1073
#: stock/templates/stock/item_base.html:405
#: templates/email/overdue_sales_order.html:16
#: templates/js/translated/company.js:502
@@ -4429,8 +4434,9 @@ msgstr ""
#: company/templates/company/manufacturer_part.html:119
#: company/templates/company/supplier_part.html:15 company/views.py:31
-#: part/admin.py:122 part/templates/part/part_sidebar.html:33
-#: templates/InvenTree/search.html:190 templates/navbar.html:48
+#: part/admin.py:122 part/serializers.py:802
+#: part/templates/part/part_sidebar.html:33 templates/InvenTree/search.html:190
+#: templates/navbar.html:48
msgid "Suppliers"
msgstr ""
@@ -4528,7 +4534,7 @@ msgid "No supplier information available"
msgstr ""
#: company/templates/company/supplier_part.html:139 part/bom.py:279
-#: part/bom.py:311 part/serializers.py:491
+#: part/bom.py:311 part/serializers.py:499
#: templates/js/translated/company.js:349 templates/js/translated/part.js:1786
#: templates/js/translated/pricing.js:510
#: templates/js/translated/purchase_order.js:1851
@@ -4577,10 +4583,12 @@ msgstr ""
msgid "Update Part Availability"
msgstr ""
-#: company/templates/company/supplier_part_sidebar.html:5 part/stocktake.py:223
+#: company/templates/company/supplier_part_sidebar.html:5
+#: part/serializers.py:801 part/stocktake.py:223
#: part/templates/part/category.html:183
#: part/templates/part/category_sidebar.html:17 stock/admin.py:69
-#: stock/serializers.py:760 stock/templates/stock/location.html:170
+#: stock/serializers.py:760 stock/serializers.py:924
+#: stock/templates/stock/location.html:170
#: stock/templates/stock/location.html:184
#: stock/templates/stock/location.html:196
#: stock/templates/stock/location_sidebar.html:7
@@ -4640,7 +4648,7 @@ msgid "Label template file"
msgstr ""
#: label/models.py:143 part/models.py:3484 report/models.py:322
-#: templates/js/translated/part.js:2891
+#: templates/js/translated/part.js:2900
#: templates/js/translated/table_filters.js:481
msgid "Enabled"
msgstr ""
@@ -5733,7 +5741,7 @@ msgid "Pending Shipments"
msgstr ""
#: order/templates/order/sales_order_detail.html:71
-#: templates/js/translated/bom.js:1271 templates/js/translated/filters.js:296
+#: templates/js/translated/bom.js:1277 templates/js/translated/filters.js:296
msgid "Actions"
msgstr ""
@@ -5861,10 +5869,10 @@ msgstr ""
msgid "Category Path"
msgstr ""
-#: part/admin.py:323 part/models.py:390 part/serializers.py:259
-#: part/serializers.py:373 part/templates/part/cat_link.html:3
-#: part/templates/part/category.html:23 part/templates/part/category.html:141
-#: part/templates/part/category.html:161
+#: part/admin.py:323 part/models.py:390 part/serializers.py:112
+#: part/serializers.py:265 part/serializers.py:381
+#: part/templates/part/cat_link.html:3 part/templates/part/category.html:23
+#: part/templates/part/category.html:141 part/templates/part/category.html:161
#: part/templates/part/category_sidebar.html:9
#: templates/InvenTree/index.html:36 templates/InvenTree/search.html:84
#: templates/InvenTree/settings/sidebar.html:47
@@ -5889,13 +5897,13 @@ msgstr ""
msgid "Part IPN"
msgstr ""
-#: part/admin.py:421 part/serializers.py:1220
+#: part/admin.py:421 part/serializers.py:1238
#: templates/js/translated/pricing.js:358
#: templates/js/translated/pricing.js:1024
msgid "Minimum Price"
msgstr ""
-#: part/admin.py:426 part/serializers.py:1235
+#: part/admin.py:426 part/serializers.py:1253
#: templates/js/translated/pricing.js:353
#: templates/js/translated/pricing.js:1032
msgid "Maximum Price"
@@ -5974,7 +5982,7 @@ msgid "This option must be selected"
msgstr ""
#: part/api.py:1541 part/models.py:895 part/models.py:3385 part/models.py:3831
-#: part/serializers.py:388 part/serializers.py:1076
+#: part/serializers.py:396 part/serializers.py:1094
#: part/templates/part/part_base.html:260 stock/api.py:733
#: templates/InvenTree/settings/settings_staff_js.html:300
#: templates/js/translated/notification.js:60
@@ -5982,12 +5990,17 @@ msgstr ""
msgid "Category"
msgstr ""
+#: part/api.py:1828
+msgid "Uses"
+msgstr ""
+
#: part/bom.py:170 part/models.py:100 part/models.py:938
#: part/templates/part/category.html:116 part/templates/part/part_base.html:367
msgid "Default Location"
msgstr ""
-#: part/bom.py:171 templates/email/low_stock_notification.html:16
+#: part/bom.py:171 part/serializers.py:803
+#: templates/email/low_stock_notification.html:16
msgid "Total Stock"
msgstr ""
@@ -6010,7 +6023,8 @@ msgstr ""
msgid "Default location for parts in this category"
msgstr ""
-#: part/models.py:106 stock/models.py:165 templates/js/translated/stock.js:2736
+#: part/models.py:106 stock/models.py:165 templates/js/translated/part.js:2810
+#: templates/js/translated/stock.js:2736
#: templates/js/translated/table_filters.js:239
#: templates/js/translated/table_filters.js:283
msgid "Structural"
@@ -6418,7 +6432,7 @@ msgstr ""
msgid "Test with this name already exists for this part"
msgstr ""
-#: part/models.py:3464 templates/js/translated/part.js:2870
+#: part/models.py:3464 templates/js/translated/part.js:2879
msgid "Test Name"
msgstr ""
@@ -6446,7 +6460,7 @@ msgstr ""
msgid "Is this test enabled?"
msgstr ""
-#: part/models.py:3489 templates/js/translated/part.js:2899
+#: part/models.py:3489 templates/js/translated/part.js:2908
#: templates/js/translated/table_filters.js:477
msgid "Required"
msgstr ""
@@ -6455,7 +6469,7 @@ msgstr ""
msgid "Is this test required to pass?"
msgstr ""
-#: part/models.py:3495 templates/js/translated/part.js:2907
+#: part/models.py:3495 templates/js/translated/part.js:2916
msgid "Requires Value"
msgstr ""
@@ -6463,7 +6477,7 @@ msgstr ""
msgid "Does this test require a value when adding a test result?"
msgstr ""
-#: part/models.py:3501 templates/js/translated/part.js:2914
+#: part/models.py:3501 templates/js/translated/part.js:2923
msgid "Requires Attachment"
msgstr ""
@@ -6685,311 +6699,325 @@ msgstr ""
msgid "Duplicate relationship already exists"
msgstr ""
-#: part/serializers.py:128 part/templates/part/category.html:122
-#: part/templates/part/category.html:207
+#: part/serializers.py:114 part/serializers.py:134
+#: part/templates/part/category.html:122 part/templates/part/category.html:207
#: part/templates/part/category_sidebar.html:7
msgid "Subcategories"
msgstr ""
-#: part/serializers.py:172
+#: part/serializers.py:178
msgid "Results"
msgstr ""
-#: part/serializers.py:173
+#: part/serializers.py:179
msgid "Number of results recorded against this template"
msgstr ""
-#: part/serializers.py:197 part/serializers.py:215 stock/serializers.py:384
+#: part/serializers.py:203 part/serializers.py:221 stock/serializers.py:384
msgid "Purchase currency of this stock item"
msgstr ""
-#: part/serializers.py:260
+#: part/serializers.py:266
msgid "Number of parts using this template"
msgstr ""
-#: part/serializers.py:379
+#: part/serializers.py:387
msgid "No parts selected"
msgstr ""
-#: part/serializers.py:389
+#: part/serializers.py:397
msgid "Select category"
msgstr ""
-#: part/serializers.py:419
+#: part/serializers.py:427
msgid "Original Part"
msgstr ""
-#: part/serializers.py:420
+#: part/serializers.py:428
msgid "Select original part to duplicate"
msgstr ""
-#: part/serializers.py:425
+#: part/serializers.py:433
msgid "Copy Image"
msgstr ""
-#: part/serializers.py:426
+#: part/serializers.py:434
msgid "Copy image from original part"
msgstr ""
-#: part/serializers.py:432 part/templates/part/detail.html:277
+#: part/serializers.py:440 part/templates/part/detail.html:277
msgid "Copy BOM"
msgstr ""
-#: part/serializers.py:433
+#: part/serializers.py:441
msgid "Copy bill of materials from original part"
msgstr ""
-#: part/serializers.py:439
+#: part/serializers.py:447
msgid "Copy Parameters"
msgstr ""
-#: part/serializers.py:440
+#: part/serializers.py:448
msgid "Copy parameter data from original part"
msgstr ""
-#: part/serializers.py:446
+#: part/serializers.py:454
msgid "Copy Notes"
msgstr ""
-#: part/serializers.py:447
+#: part/serializers.py:455
msgid "Copy notes from original part"
msgstr ""
-#: part/serializers.py:460
+#: part/serializers.py:468
msgid "Initial Stock Quantity"
msgstr ""
-#: part/serializers.py:462
+#: part/serializers.py:470
msgid "Specify initial stock quantity for this Part. If quantity is zero, no stock is added."
msgstr ""
-#: part/serializers.py:469
+#: part/serializers.py:477
msgid "Initial Stock Location"
msgstr ""
-#: part/serializers.py:470
+#: part/serializers.py:478
msgid "Specify initial stock location for this Part"
msgstr ""
-#: part/serializers.py:482
+#: part/serializers.py:490
msgid "Select supplier (or leave blank to skip)"
msgstr ""
-#: part/serializers.py:498
+#: part/serializers.py:506
msgid "Select manufacturer (or leave blank to skip)"
msgstr ""
-#: part/serializers.py:508
+#: part/serializers.py:516
msgid "Manufacturer part number"
msgstr ""
-#: part/serializers.py:515
+#: part/serializers.py:523
msgid "Selected company is not a valid supplier"
msgstr ""
-#: part/serializers.py:524
+#: part/serializers.py:532
msgid "Selected company is not a valid manufacturer"
msgstr ""
-#: part/serializers.py:535
+#: part/serializers.py:543
msgid "Manufacturer part matching this MPN already exists"
msgstr ""
-#: part/serializers.py:542
+#: part/serializers.py:550
msgid "Supplier part matching this SKU already exists"
msgstr ""
-#: part/serializers.py:815 part/templates/part/copy_part.html:9
+#: part/serializers.py:804
+#, fuzzy
+#| msgid "External Link"
+msgid "External Stock"
+msgstr "Zunanja povezava"
+
+#: part/serializers.py:806
+msgid "Unallocated Stock"
+msgstr ""
+
+#: part/serializers.py:808
+msgid "Variant Stock"
+msgstr ""
+
+#: part/serializers.py:833 part/templates/part/copy_part.html:9
#: templates/js/translated/part.js:471
msgid "Duplicate Part"
msgstr ""
-#: part/serializers.py:816
+#: part/serializers.py:834
msgid "Copy initial data from another Part"
msgstr ""
-#: part/serializers.py:822 templates/js/translated/part.js:102
+#: part/serializers.py:840 templates/js/translated/part.js:102
msgid "Initial Stock"
msgstr ""
-#: part/serializers.py:823
+#: part/serializers.py:841
msgid "Create Part with initial stock quantity"
msgstr ""
-#: part/serializers.py:829
+#: part/serializers.py:847
msgid "Supplier Information"
msgstr ""
-#: part/serializers.py:830
+#: part/serializers.py:848
msgid "Add initial supplier information for this part"
msgstr ""
-#: part/serializers.py:838
+#: part/serializers.py:856
msgid "Copy Category Parameters"
msgstr ""
-#: part/serializers.py:839
+#: part/serializers.py:857
msgid "Copy parameter templates from selected part category"
msgstr ""
-#: part/serializers.py:844
+#: part/serializers.py:862
msgid "Existing Image"
msgstr ""
-#: part/serializers.py:845
+#: part/serializers.py:863
msgid "Filename of an existing part image"
msgstr ""
-#: part/serializers.py:862
+#: part/serializers.py:880
msgid "Image file does not exist"
msgstr ""
-#: part/serializers.py:1068
+#: part/serializers.py:1086
msgid "Limit stocktake report to a particular part, and any variant parts"
msgstr ""
-#: part/serializers.py:1078
+#: part/serializers.py:1096
msgid "Limit stocktake report to a particular part category, and any child categories"
msgstr ""
-#: part/serializers.py:1088
+#: part/serializers.py:1106
msgid "Limit stocktake report to a particular stock location, and any child locations"
msgstr ""
-#: part/serializers.py:1094
+#: part/serializers.py:1112
msgid "Exclude External Stock"
msgstr ""
-#: part/serializers.py:1095
+#: part/serializers.py:1113
msgid "Exclude stock items in external locations"
msgstr ""
-#: part/serializers.py:1100
+#: part/serializers.py:1118
msgid "Generate Report"
msgstr ""
-#: part/serializers.py:1101
+#: part/serializers.py:1119
msgid "Generate report file containing calculated stocktake data"
msgstr ""
-#: part/serializers.py:1106
+#: part/serializers.py:1124
msgid "Update Parts"
msgstr ""
-#: part/serializers.py:1107
+#: part/serializers.py:1125
msgid "Update specified parts with calculated stocktake data"
msgstr ""
-#: part/serializers.py:1115
+#: part/serializers.py:1133
msgid "Stocktake functionality is not enabled"
msgstr ""
-#: part/serializers.py:1221
+#: part/serializers.py:1239
msgid "Override calculated value for minimum price"
msgstr ""
-#: part/serializers.py:1228
+#: part/serializers.py:1246
msgid "Minimum price currency"
msgstr ""
-#: part/serializers.py:1236
+#: part/serializers.py:1254
msgid "Override calculated value for maximum price"
msgstr ""
-#: part/serializers.py:1243
+#: part/serializers.py:1261
msgid "Maximum price currency"
msgstr ""
-#: part/serializers.py:1272
+#: part/serializers.py:1290
msgid "Update"
msgstr ""
-#: part/serializers.py:1273
+#: part/serializers.py:1291
msgid "Update pricing for this part"
msgstr ""
-#: part/serializers.py:1296
+#: part/serializers.py:1314
#, python-brace-format
msgid "Could not convert from provided currencies to {default_currency}"
msgstr ""
-#: part/serializers.py:1303
+#: part/serializers.py:1321
msgid "Minimum price must not be greater than maximum price"
msgstr ""
-#: part/serializers.py:1306
+#: part/serializers.py:1324
msgid "Maximum price must not be less than minimum price"
msgstr ""
-#: part/serializers.py:1632
+#: part/serializers.py:1660
msgid "Select part to copy BOM from"
msgstr ""
-#: part/serializers.py:1640
+#: part/serializers.py:1668
msgid "Remove Existing Data"
msgstr ""
-#: part/serializers.py:1641
+#: part/serializers.py:1669
msgid "Remove existing BOM items before copying"
msgstr ""
-#: part/serializers.py:1646
+#: part/serializers.py:1674
msgid "Include Inherited"
msgstr ""
-#: part/serializers.py:1647
+#: part/serializers.py:1675
msgid "Include BOM items which are inherited from templated parts"
msgstr ""
-#: part/serializers.py:1652
+#: part/serializers.py:1680
msgid "Skip Invalid Rows"
msgstr ""
-#: part/serializers.py:1653
+#: part/serializers.py:1681
msgid "Enable this option to skip invalid rows"
msgstr ""
-#: part/serializers.py:1658
+#: part/serializers.py:1686
msgid "Copy Substitute Parts"
msgstr ""
-#: part/serializers.py:1659
+#: part/serializers.py:1687
msgid "Copy substitute parts when duplicate BOM items"
msgstr ""
-#: part/serializers.py:1693
+#: part/serializers.py:1721
msgid "Clear Existing BOM"
msgstr ""
-#: part/serializers.py:1694
+#: part/serializers.py:1722
msgid "Delete existing BOM items before uploading"
msgstr ""
-#: part/serializers.py:1724
+#: part/serializers.py:1752
msgid "No part column specified"
msgstr ""
-#: part/serializers.py:1768
+#: part/serializers.py:1796
msgid "Multiple matching parts found"
msgstr ""
-#: part/serializers.py:1771
+#: part/serializers.py:1799
msgid "No matching part found"
msgstr ""
-#: part/serializers.py:1774
+#: part/serializers.py:1802
msgid "Part is not designated as a component"
msgstr ""
-#: part/serializers.py:1783
+#: part/serializers.py:1811
msgid "Quantity not provided"
msgstr ""
-#: part/serializers.py:1791
+#: part/serializers.py:1819
msgid "Invalid quantity"
msgstr ""
-#: part/serializers.py:1812
+#: part/serializers.py:1840
msgid "At least one BOM item is required"
msgstr ""
@@ -7221,7 +7249,7 @@ msgid "Validate BOM"
msgstr ""
#: part/templates/part/detail.html:283 part/templates/part/detail.html:284
-#: templates/js/translated/bom.js:1314 templates/js/translated/bom.js:1315
+#: templates/js/translated/bom.js:1320 templates/js/translated/bom.js:1321
msgid "Add BOM Item"
msgstr ""
@@ -7405,7 +7433,7 @@ msgstr ""
msgid "Allocated to Sales Orders"
msgstr ""
-#: part/templates/part/part_base.html:235 templates/js/translated/bom.js:1213
+#: part/templates/part/part_base.html:235 templates/js/translated/bom.js:1219
msgid "Can Build"
msgstr ""
@@ -8784,7 +8812,7 @@ msgstr ""
msgid "Where is this stock item located?"
msgstr ""
-#: stock/models.py:786 stock/serializers.py:1318
+#: stock/models.py:786 stock/serializers.py:1324
msgid "Packaging this stock item is stored in"
msgstr ""
@@ -8796,7 +8824,7 @@ msgstr ""
msgid "Serial number for this item"
msgstr ""
-#: stock/models.py:830 stock/serializers.py:1301
+#: stock/models.py:830 stock/serializers.py:1307
msgid "Batch code for this stock item"
msgstr ""
@@ -8905,7 +8933,7 @@ msgstr ""
msgid "Serialized stock cannot be merged"
msgstr ""
-#: stock/models.py:1639 stock/serializers.py:1207
+#: stock/models.py:1639 stock/serializers.py:1213
msgid "Duplicate stock items"
msgstr ""
@@ -8986,7 +9014,7 @@ msgstr ""
msgid "Enter serial numbers for new items"
msgstr ""
-#: stock/serializers.py:473 stock/serializers.py:1164 stock/serializers.py:1420
+#: stock/serializers.py:473 stock/serializers.py:1170 stock/serializers.py:1426
msgid "Destination stock location"
msgstr ""
@@ -9059,77 +9087,78 @@ msgstr ""
msgid "No stock items selected"
msgstr ""
-#: stock/serializers.py:863 stock/templates/stock/location.html:165
+#: stock/serializers.py:863 stock/serializers.py:926
+#: stock/templates/stock/location.html:165
#: stock/templates/stock/location.html:213
#: stock/templates/stock/location_sidebar.html:5
msgid "Sublocations"
msgstr ""
-#: stock/serializers.py:1036
+#: stock/serializers.py:1042
msgid "Part must be salable"
msgstr ""
-#: stock/serializers.py:1040
+#: stock/serializers.py:1046
msgid "Item is allocated to a sales order"
msgstr ""
-#: stock/serializers.py:1044
+#: stock/serializers.py:1050
msgid "Item is allocated to a build order"
msgstr ""
-#: stock/serializers.py:1068
+#: stock/serializers.py:1074
msgid "Customer to assign stock items"
msgstr ""
-#: stock/serializers.py:1074
+#: stock/serializers.py:1080
msgid "Selected company is not a customer"
msgstr ""
-#: stock/serializers.py:1082
+#: stock/serializers.py:1088
msgid "Stock assignment notes"
msgstr ""
-#: stock/serializers.py:1092 stock/serializers.py:1346
+#: stock/serializers.py:1098 stock/serializers.py:1352
msgid "A list of stock items must be provided"
msgstr ""
-#: stock/serializers.py:1171
+#: stock/serializers.py:1177
msgid "Stock merging notes"
msgstr ""
-#: stock/serializers.py:1176
+#: stock/serializers.py:1182
msgid "Allow mismatched suppliers"
msgstr ""
-#: stock/serializers.py:1177
+#: stock/serializers.py:1183
msgid "Allow stock items with different supplier parts to be merged"
msgstr ""
-#: stock/serializers.py:1182
+#: stock/serializers.py:1188
msgid "Allow mismatched status"
msgstr ""
-#: stock/serializers.py:1183
+#: stock/serializers.py:1189
msgid "Allow stock items with different status codes to be merged"
msgstr ""
-#: stock/serializers.py:1193
+#: stock/serializers.py:1199
msgid "At least two stock items must be provided"
msgstr ""
-#: stock/serializers.py:1260
+#: stock/serializers.py:1266
msgid "No Change"
msgstr ""
-#: stock/serializers.py:1289
+#: stock/serializers.py:1295
msgid "StockItem primary key value"
msgstr ""
-#: stock/serializers.py:1308
+#: stock/serializers.py:1314
msgid "Stock item status code"
msgstr ""
-#: stock/serializers.py:1336
+#: stock/serializers.py:1342
msgid "Stock transaction notes"
msgstr ""
@@ -10662,7 +10691,7 @@ msgid "The following parts are low on required stock"
msgstr ""
#: templates/email/build_order_required_stock.html:18
-#: templates/js/translated/bom.js:1668 templates/js/translated/build.js:2557
+#: templates/js/translated/bom.js:1674 templates/js/translated/build.js:2557
msgid "Required Quantity"
msgstr ""
@@ -10676,7 +10705,7 @@ msgid "Click on the following link to view this part"
msgstr ""
#: templates/email/low_stock_notification.html:18
-#: templates/js/translated/part.js:3209
+#: templates/js/translated/part.js:3218
msgid "Minimum Quantity"
msgstr ""
@@ -11051,62 +11080,68 @@ msgstr ""
msgid "No pricing available"
msgstr ""
-#: templates/js/translated/bom.js:1182 templates/js/translated/build.js:2596
+#: templates/js/translated/bom.js:1184 templates/js/translated/build.js:2622
+#, fuzzy
+#| msgid "External Link"
+msgid "External stock"
+msgstr "Zunanja povezava"
+
+#: templates/js/translated/bom.js:1188 templates/js/translated/build.js:2596
#: templates/js/translated/sales_order.js:1910
msgid "No Stock Available"
msgstr ""
-#: templates/js/translated/bom.js:1187 templates/js/translated/build.js:2600
+#: templates/js/translated/bom.js:1193 templates/js/translated/build.js:2600
msgid "Includes variant and substitute stock"
msgstr ""
-#: templates/js/translated/bom.js:1189 templates/js/translated/build.js:2602
+#: templates/js/translated/bom.js:1195 templates/js/translated/build.js:2602
#: templates/js/translated/part.js:1256
#: templates/js/translated/sales_order.js:1907
msgid "Includes variant stock"
msgstr ""
-#: templates/js/translated/bom.js:1191 templates/js/translated/build.js:2604
+#: templates/js/translated/bom.js:1197 templates/js/translated/build.js:2604
msgid "Includes substitute stock"
msgstr ""
-#: templates/js/translated/bom.js:1219 templates/js/translated/build.js:2587
+#: templates/js/translated/bom.js:1225 templates/js/translated/build.js:2587
msgid "Consumable item"
msgstr ""
-#: templates/js/translated/bom.js:1279
+#: templates/js/translated/bom.js:1285
msgid "Validate BOM Item"
msgstr ""
-#: templates/js/translated/bom.js:1281
+#: templates/js/translated/bom.js:1287
msgid "This line has been validated"
msgstr ""
-#: templates/js/translated/bom.js:1283
+#: templates/js/translated/bom.js:1289
msgid "Edit substitute parts"
msgstr ""
-#: templates/js/translated/bom.js:1285 templates/js/translated/bom.js:1480
+#: templates/js/translated/bom.js:1291 templates/js/translated/bom.js:1486
msgid "Edit BOM Item"
msgstr ""
-#: templates/js/translated/bom.js:1287
+#: templates/js/translated/bom.js:1293
msgid "Delete BOM Item"
msgstr ""
-#: templates/js/translated/bom.js:1307
+#: templates/js/translated/bom.js:1313
msgid "View BOM"
msgstr ""
-#: templates/js/translated/bom.js:1391
+#: templates/js/translated/bom.js:1397
msgid "No BOM items found"
msgstr ""
-#: templates/js/translated/bom.js:1651 templates/js/translated/build.js:2486
+#: templates/js/translated/bom.js:1657 templates/js/translated/build.js:2486
msgid "Required Part"
msgstr ""
-#: templates/js/translated/bom.js:1677
+#: templates/js/translated/bom.js:1683
msgid "Inherited from parent BOM"
msgstr ""
@@ -11449,29 +11484,29 @@ msgstr ""
msgid "Sufficient stock available"
msgstr ""
-#: templates/js/translated/build.js:2643
+#: templates/js/translated/build.js:2647
msgid "Consumable Item"
msgstr ""
-#: templates/js/translated/build.js:2648
+#: templates/js/translated/build.js:2652
msgid "Tracked item"
msgstr ""
-#: templates/js/translated/build.js:2655
+#: templates/js/translated/build.js:2659
#: templates/js/translated/sales_order.js:2016
msgid "Build stock"
msgstr ""
-#: templates/js/translated/build.js:2660 templates/js/translated/stock.js:1829
+#: templates/js/translated/build.js:2664 templates/js/translated/stock.js:1829
msgid "Order stock"
msgstr ""
-#: templates/js/translated/build.js:2664
+#: templates/js/translated/build.js:2668
#: templates/js/translated/sales_order.js:2010
msgid "Allocate stock"
msgstr ""
-#: templates/js/translated/build.js:2668
+#: templates/js/translated/build.js:2672
msgid "Remove stock allocation"
msgstr ""
@@ -12313,64 +12348,64 @@ msgstr ""
msgid "Subscribed category"
msgstr ""
-#: templates/js/translated/part.js:2855
+#: templates/js/translated/part.js:2864
msgid "No test templates matching query"
msgstr ""
-#: templates/js/translated/part.js:2877 templates/js/translated/search.js:342
+#: templates/js/translated/part.js:2886 templates/js/translated/search.js:342
msgid "results"
msgstr ""
-#: templates/js/translated/part.js:2927 templates/js/translated/stock.js:1446
+#: templates/js/translated/part.js:2936 templates/js/translated/stock.js:1446
msgid "Edit test result"
msgstr ""
-#: templates/js/translated/part.js:2928 templates/js/translated/stock.js:1447
+#: templates/js/translated/part.js:2937 templates/js/translated/stock.js:1447
#: templates/js/translated/stock.js:1692
msgid "Delete test result"
msgstr ""
-#: templates/js/translated/part.js:2932
+#: templates/js/translated/part.js:2941
msgid "This test is defined for a parent part"
msgstr ""
-#: templates/js/translated/part.js:2948
+#: templates/js/translated/part.js:2957
msgid "Edit Test Result Template"
msgstr ""
-#: templates/js/translated/part.js:2962
+#: templates/js/translated/part.js:2971
msgid "Delete Test Result Template"
msgstr ""
-#: templates/js/translated/part.js:3041 templates/js/translated/part.js:3042
+#: templates/js/translated/part.js:3050 templates/js/translated/part.js:3051
msgid "No date specified"
msgstr ""
-#: templates/js/translated/part.js:3044
+#: templates/js/translated/part.js:3053
msgid "Specified date is in the past"
msgstr ""
-#: templates/js/translated/part.js:3050
+#: templates/js/translated/part.js:3059
msgid "Speculative"
msgstr ""
-#: templates/js/translated/part.js:3100
+#: templates/js/translated/part.js:3109
msgid "No scheduling information available for this part"
msgstr ""
-#: templates/js/translated/part.js:3106
+#: templates/js/translated/part.js:3115
msgid "Error fetching scheduling information for this part"
msgstr ""
-#: templates/js/translated/part.js:3202
+#: templates/js/translated/part.js:3211
msgid "Scheduled Stock Quantities"
msgstr ""
-#: templates/js/translated/part.js:3218
+#: templates/js/translated/part.js:3227
msgid "Maximum Quantity"
msgstr ""
-#: templates/js/translated/part.js:3263
+#: templates/js/translated/part.js:3272
msgid "Minimum Stock Level"
msgstr ""
@@ -14052,4 +14087,3 @@ msgstr ""
#: users/models.py:413
msgid "Permission to delete items"
msgstr ""
-
diff --git a/InvenTree/locale/sr/LC_MESSAGES/django.po b/InvenTree/locale/sr/LC_MESSAGES/django.po
index 4891fe39cc..33943d4adf 100644
--- a/InvenTree/locale/sr/LC_MESSAGES/django.po
+++ b/InvenTree/locale/sr/LC_MESSAGES/django.po
@@ -2,7 +2,7 @@ msgid ""
msgstr ""
"Project-Id-Version: inventree\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2024-02-28 04:05+0000\n"
+"POT-Creation-Date: 2024-03-05 00:41+0000\n"
"PO-Revision-Date: 2024-02-28 07:23\n"
"Last-Translator: \n"
"Language-Team: Serbian (Latin)\n"
@@ -66,9 +66,9 @@ msgstr "Unesite datum"
#: report/templates/report/inventree_build_order_base.html:172
#: stock/admin.py:226 stock/models.py:2335 stock/models.py:2451
#: stock/serializers.py:479 stock/serializers.py:632 stock/serializers.py:728
-#: stock/serializers.py:778 stock/serializers.py:1081 stock/serializers.py:1170
-#: stock/serializers.py:1335 stock/templates/stock/stock_sidebar.html:25
-#: templates/js/translated/barcode.js:143 templates/js/translated/bom.js:1259
+#: stock/serializers.py:778 stock/serializers.py:1087 stock/serializers.py:1176
+#: stock/serializers.py:1341 stock/templates/stock/stock_sidebar.html:25
+#: templates/js/translated/barcode.js:143 templates/js/translated/bom.js:1265
#: templates/js/translated/company.js:1674 templates/js/translated/order.js:347
#: templates/js/translated/part.js:1080
#: templates/js/translated/purchase_order.js:2201
@@ -523,7 +523,7 @@ msgstr "Ime"
#: templates/js/translated/order.js:298 templates/js/translated/part.js:1238
#: templates/js/translated/part.js:1483 templates/js/translated/part.js:1621
#: templates/js/translated/part.js:1958 templates/js/translated/part.js:2355
-#: templates/js/translated/part.js:2785 templates/js/translated/part.js:2887
+#: templates/js/translated/part.js:2785 templates/js/translated/part.js:2896
#: templates/js/translated/plugin.js:80
#: templates/js/translated/purchase_order.js:1707
#: templates/js/translated/purchase_order.js:1850
@@ -678,7 +678,7 @@ msgstr "URL udaljene slike"
msgid "Downloading images from remote URL is not enabled"
msgstr "Preuzimanje slika s udaljenog URL-a nije omogućeno"
-#: InvenTree/status.py:66 part/serializers.py:1120
+#: InvenTree/status.py:66 part/serializers.py:1138
msgid "Background worker check failed"
msgstr "Provera pozadinskog radnika nije uspjela"
@@ -960,7 +960,7 @@ msgid "Tracked"
msgstr ""
#: build/api.py:285 part/admin.py:144 templates/js/translated/build.js:1741
-#: templates/js/translated/build.js:2626
+#: templates/js/translated/build.js:2630
#: templates/js/translated/sales_order.js:1929
#: templates/js/translated/table_filters.js:571
msgid "Allocated"
@@ -1044,11 +1044,11 @@ msgstr ""
#: build/models.py:199 build/templates/build/build_base.html:97
#: build/templates/build/detail.html:29 company/models.py:1044
#: order/models.py:1389 order/models.py:1532 order/models.py:1533
-#: part/api.py:1528 part/models.py:389 part/models.py:3003 part/models.py:3147
-#: part/models.py:3291 part/models.py:3314 part/models.py:3335
-#: part/models.py:3357 part/models.py:3458 part/models.py:3754
-#: part/models.py:3885 part/models.py:3978 part/models.py:4339
-#: part/serializers.py:1066 part/serializers.py:1631
+#: part/api.py:1528 part/api.py:1820 part/models.py:389 part/models.py:3003
+#: part/models.py:3147 part/models.py:3291 part/models.py:3314
+#: part/models.py:3335 part/models.py:3357 part/models.py:3458
+#: part/models.py:3754 part/models.py:3885 part/models.py:3978
+#: part/models.py:4339 part/serializers.py:1084 part/serializers.py:1659
#: part/templates/part/part_app_base.html:8
#: part/templates/part/part_pricing.html:12
#: part/templates/part/upload_bom.html:52
@@ -1147,7 +1147,7 @@ msgid "Build status code"
msgstr ""
#: build/models.py:264 build/serializers.py:280 order/serializers.py:549
-#: stock/models.py:826 stock/serializers.py:1300
+#: stock/models.py:826 stock/serializers.py:1306
#: templates/js/translated/purchase_order.js:1129
msgid "Batch Code"
msgstr ""
@@ -1242,48 +1242,48 @@ msgstr ""
msgid "Project code for this build order"
msgstr ""
-#: build/models.py:559
+#: build/models.py:575
#, python-brace-format
msgid "Build order {build} has been completed"
msgstr ""
-#: build/models.py:565
+#: build/models.py:581
msgid "A build order has been completed"
msgstr ""
-#: build/models.py:783 build/models.py:858
+#: build/models.py:799 build/models.py:874
msgid "No build output specified"
msgstr ""
-#: build/models.py:786
+#: build/models.py:802
msgid "Build output is already completed"
msgstr ""
-#: build/models.py:789
+#: build/models.py:805
msgid "Build output does not match Build Order"
msgstr ""
-#: build/models.py:862 build/serializers.py:223 build/serializers.py:262
+#: build/models.py:878 build/serializers.py:223 build/serializers.py:262
#: build/serializers.py:831 order/models.py:526 order/serializers.py:401
-#: order/serializers.py:544 part/serializers.py:1423 part/serializers.py:1789
+#: order/serializers.py:544 part/serializers.py:1442 part/serializers.py:1817
#: stock/models.py:665 stock/models.py:1477 stock/serializers.py:450
msgid "Quantity must be greater than zero"
msgstr ""
-#: build/models.py:867 build/serializers.py:228
+#: build/models.py:883 build/serializers.py:228
msgid "Quantity cannot be greater than the output quantity"
msgstr ""
-#: build/models.py:924 build/serializers.py:533
+#: build/models.py:940 build/serializers.py:533
#, python-brace-format
msgid "Build output {serial} has not passed all required tests"
msgstr ""
-#: build/models.py:1286
+#: build/models.py:1302
msgid "Build object"
msgstr ""
-#: build/models.py:1300 build/models.py:1558 build/serializers.py:210
+#: build/models.py:1316 build/models.py:1574 build/serializers.py:210
#: build/serializers.py:247 build/templates/build/build_base.html:102
#: build/templates/build/detail.html:34 common/models.py:2432
#: order/models.py:1247 order/models.py:1902 order/serializers.py:1306
@@ -1310,7 +1310,7 @@ msgstr ""
#: templates/js/translated/company.js:1808
#: templates/js/translated/model_renderers.js:230
#: templates/js/translated/order.js:304 templates/js/translated/part.js:961
-#: templates/js/translated/part.js:1811 templates/js/translated/part.js:3332
+#: templates/js/translated/part.js:1811 templates/js/translated/part.js:3341
#: templates/js/translated/pricing.js:381
#: templates/js/translated/pricing.js:474
#: templates/js/translated/pricing.js:522
@@ -1330,38 +1330,38 @@ msgstr ""
msgid "Quantity"
msgstr ""
-#: build/models.py:1301
+#: build/models.py:1317
msgid "Required quantity for build order"
msgstr ""
-#: build/models.py:1381
+#: build/models.py:1397
msgid "Build item must specify a build output, as master part is marked as trackable"
msgstr ""
-#: build/models.py:1390
+#: build/models.py:1406
#, python-brace-format
msgid "Allocated quantity ({q}) must not exceed available stock quantity ({a})"
msgstr ""
-#: build/models.py:1400 order/models.py:1853
+#: build/models.py:1416 order/models.py:1853
msgid "Stock item is over-allocated"
msgstr ""
-#: build/models.py:1406 order/models.py:1856
+#: build/models.py:1422 order/models.py:1856
msgid "Allocation quantity must be greater than zero"
msgstr ""
-#: build/models.py:1412
+#: build/models.py:1428
msgid "Quantity must be 1 for serialized stock"
msgstr ""
-#: build/models.py:1473
+#: build/models.py:1489
msgid "Selected stock item does not match BOM line"
msgstr ""
-#: build/models.py:1545 build/serializers.py:811 order/serializers.py:1150
-#: order/serializers.py:1171 stock/serializers.py:544 stock/serializers.py:1019
-#: stock/serializers.py:1131 stock/templates/stock/item_base.html:10
+#: build/models.py:1561 build/serializers.py:811 order/serializers.py:1150
+#: order/serializers.py:1171 stock/serializers.py:544 stock/serializers.py:1025
+#: stock/serializers.py:1137 stock/templates/stock/item_base.html:10
#: stock/templates/stock/item_base.html:23
#: stock/templates/stock/item_base.html:194
#: templates/js/translated/build.js:1742
@@ -1376,19 +1376,19 @@ msgstr ""
msgid "Stock Item"
msgstr ""
-#: build/models.py:1546
+#: build/models.py:1562
msgid "Source stock item"
msgstr ""
-#: build/models.py:1559
+#: build/models.py:1575
msgid "Stock quantity to allocate to build"
msgstr ""
-#: build/models.py:1567
+#: build/models.py:1583
msgid "Install into"
msgstr ""
-#: build/models.py:1568
+#: build/models.py:1584
msgid "Destination stock item"
msgstr ""
@@ -1452,9 +1452,9 @@ msgid "A list of build outputs must be provided"
msgstr ""
#: build/serializers.py:426 build/serializers.py:498 order/serializers.py:533
-#: order/serializers.py:641 order/serializers.py:1646 part/serializers.py:1086
+#: order/serializers.py:641 order/serializers.py:1646 part/serializers.py:1104
#: stock/serializers.py:472 stock/serializers.py:627 stock/serializers.py:723
-#: stock/serializers.py:1163 stock/serializers.py:1419
+#: stock/serializers.py:1169 stock/serializers.py:1425
#: stock/templates/stock/item_base.html:394
#: templates/js/translated/barcode.js:547
#: templates/js/translated/barcode.js:795 templates/js/translated/build.js:999
@@ -1494,7 +1494,7 @@ msgstr ""
#: build/serializers.py:505 build/templates/build/build_base.html:151
#: build/templates/build/detail.html:62 order/models.py:910
#: order/models.py:2005 order/serializers.py:565 stock/admin.py:165
-#: stock/serializers.py:774 stock/serializers.py:1307
+#: stock/serializers.py:774 stock/serializers.py:1313
#: stock/templates/stock/item_base.html:427
#: templates/js/translated/barcode.js:252 templates/js/translated/build.js:2189
#: templates/js/translated/purchase_order.js:1308
@@ -1602,7 +1602,7 @@ msgstr ""
msgid "bom_item.part must point to the same part as the build order"
msgstr ""
-#: build/serializers.py:817 stock/serializers.py:1032
+#: build/serializers.py:817 stock/serializers.py:1038
msgid "Item must be in stock"
msgstr ""
@@ -1659,44 +1659,45 @@ msgstr ""
msgid "Allocate optional BOM items to build order"
msgstr ""
-#: build/serializers.py:1096 part/models.py:3895 part/models.py:4331
+#: build/serializers.py:1097 part/models.py:3895 part/models.py:4331
#: stock/api.py:745
msgid "BOM Item"
msgstr ""
-#: build/serializers.py:1105 templates/js/translated/index.js:130
+#: build/serializers.py:1106 templates/js/translated/index.js:130
msgid "Allocated Stock"
msgstr ""
-#: build/serializers.py:1110 part/admin.py:132 part/bom.py:173
-#: part/serializers.py:1441 part/templates/part/part_base.html:210
-#: templates/js/translated/bom.js:1202 templates/js/translated/build.js:2614
-#: templates/js/translated/part.js:709 templates/js/translated/part.js:2148
+#: build/serializers.py:1111 part/admin.py:132 part/bom.py:173
+#: part/serializers.py:798 part/serializers.py:1460
+#: part/templates/part/part_base.html:210 templates/js/translated/bom.js:1208
+#: templates/js/translated/build.js:2614 templates/js/translated/part.js:709
+#: templates/js/translated/part.js:2148
#: templates/js/translated/table_filters.js:170
msgid "On Order"
msgstr ""
-#: build/serializers.py:1115 part/serializers.py:1443
+#: build/serializers.py:1116 part/serializers.py:1462
#: templates/js/translated/build.js:2618
#: templates/js/translated/table_filters.js:360
msgid "In Production"
msgstr ""
-#: build/serializers.py:1120 part/bom.py:172 part/serializers.py:1454
+#: build/serializers.py:1121 part/bom.py:172 part/serializers.py:1473
#: part/templates/part/part_base.html:192
#: templates/js/translated/sales_order.js:1893
msgid "Available Stock"
msgstr ""
-#: build/tasks.py:149
+#: build/tasks.py:171
msgid "Stock required for build order"
msgstr ""
-#: build/tasks.py:166
+#: build/tasks.py:188
msgid "Overdue Build Order"
msgstr ""
-#: build/tasks.py:171
+#: build/tasks.py:193
#, python-brace-format
msgid "Build order {bo} is now overdue"
msgstr ""
@@ -1990,27 +1991,31 @@ msgstr ""
msgid "Order Parts"
msgstr ""
-#: build/templates/build/detail.html:210
-msgid "Incomplete Build Outputs"
-msgstr ""
-
-#: build/templates/build/detail.html:214
-msgid "Create new build output"
+#: build/templates/build/detail.html:205
+msgid "Available stock has been filtered based on specified source location for this build order"
msgstr ""
#: build/templates/build/detail.html:215
+msgid "Incomplete Build Outputs"
+msgstr ""
+
+#: build/templates/build/detail.html:219
+msgid "Create new build output"
+msgstr ""
+
+#: build/templates/build/detail.html:220
msgid "New Build Output"
msgstr ""
-#: build/templates/build/detail.html:232 build/templates/build/sidebar.html:15
+#: build/templates/build/detail.html:237 build/templates/build/sidebar.html:15
msgid "Consumed Stock"
msgstr ""
-#: build/templates/build/detail.html:244
+#: build/templates/build/detail.html:249
msgid "Completed Build Outputs"
msgstr ""
-#: build/templates/build/detail.html:256 build/templates/build/sidebar.html:19
+#: build/templates/build/detail.html:261 build/templates/build/sidebar.html:19
#: company/templates/company/detail.html:229
#: company/templates/company/manufacturer_part.html:141
#: company/templates/company/manufacturer_part_sidebar.html:9
@@ -2026,15 +2031,15 @@ msgstr ""
msgid "Attachments"
msgstr ""
-#: build/templates/build/detail.html:271
+#: build/templates/build/detail.html:276
msgid "Build Notes"
msgstr ""
-#: build/templates/build/detail.html:426
+#: build/templates/build/detail.html:434
msgid "Allocation Complete"
msgstr ""
-#: build/templates/build/detail.html:427
+#: build/templates/build/detail.html:435
msgid "All lines have been fully allocated"
msgstr ""
@@ -2436,7 +2441,7 @@ msgid "Parts are templates by default"
msgstr ""
#: common/models.py:1456 part/admin.py:91 part/admin.py:431 part/models.py:1015
-#: templates/js/translated/bom.js:1633
+#: templates/js/translated/bom.js:1639
#: templates/js/translated/table_filters.js:330
#: templates/js/translated/table_filters.js:721
msgid "Assembly"
@@ -3495,7 +3500,7 @@ msgstr ""
msgid "Price break quantity"
msgstr ""
-#: common/models.py:2440 company/serializers.py:484 order/admin.py:42
+#: common/models.py:2440 company/serializers.py:486 order/admin.py:42
#: order/models.py:1321 order/models.py:2226
#: templates/js/translated/company.js:1813 templates/js/translated/part.js:1885
#: templates/js/translated/pricing.js:621
@@ -3972,7 +3977,7 @@ msgstr ""
#: company/models.py:495 company/templates/company/company_base.html:76
#: company/templates/company/manufacturer_part.html:90
-#: company/templates/company/supplier_part.html:145 part/serializers.py:497
+#: company/templates/company/supplier_part.html:145 part/serializers.py:505
#: stock/templates/stock/item_base.html:207
#: templates/js/translated/company.js:506
#: templates/js/translated/company.js:1108
@@ -3987,7 +3992,7 @@ msgid "Select manufacturer"
msgstr ""
#: company/models.py:502 company/templates/company/manufacturer_part.html:101
-#: company/templates/company/supplier_part.html:153 part/serializers.py:507
+#: company/templates/company/supplier_part.html:153 part/serializers.py:515
#: templates/js/translated/company.js:351
#: templates/js/translated/company.js:1107
#: templates/js/translated/company.js:1302
@@ -4059,7 +4064,7 @@ msgstr ""
#: company/models.py:795 company/templates/company/company_base.html:81
#: company/templates/company/supplier_part.html:129 order/models.py:453
#: order/templates/order/order_base.html:136 part/bom.py:272 part/bom.py:310
-#: part/serializers.py:481 plugin/builtin/suppliers/digikey.py:25
+#: part/serializers.py:489 plugin/builtin/suppliers/digikey.py:25
#: plugin/builtin/suppliers/lcsc.py:26 plugin/builtin/suppliers/mouser.py:24
#: plugin/builtin/suppliers/tme.py:26 stock/templates/stock/item_base.html:224
#: templates/email/overdue_purchase_order.html:16
@@ -4076,7 +4081,7 @@ msgstr ""
msgid "Select supplier"
msgstr ""
-#: company/models.py:802 part/serializers.py:492
+#: company/models.py:802 part/serializers.py:500
msgid "Supplier stock keeping unit"
msgstr ""
@@ -4112,7 +4117,7 @@ msgid "Minimum charge (e.g. stocking fee)"
msgstr ""
#: company/models.py:851 company/templates/company/supplier_part.html:160
-#: stock/admin.py:224 stock/models.py:785 stock/serializers.py:1317
+#: stock/admin.py:224 stock/models.py:785 stock/serializers.py:1323
#: stock/templates/stock/item_base.html:240
#: templates/js/translated/company.js:1636
#: templates/js/translated/stock.js:2387
@@ -4157,7 +4162,7 @@ msgstr ""
msgid "Date of last update of availability data"
msgstr ""
-#: company/serializers.py:153
+#: company/serializers.py:155
msgid "Default currency used for this supplier"
msgstr ""
@@ -4218,7 +4223,7 @@ msgstr ""
#: company/templates/company/company_base.html:86 order/models.py:898
#: order/models.py:1993 order/templates/order/return_order_base.html:131
#: order/templates/order/sales_order_base.html:144 stock/models.py:807
-#: stock/models.py:808 stock/serializers.py:1067
+#: stock/models.py:808 stock/serializers.py:1073
#: stock/templates/stock/item_base.html:405
#: templates/email/overdue_sales_order.html:16
#: templates/js/translated/company.js:502
@@ -4429,8 +4434,9 @@ msgstr ""
#: company/templates/company/manufacturer_part.html:119
#: company/templates/company/supplier_part.html:15 company/views.py:31
-#: part/admin.py:122 part/templates/part/part_sidebar.html:33
-#: templates/InvenTree/search.html:190 templates/navbar.html:48
+#: part/admin.py:122 part/serializers.py:802
+#: part/templates/part/part_sidebar.html:33 templates/InvenTree/search.html:190
+#: templates/navbar.html:48
msgid "Suppliers"
msgstr ""
@@ -4528,7 +4534,7 @@ msgid "No supplier information available"
msgstr ""
#: company/templates/company/supplier_part.html:139 part/bom.py:279
-#: part/bom.py:311 part/serializers.py:491
+#: part/bom.py:311 part/serializers.py:499
#: templates/js/translated/company.js:349 templates/js/translated/part.js:1786
#: templates/js/translated/pricing.js:510
#: templates/js/translated/purchase_order.js:1851
@@ -4577,10 +4583,12 @@ msgstr ""
msgid "Update Part Availability"
msgstr ""
-#: company/templates/company/supplier_part_sidebar.html:5 part/stocktake.py:223
+#: company/templates/company/supplier_part_sidebar.html:5
+#: part/serializers.py:801 part/stocktake.py:223
#: part/templates/part/category.html:183
#: part/templates/part/category_sidebar.html:17 stock/admin.py:69
-#: stock/serializers.py:760 stock/templates/stock/location.html:170
+#: stock/serializers.py:760 stock/serializers.py:924
+#: stock/templates/stock/location.html:170
#: stock/templates/stock/location.html:184
#: stock/templates/stock/location.html:196
#: stock/templates/stock/location_sidebar.html:7
@@ -4640,7 +4648,7 @@ msgid "Label template file"
msgstr ""
#: label/models.py:143 part/models.py:3484 report/models.py:322
-#: templates/js/translated/part.js:2891
+#: templates/js/translated/part.js:2900
#: templates/js/translated/table_filters.js:481
msgid "Enabled"
msgstr ""
@@ -5733,7 +5741,7 @@ msgid "Pending Shipments"
msgstr ""
#: order/templates/order/sales_order_detail.html:71
-#: templates/js/translated/bom.js:1271 templates/js/translated/filters.js:296
+#: templates/js/translated/bom.js:1277 templates/js/translated/filters.js:296
msgid "Actions"
msgstr ""
@@ -5861,10 +5869,10 @@ msgstr ""
msgid "Category Path"
msgstr ""
-#: part/admin.py:323 part/models.py:390 part/serializers.py:259
-#: part/serializers.py:373 part/templates/part/cat_link.html:3
-#: part/templates/part/category.html:23 part/templates/part/category.html:141
-#: part/templates/part/category.html:161
+#: part/admin.py:323 part/models.py:390 part/serializers.py:112
+#: part/serializers.py:265 part/serializers.py:381
+#: part/templates/part/cat_link.html:3 part/templates/part/category.html:23
+#: part/templates/part/category.html:141 part/templates/part/category.html:161
#: part/templates/part/category_sidebar.html:9
#: templates/InvenTree/index.html:36 templates/InvenTree/search.html:84
#: templates/InvenTree/settings/sidebar.html:47
@@ -5889,13 +5897,13 @@ msgstr ""
msgid "Part IPN"
msgstr ""
-#: part/admin.py:421 part/serializers.py:1220
+#: part/admin.py:421 part/serializers.py:1238
#: templates/js/translated/pricing.js:358
#: templates/js/translated/pricing.js:1024
msgid "Minimum Price"
msgstr ""
-#: part/admin.py:426 part/serializers.py:1235
+#: part/admin.py:426 part/serializers.py:1253
#: templates/js/translated/pricing.js:353
#: templates/js/translated/pricing.js:1032
msgid "Maximum Price"
@@ -5974,7 +5982,7 @@ msgid "This option must be selected"
msgstr ""
#: part/api.py:1541 part/models.py:895 part/models.py:3385 part/models.py:3831
-#: part/serializers.py:388 part/serializers.py:1076
+#: part/serializers.py:396 part/serializers.py:1094
#: part/templates/part/part_base.html:260 stock/api.py:733
#: templates/InvenTree/settings/settings_staff_js.html:300
#: templates/js/translated/notification.js:60
@@ -5982,12 +5990,17 @@ msgstr ""
msgid "Category"
msgstr ""
+#: part/api.py:1828
+msgid "Uses"
+msgstr ""
+
#: part/bom.py:170 part/models.py:100 part/models.py:938
#: part/templates/part/category.html:116 part/templates/part/part_base.html:367
msgid "Default Location"
msgstr ""
-#: part/bom.py:171 templates/email/low_stock_notification.html:16
+#: part/bom.py:171 part/serializers.py:803
+#: templates/email/low_stock_notification.html:16
msgid "Total Stock"
msgstr ""
@@ -6010,7 +6023,8 @@ msgstr ""
msgid "Default location for parts in this category"
msgstr ""
-#: part/models.py:106 stock/models.py:165 templates/js/translated/stock.js:2736
+#: part/models.py:106 stock/models.py:165 templates/js/translated/part.js:2810
+#: templates/js/translated/stock.js:2736
#: templates/js/translated/table_filters.js:239
#: templates/js/translated/table_filters.js:283
msgid "Structural"
@@ -6418,7 +6432,7 @@ msgstr ""
msgid "Test with this name already exists for this part"
msgstr ""
-#: part/models.py:3464 templates/js/translated/part.js:2870
+#: part/models.py:3464 templates/js/translated/part.js:2879
msgid "Test Name"
msgstr ""
@@ -6446,7 +6460,7 @@ msgstr ""
msgid "Is this test enabled?"
msgstr ""
-#: part/models.py:3489 templates/js/translated/part.js:2899
+#: part/models.py:3489 templates/js/translated/part.js:2908
#: templates/js/translated/table_filters.js:477
msgid "Required"
msgstr ""
@@ -6455,7 +6469,7 @@ msgstr ""
msgid "Is this test required to pass?"
msgstr ""
-#: part/models.py:3495 templates/js/translated/part.js:2907
+#: part/models.py:3495 templates/js/translated/part.js:2916
msgid "Requires Value"
msgstr ""
@@ -6463,7 +6477,7 @@ msgstr ""
msgid "Does this test require a value when adding a test result?"
msgstr ""
-#: part/models.py:3501 templates/js/translated/part.js:2914
+#: part/models.py:3501 templates/js/translated/part.js:2923
msgid "Requires Attachment"
msgstr ""
@@ -6685,311 +6699,323 @@ msgstr ""
msgid "Duplicate relationship already exists"
msgstr ""
-#: part/serializers.py:128 part/templates/part/category.html:122
-#: part/templates/part/category.html:207
+#: part/serializers.py:114 part/serializers.py:134
+#: part/templates/part/category.html:122 part/templates/part/category.html:207
#: part/templates/part/category_sidebar.html:7
msgid "Subcategories"
msgstr ""
-#: part/serializers.py:172
+#: part/serializers.py:178
msgid "Results"
msgstr ""
-#: part/serializers.py:173
+#: part/serializers.py:179
msgid "Number of results recorded against this template"
msgstr ""
-#: part/serializers.py:197 part/serializers.py:215 stock/serializers.py:384
+#: part/serializers.py:203 part/serializers.py:221 stock/serializers.py:384
msgid "Purchase currency of this stock item"
msgstr ""
-#: part/serializers.py:260
+#: part/serializers.py:266
msgid "Number of parts using this template"
msgstr ""
-#: part/serializers.py:379
+#: part/serializers.py:387
msgid "No parts selected"
msgstr ""
-#: part/serializers.py:389
+#: part/serializers.py:397
msgid "Select category"
msgstr ""
-#: part/serializers.py:419
+#: part/serializers.py:427
msgid "Original Part"
msgstr ""
-#: part/serializers.py:420
+#: part/serializers.py:428
msgid "Select original part to duplicate"
msgstr ""
-#: part/serializers.py:425
+#: part/serializers.py:433
msgid "Copy Image"
msgstr ""
-#: part/serializers.py:426
+#: part/serializers.py:434
msgid "Copy image from original part"
msgstr ""
-#: part/serializers.py:432 part/templates/part/detail.html:277
+#: part/serializers.py:440 part/templates/part/detail.html:277
msgid "Copy BOM"
msgstr ""
-#: part/serializers.py:433
+#: part/serializers.py:441
msgid "Copy bill of materials from original part"
msgstr ""
-#: part/serializers.py:439
+#: part/serializers.py:447
msgid "Copy Parameters"
msgstr ""
-#: part/serializers.py:440
+#: part/serializers.py:448
msgid "Copy parameter data from original part"
msgstr ""
-#: part/serializers.py:446
+#: part/serializers.py:454
msgid "Copy Notes"
msgstr ""
-#: part/serializers.py:447
+#: part/serializers.py:455
msgid "Copy notes from original part"
msgstr ""
-#: part/serializers.py:460
+#: part/serializers.py:468
msgid "Initial Stock Quantity"
msgstr ""
-#: part/serializers.py:462
+#: part/serializers.py:470
msgid "Specify initial stock quantity for this Part. If quantity is zero, no stock is added."
msgstr ""
-#: part/serializers.py:469
+#: part/serializers.py:477
msgid "Initial Stock Location"
msgstr ""
-#: part/serializers.py:470
+#: part/serializers.py:478
msgid "Specify initial stock location for this Part"
msgstr ""
-#: part/serializers.py:482
+#: part/serializers.py:490
msgid "Select supplier (or leave blank to skip)"
msgstr ""
-#: part/serializers.py:498
+#: part/serializers.py:506
msgid "Select manufacturer (or leave blank to skip)"
msgstr ""
-#: part/serializers.py:508
+#: part/serializers.py:516
msgid "Manufacturer part number"
msgstr ""
-#: part/serializers.py:515
+#: part/serializers.py:523
msgid "Selected company is not a valid supplier"
msgstr ""
-#: part/serializers.py:524
+#: part/serializers.py:532
msgid "Selected company is not a valid manufacturer"
msgstr ""
-#: part/serializers.py:535
+#: part/serializers.py:543
msgid "Manufacturer part matching this MPN already exists"
msgstr ""
-#: part/serializers.py:542
+#: part/serializers.py:550
msgid "Supplier part matching this SKU already exists"
msgstr ""
-#: part/serializers.py:815 part/templates/part/copy_part.html:9
+#: part/serializers.py:804
+msgid "External Stock"
+msgstr ""
+
+#: part/serializers.py:806
+msgid "Unallocated Stock"
+msgstr ""
+
+#: part/serializers.py:808
+msgid "Variant Stock"
+msgstr ""
+
+#: part/serializers.py:833 part/templates/part/copy_part.html:9
#: templates/js/translated/part.js:471
msgid "Duplicate Part"
msgstr ""
-#: part/serializers.py:816
+#: part/serializers.py:834
msgid "Copy initial data from another Part"
msgstr ""
-#: part/serializers.py:822 templates/js/translated/part.js:102
+#: part/serializers.py:840 templates/js/translated/part.js:102
msgid "Initial Stock"
msgstr ""
-#: part/serializers.py:823
+#: part/serializers.py:841
msgid "Create Part with initial stock quantity"
msgstr ""
-#: part/serializers.py:829
+#: part/serializers.py:847
msgid "Supplier Information"
msgstr ""
-#: part/serializers.py:830
+#: part/serializers.py:848
msgid "Add initial supplier information for this part"
msgstr ""
-#: part/serializers.py:838
+#: part/serializers.py:856
msgid "Copy Category Parameters"
msgstr ""
-#: part/serializers.py:839
+#: part/serializers.py:857
msgid "Copy parameter templates from selected part category"
msgstr ""
-#: part/serializers.py:844
+#: part/serializers.py:862
msgid "Existing Image"
msgstr ""
-#: part/serializers.py:845
+#: part/serializers.py:863
msgid "Filename of an existing part image"
msgstr ""
-#: part/serializers.py:862
+#: part/serializers.py:880
msgid "Image file does not exist"
msgstr ""
-#: part/serializers.py:1068
+#: part/serializers.py:1086
msgid "Limit stocktake report to a particular part, and any variant parts"
msgstr ""
-#: part/serializers.py:1078
+#: part/serializers.py:1096
msgid "Limit stocktake report to a particular part category, and any child categories"
msgstr ""
-#: part/serializers.py:1088
+#: part/serializers.py:1106
msgid "Limit stocktake report to a particular stock location, and any child locations"
msgstr ""
-#: part/serializers.py:1094
+#: part/serializers.py:1112
msgid "Exclude External Stock"
msgstr ""
-#: part/serializers.py:1095
+#: part/serializers.py:1113
msgid "Exclude stock items in external locations"
msgstr ""
-#: part/serializers.py:1100
+#: part/serializers.py:1118
msgid "Generate Report"
msgstr ""
-#: part/serializers.py:1101
+#: part/serializers.py:1119
msgid "Generate report file containing calculated stocktake data"
msgstr ""
-#: part/serializers.py:1106
+#: part/serializers.py:1124
msgid "Update Parts"
msgstr ""
-#: part/serializers.py:1107
+#: part/serializers.py:1125
msgid "Update specified parts with calculated stocktake data"
msgstr ""
-#: part/serializers.py:1115
+#: part/serializers.py:1133
msgid "Stocktake functionality is not enabled"
msgstr ""
-#: part/serializers.py:1221
+#: part/serializers.py:1239
msgid "Override calculated value for minimum price"
msgstr ""
-#: part/serializers.py:1228
+#: part/serializers.py:1246
msgid "Minimum price currency"
msgstr ""
-#: part/serializers.py:1236
+#: part/serializers.py:1254
msgid "Override calculated value for maximum price"
msgstr ""
-#: part/serializers.py:1243
+#: part/serializers.py:1261
msgid "Maximum price currency"
msgstr ""
-#: part/serializers.py:1272
+#: part/serializers.py:1290
msgid "Update"
msgstr ""
-#: part/serializers.py:1273
+#: part/serializers.py:1291
msgid "Update pricing for this part"
msgstr ""
-#: part/serializers.py:1296
+#: part/serializers.py:1314
#, python-brace-format
msgid "Could not convert from provided currencies to {default_currency}"
msgstr ""
-#: part/serializers.py:1303
+#: part/serializers.py:1321
msgid "Minimum price must not be greater than maximum price"
msgstr ""
-#: part/serializers.py:1306
+#: part/serializers.py:1324
msgid "Maximum price must not be less than minimum price"
msgstr ""
-#: part/serializers.py:1632
+#: part/serializers.py:1660
msgid "Select part to copy BOM from"
msgstr ""
-#: part/serializers.py:1640
+#: part/serializers.py:1668
msgid "Remove Existing Data"
msgstr ""
-#: part/serializers.py:1641
+#: part/serializers.py:1669
msgid "Remove existing BOM items before copying"
msgstr ""
-#: part/serializers.py:1646
+#: part/serializers.py:1674
msgid "Include Inherited"
msgstr ""
-#: part/serializers.py:1647
+#: part/serializers.py:1675
msgid "Include BOM items which are inherited from templated parts"
msgstr ""
-#: part/serializers.py:1652
+#: part/serializers.py:1680
msgid "Skip Invalid Rows"
msgstr ""
-#: part/serializers.py:1653
+#: part/serializers.py:1681
msgid "Enable this option to skip invalid rows"
msgstr ""
-#: part/serializers.py:1658
+#: part/serializers.py:1686
msgid "Copy Substitute Parts"
msgstr ""
-#: part/serializers.py:1659
+#: part/serializers.py:1687
msgid "Copy substitute parts when duplicate BOM items"
msgstr ""
-#: part/serializers.py:1693
+#: part/serializers.py:1721
msgid "Clear Existing BOM"
msgstr ""
-#: part/serializers.py:1694
+#: part/serializers.py:1722
msgid "Delete existing BOM items before uploading"
msgstr ""
-#: part/serializers.py:1724
+#: part/serializers.py:1752
msgid "No part column specified"
msgstr ""
-#: part/serializers.py:1768
+#: part/serializers.py:1796
msgid "Multiple matching parts found"
msgstr ""
-#: part/serializers.py:1771
+#: part/serializers.py:1799
msgid "No matching part found"
msgstr ""
-#: part/serializers.py:1774
+#: part/serializers.py:1802
msgid "Part is not designated as a component"
msgstr ""
-#: part/serializers.py:1783
+#: part/serializers.py:1811
msgid "Quantity not provided"
msgstr ""
-#: part/serializers.py:1791
+#: part/serializers.py:1819
msgid "Invalid quantity"
msgstr ""
-#: part/serializers.py:1812
+#: part/serializers.py:1840
msgid "At least one BOM item is required"
msgstr ""
@@ -7221,7 +7247,7 @@ msgid "Validate BOM"
msgstr ""
#: part/templates/part/detail.html:283 part/templates/part/detail.html:284
-#: templates/js/translated/bom.js:1314 templates/js/translated/bom.js:1315
+#: templates/js/translated/bom.js:1320 templates/js/translated/bom.js:1321
msgid "Add BOM Item"
msgstr ""
@@ -7405,7 +7431,7 @@ msgstr ""
msgid "Allocated to Sales Orders"
msgstr ""
-#: part/templates/part/part_base.html:235 templates/js/translated/bom.js:1213
+#: part/templates/part/part_base.html:235 templates/js/translated/bom.js:1219
msgid "Can Build"
msgstr ""
@@ -8784,7 +8810,7 @@ msgstr ""
msgid "Where is this stock item located?"
msgstr ""
-#: stock/models.py:786 stock/serializers.py:1318
+#: stock/models.py:786 stock/serializers.py:1324
msgid "Packaging this stock item is stored in"
msgstr ""
@@ -8796,7 +8822,7 @@ msgstr ""
msgid "Serial number for this item"
msgstr ""
-#: stock/models.py:830 stock/serializers.py:1301
+#: stock/models.py:830 stock/serializers.py:1307
msgid "Batch code for this stock item"
msgstr ""
@@ -8905,7 +8931,7 @@ msgstr ""
msgid "Serialized stock cannot be merged"
msgstr ""
-#: stock/models.py:1639 stock/serializers.py:1207
+#: stock/models.py:1639 stock/serializers.py:1213
msgid "Duplicate stock items"
msgstr ""
@@ -8986,7 +9012,7 @@ msgstr ""
msgid "Enter serial numbers for new items"
msgstr ""
-#: stock/serializers.py:473 stock/serializers.py:1164 stock/serializers.py:1420
+#: stock/serializers.py:473 stock/serializers.py:1170 stock/serializers.py:1426
msgid "Destination stock location"
msgstr ""
@@ -9059,77 +9085,78 @@ msgstr ""
msgid "No stock items selected"
msgstr ""
-#: stock/serializers.py:863 stock/templates/stock/location.html:165
+#: stock/serializers.py:863 stock/serializers.py:926
+#: stock/templates/stock/location.html:165
#: stock/templates/stock/location.html:213
#: stock/templates/stock/location_sidebar.html:5
msgid "Sublocations"
msgstr ""
-#: stock/serializers.py:1036
+#: stock/serializers.py:1042
msgid "Part must be salable"
msgstr ""
-#: stock/serializers.py:1040
+#: stock/serializers.py:1046
msgid "Item is allocated to a sales order"
msgstr ""
-#: stock/serializers.py:1044
+#: stock/serializers.py:1050
msgid "Item is allocated to a build order"
msgstr ""
-#: stock/serializers.py:1068
+#: stock/serializers.py:1074
msgid "Customer to assign stock items"
msgstr ""
-#: stock/serializers.py:1074
+#: stock/serializers.py:1080
msgid "Selected company is not a customer"
msgstr ""
-#: stock/serializers.py:1082
+#: stock/serializers.py:1088
msgid "Stock assignment notes"
msgstr ""
-#: stock/serializers.py:1092 stock/serializers.py:1346
+#: stock/serializers.py:1098 stock/serializers.py:1352
msgid "A list of stock items must be provided"
msgstr ""
-#: stock/serializers.py:1171
+#: stock/serializers.py:1177
msgid "Stock merging notes"
msgstr ""
-#: stock/serializers.py:1176
+#: stock/serializers.py:1182
msgid "Allow mismatched suppliers"
msgstr ""
-#: stock/serializers.py:1177
+#: stock/serializers.py:1183
msgid "Allow stock items with different supplier parts to be merged"
msgstr ""
-#: stock/serializers.py:1182
+#: stock/serializers.py:1188
msgid "Allow mismatched status"
msgstr ""
-#: stock/serializers.py:1183
+#: stock/serializers.py:1189
msgid "Allow stock items with different status codes to be merged"
msgstr ""
-#: stock/serializers.py:1193
+#: stock/serializers.py:1199
msgid "At least two stock items must be provided"
msgstr ""
-#: stock/serializers.py:1260
+#: stock/serializers.py:1266
msgid "No Change"
msgstr ""
-#: stock/serializers.py:1289
+#: stock/serializers.py:1295
msgid "StockItem primary key value"
msgstr ""
-#: stock/serializers.py:1308
+#: stock/serializers.py:1314
msgid "Stock item status code"
msgstr ""
-#: stock/serializers.py:1336
+#: stock/serializers.py:1342
msgid "Stock transaction notes"
msgstr ""
@@ -10662,7 +10689,7 @@ msgid "The following parts are low on required stock"
msgstr ""
#: templates/email/build_order_required_stock.html:18
-#: templates/js/translated/bom.js:1668 templates/js/translated/build.js:2557
+#: templates/js/translated/bom.js:1674 templates/js/translated/build.js:2557
msgid "Required Quantity"
msgstr ""
@@ -10676,7 +10703,7 @@ msgid "Click on the following link to view this part"
msgstr ""
#: templates/email/low_stock_notification.html:18
-#: templates/js/translated/part.js:3209
+#: templates/js/translated/part.js:3218
msgid "Minimum Quantity"
msgstr ""
@@ -11051,62 +11078,66 @@ msgstr ""
msgid "No pricing available"
msgstr ""
-#: templates/js/translated/bom.js:1182 templates/js/translated/build.js:2596
+#: templates/js/translated/bom.js:1184 templates/js/translated/build.js:2622
+msgid "External stock"
+msgstr ""
+
+#: templates/js/translated/bom.js:1188 templates/js/translated/build.js:2596
#: templates/js/translated/sales_order.js:1910
msgid "No Stock Available"
msgstr ""
-#: templates/js/translated/bom.js:1187 templates/js/translated/build.js:2600
+#: templates/js/translated/bom.js:1193 templates/js/translated/build.js:2600
msgid "Includes variant and substitute stock"
msgstr ""
-#: templates/js/translated/bom.js:1189 templates/js/translated/build.js:2602
+#: templates/js/translated/bom.js:1195 templates/js/translated/build.js:2602
#: templates/js/translated/part.js:1256
#: templates/js/translated/sales_order.js:1907
msgid "Includes variant stock"
msgstr ""
-#: templates/js/translated/bom.js:1191 templates/js/translated/build.js:2604
+#: templates/js/translated/bom.js:1197 templates/js/translated/build.js:2604
msgid "Includes substitute stock"
msgstr ""
-#: templates/js/translated/bom.js:1219 templates/js/translated/build.js:2587
+#: templates/js/translated/bom.js:1225 templates/js/translated/build.js:2587
msgid "Consumable item"
msgstr ""
-#: templates/js/translated/bom.js:1279
+#: templates/js/translated/bom.js:1285
msgid "Validate BOM Item"
msgstr ""
-#: templates/js/translated/bom.js:1281
+#: templates/js/translated/bom.js:1287
msgid "This line has been validated"
msgstr ""
-#: templates/js/translated/bom.js:1283
+#: templates/js/translated/bom.js:1289
msgid "Edit substitute parts"
msgstr ""
-#: templates/js/translated/bom.js:1285 templates/js/translated/bom.js:1480
+#: templates/js/translated/bom.js:1291 templates/js/translated/bom.js:1486
msgid "Edit BOM Item"
msgstr ""
-#: templates/js/translated/bom.js:1287
+#: templates/js/translated/bom.js:1293
msgid "Delete BOM Item"
msgstr ""
-#: templates/js/translated/bom.js:1307
+#: templates/js/translated/bom.js:1313
msgid "View BOM"
msgstr ""
-#: templates/js/translated/bom.js:1391
+#: templates/js/translated/bom.js:1397
msgid "No BOM items found"
msgstr ""
-#: templates/js/translated/bom.js:1651 templates/js/translated/build.js:2486
+#: templates/js/translated/bom.js:1657 templates/js/translated/build.js:2486
msgid "Required Part"
msgstr ""
-#: templates/js/translated/bom.js:1677
+#: templates/js/translated/bom.js:1683
msgid "Inherited from parent BOM"
msgstr ""
@@ -11449,29 +11480,29 @@ msgstr ""
msgid "Sufficient stock available"
msgstr ""
-#: templates/js/translated/build.js:2643
+#: templates/js/translated/build.js:2647
msgid "Consumable Item"
msgstr ""
-#: templates/js/translated/build.js:2648
+#: templates/js/translated/build.js:2652
msgid "Tracked item"
msgstr ""
-#: templates/js/translated/build.js:2655
+#: templates/js/translated/build.js:2659
#: templates/js/translated/sales_order.js:2016
msgid "Build stock"
msgstr ""
-#: templates/js/translated/build.js:2660 templates/js/translated/stock.js:1829
+#: templates/js/translated/build.js:2664 templates/js/translated/stock.js:1829
msgid "Order stock"
msgstr ""
-#: templates/js/translated/build.js:2664
+#: templates/js/translated/build.js:2668
#: templates/js/translated/sales_order.js:2010
msgid "Allocate stock"
msgstr ""
-#: templates/js/translated/build.js:2668
+#: templates/js/translated/build.js:2672
msgid "Remove stock allocation"
msgstr ""
@@ -12313,64 +12344,64 @@ msgstr ""
msgid "Subscribed category"
msgstr ""
-#: templates/js/translated/part.js:2855
+#: templates/js/translated/part.js:2864
msgid "No test templates matching query"
msgstr ""
-#: templates/js/translated/part.js:2877 templates/js/translated/search.js:342
+#: templates/js/translated/part.js:2886 templates/js/translated/search.js:342
msgid "results"
msgstr ""
-#: templates/js/translated/part.js:2927 templates/js/translated/stock.js:1446
+#: templates/js/translated/part.js:2936 templates/js/translated/stock.js:1446
msgid "Edit test result"
msgstr ""
-#: templates/js/translated/part.js:2928 templates/js/translated/stock.js:1447
+#: templates/js/translated/part.js:2937 templates/js/translated/stock.js:1447
#: templates/js/translated/stock.js:1692
msgid "Delete test result"
msgstr ""
-#: templates/js/translated/part.js:2932
+#: templates/js/translated/part.js:2941
msgid "This test is defined for a parent part"
msgstr ""
-#: templates/js/translated/part.js:2948
+#: templates/js/translated/part.js:2957
msgid "Edit Test Result Template"
msgstr ""
-#: templates/js/translated/part.js:2962
+#: templates/js/translated/part.js:2971
msgid "Delete Test Result Template"
msgstr ""
-#: templates/js/translated/part.js:3041 templates/js/translated/part.js:3042
+#: templates/js/translated/part.js:3050 templates/js/translated/part.js:3051
msgid "No date specified"
msgstr ""
-#: templates/js/translated/part.js:3044
+#: templates/js/translated/part.js:3053
msgid "Specified date is in the past"
msgstr ""
-#: templates/js/translated/part.js:3050
+#: templates/js/translated/part.js:3059
msgid "Speculative"
msgstr ""
-#: templates/js/translated/part.js:3100
+#: templates/js/translated/part.js:3109
msgid "No scheduling information available for this part"
msgstr ""
-#: templates/js/translated/part.js:3106
+#: templates/js/translated/part.js:3115
msgid "Error fetching scheduling information for this part"
msgstr ""
-#: templates/js/translated/part.js:3202
+#: templates/js/translated/part.js:3211
msgid "Scheduled Stock Quantities"
msgstr ""
-#: templates/js/translated/part.js:3218
+#: templates/js/translated/part.js:3227
msgid "Maximum Quantity"
msgstr ""
-#: templates/js/translated/part.js:3263
+#: templates/js/translated/part.js:3272
msgid "Minimum Stock Level"
msgstr ""
@@ -14052,4 +14083,3 @@ msgstr ""
#: users/models.py:413
msgid "Permission to delete items"
msgstr ""
-
diff --git a/InvenTree/locale/sv/LC_MESSAGES/django.po b/InvenTree/locale/sv/LC_MESSAGES/django.po
index c82eea9991..1a63e8e1a9 100644
--- a/InvenTree/locale/sv/LC_MESSAGES/django.po
+++ b/InvenTree/locale/sv/LC_MESSAGES/django.po
@@ -2,7 +2,7 @@ msgid ""
msgstr ""
"Project-Id-Version: inventree\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2024-02-28 04:05+0000\n"
+"POT-Creation-Date: 2024-03-05 00:41+0000\n"
"PO-Revision-Date: 2024-02-28 07:23\n"
"Last-Translator: \n"
"Language-Team: Swedish\n"
@@ -66,9 +66,9 @@ msgstr "Ange datum"
#: report/templates/report/inventree_build_order_base.html:172
#: stock/admin.py:226 stock/models.py:2335 stock/models.py:2451
#: stock/serializers.py:479 stock/serializers.py:632 stock/serializers.py:728
-#: stock/serializers.py:778 stock/serializers.py:1081 stock/serializers.py:1170
-#: stock/serializers.py:1335 stock/templates/stock/stock_sidebar.html:25
-#: templates/js/translated/barcode.js:143 templates/js/translated/bom.js:1259
+#: stock/serializers.py:778 stock/serializers.py:1087 stock/serializers.py:1176
+#: stock/serializers.py:1341 stock/templates/stock/stock_sidebar.html:25
+#: templates/js/translated/barcode.js:143 templates/js/translated/bom.js:1265
#: templates/js/translated/company.js:1674 templates/js/translated/order.js:347
#: templates/js/translated/part.js:1080
#: templates/js/translated/purchase_order.js:2201
@@ -523,7 +523,7 @@ msgstr "Namn"
#: templates/js/translated/order.js:298 templates/js/translated/part.js:1238
#: templates/js/translated/part.js:1483 templates/js/translated/part.js:1621
#: templates/js/translated/part.js:1958 templates/js/translated/part.js:2355
-#: templates/js/translated/part.js:2785 templates/js/translated/part.js:2887
+#: templates/js/translated/part.js:2785 templates/js/translated/part.js:2896
#: templates/js/translated/plugin.js:80
#: templates/js/translated/purchase_order.js:1707
#: templates/js/translated/purchase_order.js:1850
@@ -678,7 +678,7 @@ msgstr "URL för fjärrbildsfil"
msgid "Downloading images from remote URL is not enabled"
msgstr "Nedladdning av bilder från fjärr-URL är inte aktiverad"
-#: InvenTree/status.py:66 part/serializers.py:1120
+#: InvenTree/status.py:66 part/serializers.py:1138
msgid "Background worker check failed"
msgstr "Kontroll av bakgrundsarbetare misslyckades"
@@ -960,7 +960,7 @@ msgid "Tracked"
msgstr ""
#: build/api.py:285 part/admin.py:144 templates/js/translated/build.js:1741
-#: templates/js/translated/build.js:2626
+#: templates/js/translated/build.js:2630
#: templates/js/translated/sales_order.js:1929
#: templates/js/translated/table_filters.js:571
msgid "Allocated"
@@ -1044,11 +1044,11 @@ msgstr "Byggorder till vilken detta bygge är tilldelad"
#: build/models.py:199 build/templates/build/build_base.html:97
#: build/templates/build/detail.html:29 company/models.py:1044
#: order/models.py:1389 order/models.py:1532 order/models.py:1533
-#: part/api.py:1528 part/models.py:389 part/models.py:3003 part/models.py:3147
-#: part/models.py:3291 part/models.py:3314 part/models.py:3335
-#: part/models.py:3357 part/models.py:3458 part/models.py:3754
-#: part/models.py:3885 part/models.py:3978 part/models.py:4339
-#: part/serializers.py:1066 part/serializers.py:1631
+#: part/api.py:1528 part/api.py:1820 part/models.py:389 part/models.py:3003
+#: part/models.py:3147 part/models.py:3291 part/models.py:3314
+#: part/models.py:3335 part/models.py:3357 part/models.py:3458
+#: part/models.py:3754 part/models.py:3885 part/models.py:3978
+#: part/models.py:4339 part/serializers.py:1084 part/serializers.py:1659
#: part/templates/part/part_app_base.html:8
#: part/templates/part/part_pricing.html:12
#: part/templates/part/upload_bom.html:52
@@ -1147,7 +1147,7 @@ msgid "Build status code"
msgstr "Bygg statuskod"
#: build/models.py:264 build/serializers.py:280 order/serializers.py:549
-#: stock/models.py:826 stock/serializers.py:1300
+#: stock/models.py:826 stock/serializers.py:1306
#: templates/js/translated/purchase_order.js:1129
msgid "Batch Code"
msgstr "Batchkod"
@@ -1242,48 +1242,48 @@ msgstr "Projektkod"
msgid "Project code for this build order"
msgstr ""
-#: build/models.py:559
+#: build/models.py:575
#, python-brace-format
msgid "Build order {build} has been completed"
msgstr "Byggorder {build} har slutförts"
-#: build/models.py:565
+#: build/models.py:581
msgid "A build order has been completed"
msgstr "En byggorder har slutförts"
-#: build/models.py:783 build/models.py:858
+#: build/models.py:799 build/models.py:874
msgid "No build output specified"
msgstr "Ingen byggutgång angiven"
-#: build/models.py:786
+#: build/models.py:802
msgid "Build output is already completed"
msgstr "Byggutgång är redan slutförd"
-#: build/models.py:789
+#: build/models.py:805
msgid "Build output does not match Build Order"
msgstr "Byggutgång matchar inte bygg order"
-#: build/models.py:862 build/serializers.py:223 build/serializers.py:262
+#: build/models.py:878 build/serializers.py:223 build/serializers.py:262
#: build/serializers.py:831 order/models.py:526 order/serializers.py:401
-#: order/serializers.py:544 part/serializers.py:1423 part/serializers.py:1789
+#: order/serializers.py:544 part/serializers.py:1442 part/serializers.py:1817
#: stock/models.py:665 stock/models.py:1477 stock/serializers.py:450
msgid "Quantity must be greater than zero"
msgstr ""
-#: build/models.py:867 build/serializers.py:228
+#: build/models.py:883 build/serializers.py:228
msgid "Quantity cannot be greater than the output quantity"
msgstr ""
-#: build/models.py:924 build/serializers.py:533
+#: build/models.py:940 build/serializers.py:533
#, python-brace-format
msgid "Build output {serial} has not passed all required tests"
msgstr ""
-#: build/models.py:1286
+#: build/models.py:1302
msgid "Build object"
msgstr ""
-#: build/models.py:1300 build/models.py:1558 build/serializers.py:210
+#: build/models.py:1316 build/models.py:1574 build/serializers.py:210
#: build/serializers.py:247 build/templates/build/build_base.html:102
#: build/templates/build/detail.html:34 common/models.py:2432
#: order/models.py:1247 order/models.py:1902 order/serializers.py:1306
@@ -1310,7 +1310,7 @@ msgstr ""
#: templates/js/translated/company.js:1808
#: templates/js/translated/model_renderers.js:230
#: templates/js/translated/order.js:304 templates/js/translated/part.js:961
-#: templates/js/translated/part.js:1811 templates/js/translated/part.js:3332
+#: templates/js/translated/part.js:1811 templates/js/translated/part.js:3341
#: templates/js/translated/pricing.js:381
#: templates/js/translated/pricing.js:474
#: templates/js/translated/pricing.js:522
@@ -1330,38 +1330,38 @@ msgstr ""
msgid "Quantity"
msgstr "Antal"
-#: build/models.py:1301
+#: build/models.py:1317
msgid "Required quantity for build order"
msgstr ""
-#: build/models.py:1381
+#: build/models.py:1397
msgid "Build item must specify a build output, as master part is marked as trackable"
msgstr "Byggobjekt måste ange en byggutgång, eftersom huvuddelen är markerad som spårbar"
-#: build/models.py:1390
+#: build/models.py:1406
#, python-brace-format
msgid "Allocated quantity ({q}) must not exceed available stock quantity ({a})"
msgstr "Tilldelad kvantitet ({q}) får inte överstiga tillgängligt lagersaldo ({a})"
-#: build/models.py:1400 order/models.py:1853
+#: build/models.py:1416 order/models.py:1853
msgid "Stock item is over-allocated"
msgstr "Lagerposten är överallokerad"
-#: build/models.py:1406 order/models.py:1856
+#: build/models.py:1422 order/models.py:1856
msgid "Allocation quantity must be greater than zero"
msgstr "Allokeringsmängden måste vara större än noll"
-#: build/models.py:1412
+#: build/models.py:1428
msgid "Quantity must be 1 for serialized stock"
msgstr "Antal måste vara 1 för serialiserat lager"
-#: build/models.py:1473
+#: build/models.py:1489
msgid "Selected stock item does not match BOM line"
msgstr ""
-#: build/models.py:1545 build/serializers.py:811 order/serializers.py:1150
-#: order/serializers.py:1171 stock/serializers.py:544 stock/serializers.py:1019
-#: stock/serializers.py:1131 stock/templates/stock/item_base.html:10
+#: build/models.py:1561 build/serializers.py:811 order/serializers.py:1150
+#: order/serializers.py:1171 stock/serializers.py:544 stock/serializers.py:1025
+#: stock/serializers.py:1137 stock/templates/stock/item_base.html:10
#: stock/templates/stock/item_base.html:23
#: stock/templates/stock/item_base.html:194
#: templates/js/translated/build.js:1742
@@ -1376,19 +1376,19 @@ msgstr ""
msgid "Stock Item"
msgstr "Artikel i lager"
-#: build/models.py:1546
+#: build/models.py:1562
msgid "Source stock item"
msgstr "Källa lagervara"
-#: build/models.py:1559
+#: build/models.py:1575
msgid "Stock quantity to allocate to build"
msgstr "Lagersaldo att allokera för att bygga"
-#: build/models.py:1567
+#: build/models.py:1583
msgid "Install into"
msgstr "Installera till"
-#: build/models.py:1568
+#: build/models.py:1584
msgid "Destination stock item"
msgstr "Destination lagervara"
@@ -1452,9 +1452,9 @@ msgid "A list of build outputs must be provided"
msgstr ""
#: build/serializers.py:426 build/serializers.py:498 order/serializers.py:533
-#: order/serializers.py:641 order/serializers.py:1646 part/serializers.py:1086
+#: order/serializers.py:641 order/serializers.py:1646 part/serializers.py:1104
#: stock/serializers.py:472 stock/serializers.py:627 stock/serializers.py:723
-#: stock/serializers.py:1163 stock/serializers.py:1419
+#: stock/serializers.py:1169 stock/serializers.py:1425
#: stock/templates/stock/item_base.html:394
#: templates/js/translated/barcode.js:547
#: templates/js/translated/barcode.js:795 templates/js/translated/build.js:999
@@ -1494,7 +1494,7 @@ msgstr ""
#: build/serializers.py:505 build/templates/build/build_base.html:151
#: build/templates/build/detail.html:62 order/models.py:910
#: order/models.py:2005 order/serializers.py:565 stock/admin.py:165
-#: stock/serializers.py:774 stock/serializers.py:1307
+#: stock/serializers.py:774 stock/serializers.py:1313
#: stock/templates/stock/item_base.html:427
#: templates/js/translated/barcode.js:252 templates/js/translated/build.js:2189
#: templates/js/translated/purchase_order.js:1308
@@ -1602,7 +1602,7 @@ msgstr ""
msgid "bom_item.part must point to the same part as the build order"
msgstr ""
-#: build/serializers.py:817 stock/serializers.py:1032
+#: build/serializers.py:817 stock/serializers.py:1038
msgid "Item must be in stock"
msgstr ""
@@ -1659,44 +1659,45 @@ msgstr ""
msgid "Allocate optional BOM items to build order"
msgstr ""
-#: build/serializers.py:1096 part/models.py:3895 part/models.py:4331
+#: build/serializers.py:1097 part/models.py:3895 part/models.py:4331
#: stock/api.py:745
msgid "BOM Item"
msgstr ""
-#: build/serializers.py:1105 templates/js/translated/index.js:130
+#: build/serializers.py:1106 templates/js/translated/index.js:130
msgid "Allocated Stock"
msgstr ""
-#: build/serializers.py:1110 part/admin.py:132 part/bom.py:173
-#: part/serializers.py:1441 part/templates/part/part_base.html:210
-#: templates/js/translated/bom.js:1202 templates/js/translated/build.js:2614
-#: templates/js/translated/part.js:709 templates/js/translated/part.js:2148
+#: build/serializers.py:1111 part/admin.py:132 part/bom.py:173
+#: part/serializers.py:798 part/serializers.py:1460
+#: part/templates/part/part_base.html:210 templates/js/translated/bom.js:1208
+#: templates/js/translated/build.js:2614 templates/js/translated/part.js:709
+#: templates/js/translated/part.js:2148
#: templates/js/translated/table_filters.js:170
msgid "On Order"
msgstr ""
-#: build/serializers.py:1115 part/serializers.py:1443
+#: build/serializers.py:1116 part/serializers.py:1462
#: templates/js/translated/build.js:2618
#: templates/js/translated/table_filters.js:360
msgid "In Production"
msgstr ""
-#: build/serializers.py:1120 part/bom.py:172 part/serializers.py:1454
+#: build/serializers.py:1121 part/bom.py:172 part/serializers.py:1473
#: part/templates/part/part_base.html:192
#: templates/js/translated/sales_order.js:1893
msgid "Available Stock"
msgstr ""
-#: build/tasks.py:149
+#: build/tasks.py:171
msgid "Stock required for build order"
msgstr ""
-#: build/tasks.py:166
+#: build/tasks.py:188
msgid "Overdue Build Order"
msgstr ""
-#: build/tasks.py:171
+#: build/tasks.py:193
#, python-brace-format
msgid "Build order {bo} is now overdue"
msgstr ""
@@ -1990,27 +1991,31 @@ msgstr "Beställ obligatoriska delar"
msgid "Order Parts"
msgstr "Beställ delar"
-#: build/templates/build/detail.html:210
-msgid "Incomplete Build Outputs"
-msgstr ""
-
-#: build/templates/build/detail.html:214
-msgid "Create new build output"
+#: build/templates/build/detail.html:205
+msgid "Available stock has been filtered based on specified source location for this build order"
msgstr ""
#: build/templates/build/detail.html:215
+msgid "Incomplete Build Outputs"
+msgstr ""
+
+#: build/templates/build/detail.html:219
+msgid "Create new build output"
+msgstr ""
+
+#: build/templates/build/detail.html:220
msgid "New Build Output"
msgstr ""
-#: build/templates/build/detail.html:232 build/templates/build/sidebar.html:15
+#: build/templates/build/detail.html:237 build/templates/build/sidebar.html:15
msgid "Consumed Stock"
msgstr ""
-#: build/templates/build/detail.html:244
+#: build/templates/build/detail.html:249
msgid "Completed Build Outputs"
msgstr ""
-#: build/templates/build/detail.html:256 build/templates/build/sidebar.html:19
+#: build/templates/build/detail.html:261 build/templates/build/sidebar.html:19
#: company/templates/company/detail.html:229
#: company/templates/company/manufacturer_part.html:141
#: company/templates/company/manufacturer_part_sidebar.html:9
@@ -2026,15 +2031,15 @@ msgstr ""
msgid "Attachments"
msgstr "Bilagor"
-#: build/templates/build/detail.html:271
+#: build/templates/build/detail.html:276
msgid "Build Notes"
msgstr "Bygganteckningar"
-#: build/templates/build/detail.html:426
+#: build/templates/build/detail.html:434
msgid "Allocation Complete"
msgstr ""
-#: build/templates/build/detail.html:427
+#: build/templates/build/detail.html:435
msgid "All lines have been fully allocated"
msgstr ""
@@ -2436,7 +2441,7 @@ msgid "Parts are templates by default"
msgstr ""
#: common/models.py:1456 part/admin.py:91 part/admin.py:431 part/models.py:1015
-#: templates/js/translated/bom.js:1633
+#: templates/js/translated/bom.js:1639
#: templates/js/translated/table_filters.js:330
#: templates/js/translated/table_filters.js:721
msgid "Assembly"
@@ -3495,7 +3500,7 @@ msgstr ""
msgid "Price break quantity"
msgstr ""
-#: common/models.py:2440 company/serializers.py:484 order/admin.py:42
+#: common/models.py:2440 company/serializers.py:486 order/admin.py:42
#: order/models.py:1321 order/models.py:2226
#: templates/js/translated/company.js:1813 templates/js/translated/part.js:1885
#: templates/js/translated/pricing.js:621
@@ -3972,7 +3977,7 @@ msgstr ""
#: company/models.py:495 company/templates/company/company_base.html:76
#: company/templates/company/manufacturer_part.html:90
-#: company/templates/company/supplier_part.html:145 part/serializers.py:497
+#: company/templates/company/supplier_part.html:145 part/serializers.py:505
#: stock/templates/stock/item_base.html:207
#: templates/js/translated/company.js:506
#: templates/js/translated/company.js:1108
@@ -3987,7 +3992,7 @@ msgid "Select manufacturer"
msgstr ""
#: company/models.py:502 company/templates/company/manufacturer_part.html:101
-#: company/templates/company/supplier_part.html:153 part/serializers.py:507
+#: company/templates/company/supplier_part.html:153 part/serializers.py:515
#: templates/js/translated/company.js:351
#: templates/js/translated/company.js:1107
#: templates/js/translated/company.js:1302
@@ -4059,7 +4064,7 @@ msgstr ""
#: company/models.py:795 company/templates/company/company_base.html:81
#: company/templates/company/supplier_part.html:129 order/models.py:453
#: order/templates/order/order_base.html:136 part/bom.py:272 part/bom.py:310
-#: part/serializers.py:481 plugin/builtin/suppliers/digikey.py:25
+#: part/serializers.py:489 plugin/builtin/suppliers/digikey.py:25
#: plugin/builtin/suppliers/lcsc.py:26 plugin/builtin/suppliers/mouser.py:24
#: plugin/builtin/suppliers/tme.py:26 stock/templates/stock/item_base.html:224
#: templates/email/overdue_purchase_order.html:16
@@ -4076,7 +4081,7 @@ msgstr "Leverantör"
msgid "Select supplier"
msgstr "Välj leverantör"
-#: company/models.py:802 part/serializers.py:492
+#: company/models.py:802 part/serializers.py:500
msgid "Supplier stock keeping unit"
msgstr ""
@@ -4112,7 +4117,7 @@ msgid "Minimum charge (e.g. stocking fee)"
msgstr ""
#: company/models.py:851 company/templates/company/supplier_part.html:160
-#: stock/admin.py:224 stock/models.py:785 stock/serializers.py:1317
+#: stock/admin.py:224 stock/models.py:785 stock/serializers.py:1323
#: stock/templates/stock/item_base.html:240
#: templates/js/translated/company.js:1636
#: templates/js/translated/stock.js:2387
@@ -4157,7 +4162,7 @@ msgstr ""
msgid "Date of last update of availability data"
msgstr ""
-#: company/serializers.py:153
+#: company/serializers.py:155
msgid "Default currency used for this supplier"
msgstr ""
@@ -4218,7 +4223,7 @@ msgstr "Radera bild"
#: company/templates/company/company_base.html:86 order/models.py:898
#: order/models.py:1993 order/templates/order/return_order_base.html:131
#: order/templates/order/sales_order_base.html:144 stock/models.py:807
-#: stock/models.py:808 stock/serializers.py:1067
+#: stock/models.py:808 stock/serializers.py:1073
#: stock/templates/stock/item_base.html:405
#: templates/email/overdue_sales_order.html:16
#: templates/js/translated/company.js:502
@@ -4429,8 +4434,9 @@ msgstr ""
#: company/templates/company/manufacturer_part.html:119
#: company/templates/company/supplier_part.html:15 company/views.py:31
-#: part/admin.py:122 part/templates/part/part_sidebar.html:33
-#: templates/InvenTree/search.html:190 templates/navbar.html:48
+#: part/admin.py:122 part/serializers.py:802
+#: part/templates/part/part_sidebar.html:33 templates/InvenTree/search.html:190
+#: templates/navbar.html:48
msgid "Suppliers"
msgstr "Leverantörer"
@@ -4528,7 +4534,7 @@ msgid "No supplier information available"
msgstr ""
#: company/templates/company/supplier_part.html:139 part/bom.py:279
-#: part/bom.py:311 part/serializers.py:491
+#: part/bom.py:311 part/serializers.py:499
#: templates/js/translated/company.js:349 templates/js/translated/part.js:1786
#: templates/js/translated/pricing.js:510
#: templates/js/translated/purchase_order.js:1851
@@ -4577,10 +4583,12 @@ msgstr ""
msgid "Update Part Availability"
msgstr ""
-#: company/templates/company/supplier_part_sidebar.html:5 part/stocktake.py:223
+#: company/templates/company/supplier_part_sidebar.html:5
+#: part/serializers.py:801 part/stocktake.py:223
#: part/templates/part/category.html:183
#: part/templates/part/category_sidebar.html:17 stock/admin.py:69
-#: stock/serializers.py:760 stock/templates/stock/location.html:170
+#: stock/serializers.py:760 stock/serializers.py:924
+#: stock/templates/stock/location.html:170
#: stock/templates/stock/location.html:184
#: stock/templates/stock/location.html:196
#: stock/templates/stock/location_sidebar.html:7
@@ -4640,7 +4648,7 @@ msgid "Label template file"
msgstr ""
#: label/models.py:143 part/models.py:3484 report/models.py:322
-#: templates/js/translated/part.js:2891
+#: templates/js/translated/part.js:2900
#: templates/js/translated/table_filters.js:481
msgid "Enabled"
msgstr ""
@@ -5733,7 +5741,7 @@ msgid "Pending Shipments"
msgstr ""
#: order/templates/order/sales_order_detail.html:71
-#: templates/js/translated/bom.js:1271 templates/js/translated/filters.js:296
+#: templates/js/translated/bom.js:1277 templates/js/translated/filters.js:296
msgid "Actions"
msgstr ""
@@ -5861,10 +5869,10 @@ msgstr ""
msgid "Category Path"
msgstr ""
-#: part/admin.py:323 part/models.py:390 part/serializers.py:259
-#: part/serializers.py:373 part/templates/part/cat_link.html:3
-#: part/templates/part/category.html:23 part/templates/part/category.html:141
-#: part/templates/part/category.html:161
+#: part/admin.py:323 part/models.py:390 part/serializers.py:112
+#: part/serializers.py:265 part/serializers.py:381
+#: part/templates/part/cat_link.html:3 part/templates/part/category.html:23
+#: part/templates/part/category.html:141 part/templates/part/category.html:161
#: part/templates/part/category_sidebar.html:9
#: templates/InvenTree/index.html:36 templates/InvenTree/search.html:84
#: templates/InvenTree/settings/sidebar.html:47
@@ -5889,13 +5897,13 @@ msgstr ""
msgid "Part IPN"
msgstr ""
-#: part/admin.py:421 part/serializers.py:1220
+#: part/admin.py:421 part/serializers.py:1238
#: templates/js/translated/pricing.js:358
#: templates/js/translated/pricing.js:1024
msgid "Minimum Price"
msgstr ""
-#: part/admin.py:426 part/serializers.py:1235
+#: part/admin.py:426 part/serializers.py:1253
#: templates/js/translated/pricing.js:353
#: templates/js/translated/pricing.js:1032
msgid "Maximum Price"
@@ -5974,7 +5982,7 @@ msgid "This option must be selected"
msgstr ""
#: part/api.py:1541 part/models.py:895 part/models.py:3385 part/models.py:3831
-#: part/serializers.py:388 part/serializers.py:1076
+#: part/serializers.py:396 part/serializers.py:1094
#: part/templates/part/part_base.html:260 stock/api.py:733
#: templates/InvenTree/settings/settings_staff_js.html:300
#: templates/js/translated/notification.js:60
@@ -5982,12 +5990,17 @@ msgstr ""
msgid "Category"
msgstr "Kategori"
+#: part/api.py:1828
+msgid "Uses"
+msgstr ""
+
#: part/bom.py:170 part/models.py:100 part/models.py:938
#: part/templates/part/category.html:116 part/templates/part/part_base.html:367
msgid "Default Location"
msgstr ""
-#: part/bom.py:171 templates/email/low_stock_notification.html:16
+#: part/bom.py:171 part/serializers.py:803
+#: templates/email/low_stock_notification.html:16
msgid "Total Stock"
msgstr ""
@@ -6010,7 +6023,8 @@ msgstr ""
msgid "Default location for parts in this category"
msgstr ""
-#: part/models.py:106 stock/models.py:165 templates/js/translated/stock.js:2736
+#: part/models.py:106 stock/models.py:165 templates/js/translated/part.js:2810
+#: templates/js/translated/stock.js:2736
#: templates/js/translated/table_filters.js:239
#: templates/js/translated/table_filters.js:283
msgid "Structural"
@@ -6418,7 +6432,7 @@ msgstr ""
msgid "Test with this name already exists for this part"
msgstr ""
-#: part/models.py:3464 templates/js/translated/part.js:2870
+#: part/models.py:3464 templates/js/translated/part.js:2879
msgid "Test Name"
msgstr ""
@@ -6446,7 +6460,7 @@ msgstr ""
msgid "Is this test enabled?"
msgstr ""
-#: part/models.py:3489 templates/js/translated/part.js:2899
+#: part/models.py:3489 templates/js/translated/part.js:2908
#: templates/js/translated/table_filters.js:477
msgid "Required"
msgstr ""
@@ -6455,7 +6469,7 @@ msgstr ""
msgid "Is this test required to pass?"
msgstr ""
-#: part/models.py:3495 templates/js/translated/part.js:2907
+#: part/models.py:3495 templates/js/translated/part.js:2916
msgid "Requires Value"
msgstr ""
@@ -6463,7 +6477,7 @@ msgstr ""
msgid "Does this test require a value when adding a test result?"
msgstr ""
-#: part/models.py:3501 templates/js/translated/part.js:2914
+#: part/models.py:3501 templates/js/translated/part.js:2923
msgid "Requires Attachment"
msgstr ""
@@ -6685,311 +6699,327 @@ msgstr ""
msgid "Duplicate relationship already exists"
msgstr ""
-#: part/serializers.py:128 part/templates/part/category.html:122
-#: part/templates/part/category.html:207
+#: part/serializers.py:114 part/serializers.py:134
+#: part/templates/part/category.html:122 part/templates/part/category.html:207
#: part/templates/part/category_sidebar.html:7
msgid "Subcategories"
msgstr "Underkategorier"
-#: part/serializers.py:172
+#: part/serializers.py:178
msgid "Results"
msgstr ""
-#: part/serializers.py:173
+#: part/serializers.py:179
msgid "Number of results recorded against this template"
msgstr ""
-#: part/serializers.py:197 part/serializers.py:215 stock/serializers.py:384
+#: part/serializers.py:203 part/serializers.py:221 stock/serializers.py:384
msgid "Purchase currency of this stock item"
msgstr ""
-#: part/serializers.py:260
+#: part/serializers.py:266
msgid "Number of parts using this template"
msgstr ""
-#: part/serializers.py:379
+#: part/serializers.py:387
msgid "No parts selected"
msgstr ""
-#: part/serializers.py:389
+#: part/serializers.py:397
msgid "Select category"
msgstr "Välj kategori"
-#: part/serializers.py:419
+#: part/serializers.py:427
msgid "Original Part"
msgstr ""
-#: part/serializers.py:420
+#: part/serializers.py:428
msgid "Select original part to duplicate"
msgstr ""
-#: part/serializers.py:425
+#: part/serializers.py:433
msgid "Copy Image"
msgstr ""
-#: part/serializers.py:426
+#: part/serializers.py:434
msgid "Copy image from original part"
msgstr ""
-#: part/serializers.py:432 part/templates/part/detail.html:277
+#: part/serializers.py:440 part/templates/part/detail.html:277
msgid "Copy BOM"
msgstr ""
-#: part/serializers.py:433
+#: part/serializers.py:441
msgid "Copy bill of materials from original part"
msgstr ""
-#: part/serializers.py:439
+#: part/serializers.py:447
msgid "Copy Parameters"
msgstr ""
-#: part/serializers.py:440
+#: part/serializers.py:448
msgid "Copy parameter data from original part"
msgstr ""
-#: part/serializers.py:446
+#: part/serializers.py:454
msgid "Copy Notes"
msgstr ""
-#: part/serializers.py:447
+#: part/serializers.py:455
msgid "Copy notes from original part"
msgstr ""
-#: part/serializers.py:460
+#: part/serializers.py:468
msgid "Initial Stock Quantity"
msgstr ""
-#: part/serializers.py:462
+#: part/serializers.py:470
msgid "Specify initial stock quantity for this Part. If quantity is zero, no stock is added."
msgstr ""
-#: part/serializers.py:469
+#: part/serializers.py:477
msgid "Initial Stock Location"
msgstr ""
-#: part/serializers.py:470
+#: part/serializers.py:478
msgid "Specify initial stock location for this Part"
msgstr ""
-#: part/serializers.py:482
+#: part/serializers.py:490
msgid "Select supplier (or leave blank to skip)"
msgstr ""
-#: part/serializers.py:498
+#: part/serializers.py:506
msgid "Select manufacturer (or leave blank to skip)"
msgstr ""
-#: part/serializers.py:508
+#: part/serializers.py:516
msgid "Manufacturer part number"
msgstr ""
-#: part/serializers.py:515
+#: part/serializers.py:523
msgid "Selected company is not a valid supplier"
msgstr ""
-#: part/serializers.py:524
+#: part/serializers.py:532
msgid "Selected company is not a valid manufacturer"
msgstr ""
-#: part/serializers.py:535
+#: part/serializers.py:543
msgid "Manufacturer part matching this MPN already exists"
msgstr ""
-#: part/serializers.py:542
+#: part/serializers.py:550
msgid "Supplier part matching this SKU already exists"
msgstr ""
-#: part/serializers.py:815 part/templates/part/copy_part.html:9
+#: part/serializers.py:804
+#, fuzzy
+#| msgid "External Link"
+msgid "External Stock"
+msgstr "Extern länk"
+
+#: part/serializers.py:806
+msgid "Unallocated Stock"
+msgstr ""
+
+#: part/serializers.py:808
+#, fuzzy
+#| msgid "In Stock"
+msgid "Variant Stock"
+msgstr "I lager"
+
+#: part/serializers.py:833 part/templates/part/copy_part.html:9
#: templates/js/translated/part.js:471
msgid "Duplicate Part"
msgstr ""
-#: part/serializers.py:816
+#: part/serializers.py:834
msgid "Copy initial data from another Part"
msgstr ""
-#: part/serializers.py:822 templates/js/translated/part.js:102
+#: part/serializers.py:840 templates/js/translated/part.js:102
msgid "Initial Stock"
msgstr ""
-#: part/serializers.py:823
+#: part/serializers.py:841
msgid "Create Part with initial stock quantity"
msgstr ""
-#: part/serializers.py:829
+#: part/serializers.py:847
msgid "Supplier Information"
msgstr ""
-#: part/serializers.py:830
+#: part/serializers.py:848
msgid "Add initial supplier information for this part"
msgstr ""
-#: part/serializers.py:838
+#: part/serializers.py:856
msgid "Copy Category Parameters"
msgstr ""
-#: part/serializers.py:839
+#: part/serializers.py:857
msgid "Copy parameter templates from selected part category"
msgstr ""
-#: part/serializers.py:844
+#: part/serializers.py:862
msgid "Existing Image"
msgstr ""
-#: part/serializers.py:845
+#: part/serializers.py:863
msgid "Filename of an existing part image"
msgstr ""
-#: part/serializers.py:862
+#: part/serializers.py:880
msgid "Image file does not exist"
msgstr ""
-#: part/serializers.py:1068
+#: part/serializers.py:1086
msgid "Limit stocktake report to a particular part, and any variant parts"
msgstr ""
-#: part/serializers.py:1078
+#: part/serializers.py:1096
msgid "Limit stocktake report to a particular part category, and any child categories"
msgstr ""
-#: part/serializers.py:1088
+#: part/serializers.py:1106
msgid "Limit stocktake report to a particular stock location, and any child locations"
msgstr ""
-#: part/serializers.py:1094
+#: part/serializers.py:1112
msgid "Exclude External Stock"
msgstr ""
-#: part/serializers.py:1095
+#: part/serializers.py:1113
msgid "Exclude stock items in external locations"
msgstr ""
-#: part/serializers.py:1100
+#: part/serializers.py:1118
msgid "Generate Report"
msgstr "Generera rapport"
-#: part/serializers.py:1101
+#: part/serializers.py:1119
msgid "Generate report file containing calculated stocktake data"
msgstr ""
-#: part/serializers.py:1106
+#: part/serializers.py:1124
msgid "Update Parts"
msgstr ""
-#: part/serializers.py:1107
+#: part/serializers.py:1125
msgid "Update specified parts with calculated stocktake data"
msgstr ""
-#: part/serializers.py:1115
+#: part/serializers.py:1133
msgid "Stocktake functionality is not enabled"
msgstr ""
-#: part/serializers.py:1221
+#: part/serializers.py:1239
msgid "Override calculated value for minimum price"
msgstr ""
-#: part/serializers.py:1228
+#: part/serializers.py:1246
msgid "Minimum price currency"
msgstr ""
-#: part/serializers.py:1236
+#: part/serializers.py:1254
msgid "Override calculated value for maximum price"
msgstr ""
-#: part/serializers.py:1243
+#: part/serializers.py:1261
msgid "Maximum price currency"
msgstr ""
-#: part/serializers.py:1272
+#: part/serializers.py:1290
msgid "Update"
msgstr ""
-#: part/serializers.py:1273
+#: part/serializers.py:1291
msgid "Update pricing for this part"
msgstr ""
-#: part/serializers.py:1296
+#: part/serializers.py:1314
#, python-brace-format
msgid "Could not convert from provided currencies to {default_currency}"
msgstr ""
-#: part/serializers.py:1303
+#: part/serializers.py:1321
msgid "Minimum price must not be greater than maximum price"
msgstr ""
-#: part/serializers.py:1306
+#: part/serializers.py:1324
msgid "Maximum price must not be less than minimum price"
msgstr ""
-#: part/serializers.py:1632
+#: part/serializers.py:1660
msgid "Select part to copy BOM from"
msgstr ""
-#: part/serializers.py:1640
+#: part/serializers.py:1668
msgid "Remove Existing Data"
msgstr ""
-#: part/serializers.py:1641
+#: part/serializers.py:1669
msgid "Remove existing BOM items before copying"
msgstr ""
-#: part/serializers.py:1646
+#: part/serializers.py:1674
msgid "Include Inherited"
msgstr ""
-#: part/serializers.py:1647
+#: part/serializers.py:1675
msgid "Include BOM items which are inherited from templated parts"
msgstr ""
-#: part/serializers.py:1652
+#: part/serializers.py:1680
msgid "Skip Invalid Rows"
msgstr ""
-#: part/serializers.py:1653
+#: part/serializers.py:1681
msgid "Enable this option to skip invalid rows"
msgstr ""
-#: part/serializers.py:1658
+#: part/serializers.py:1686
msgid "Copy Substitute Parts"
msgstr ""
-#: part/serializers.py:1659
+#: part/serializers.py:1687
msgid "Copy substitute parts when duplicate BOM items"
msgstr ""
-#: part/serializers.py:1693
+#: part/serializers.py:1721
msgid "Clear Existing BOM"
msgstr ""
-#: part/serializers.py:1694
+#: part/serializers.py:1722
msgid "Delete existing BOM items before uploading"
msgstr ""
-#: part/serializers.py:1724
+#: part/serializers.py:1752
msgid "No part column specified"
msgstr ""
-#: part/serializers.py:1768
+#: part/serializers.py:1796
msgid "Multiple matching parts found"
msgstr ""
-#: part/serializers.py:1771
+#: part/serializers.py:1799
msgid "No matching part found"
msgstr ""
-#: part/serializers.py:1774
+#: part/serializers.py:1802
msgid "Part is not designated as a component"
msgstr ""
-#: part/serializers.py:1783
+#: part/serializers.py:1811
msgid "Quantity not provided"
msgstr ""
-#: part/serializers.py:1791
+#: part/serializers.py:1819
msgid "Invalid quantity"
msgstr ""
-#: part/serializers.py:1812
+#: part/serializers.py:1840
msgid "At least one BOM item is required"
msgstr ""
@@ -7221,7 +7251,7 @@ msgid "Validate BOM"
msgstr ""
#: part/templates/part/detail.html:283 part/templates/part/detail.html:284
-#: templates/js/translated/bom.js:1314 templates/js/translated/bom.js:1315
+#: templates/js/translated/bom.js:1320 templates/js/translated/bom.js:1321
msgid "Add BOM Item"
msgstr ""
@@ -7405,7 +7435,7 @@ msgstr ""
msgid "Allocated to Sales Orders"
msgstr ""
-#: part/templates/part/part_base.html:235 templates/js/translated/bom.js:1213
+#: part/templates/part/part_base.html:235 templates/js/translated/bom.js:1219
msgid "Can Build"
msgstr ""
@@ -8784,7 +8814,7 @@ msgstr ""
msgid "Where is this stock item located?"
msgstr ""
-#: stock/models.py:786 stock/serializers.py:1318
+#: stock/models.py:786 stock/serializers.py:1324
msgid "Packaging this stock item is stored in"
msgstr ""
@@ -8796,7 +8826,7 @@ msgstr ""
msgid "Serial number for this item"
msgstr ""
-#: stock/models.py:830 stock/serializers.py:1301
+#: stock/models.py:830 stock/serializers.py:1307
msgid "Batch code for this stock item"
msgstr ""
@@ -8905,7 +8935,7 @@ msgstr ""
msgid "Serialized stock cannot be merged"
msgstr ""
-#: stock/models.py:1639 stock/serializers.py:1207
+#: stock/models.py:1639 stock/serializers.py:1213
msgid "Duplicate stock items"
msgstr ""
@@ -8986,7 +9016,7 @@ msgstr ""
msgid "Enter serial numbers for new items"
msgstr ""
-#: stock/serializers.py:473 stock/serializers.py:1164 stock/serializers.py:1420
+#: stock/serializers.py:473 stock/serializers.py:1170 stock/serializers.py:1426
msgid "Destination stock location"
msgstr ""
@@ -9059,77 +9089,78 @@ msgstr ""
msgid "No stock items selected"
msgstr ""
-#: stock/serializers.py:863 stock/templates/stock/location.html:165
+#: stock/serializers.py:863 stock/serializers.py:926
+#: stock/templates/stock/location.html:165
#: stock/templates/stock/location.html:213
#: stock/templates/stock/location_sidebar.html:5
msgid "Sublocations"
msgstr ""
-#: stock/serializers.py:1036
+#: stock/serializers.py:1042
msgid "Part must be salable"
msgstr ""
-#: stock/serializers.py:1040
+#: stock/serializers.py:1046
msgid "Item is allocated to a sales order"
msgstr ""
-#: stock/serializers.py:1044
+#: stock/serializers.py:1050
msgid "Item is allocated to a build order"
msgstr ""
-#: stock/serializers.py:1068
+#: stock/serializers.py:1074
msgid "Customer to assign stock items"
msgstr ""
-#: stock/serializers.py:1074
+#: stock/serializers.py:1080
msgid "Selected company is not a customer"
msgstr ""
-#: stock/serializers.py:1082
+#: stock/serializers.py:1088
msgid "Stock assignment notes"
msgstr ""
-#: stock/serializers.py:1092 stock/serializers.py:1346
+#: stock/serializers.py:1098 stock/serializers.py:1352
msgid "A list of stock items must be provided"
msgstr ""
-#: stock/serializers.py:1171
+#: stock/serializers.py:1177
msgid "Stock merging notes"
msgstr ""
-#: stock/serializers.py:1176
+#: stock/serializers.py:1182
msgid "Allow mismatched suppliers"
msgstr ""
-#: stock/serializers.py:1177
+#: stock/serializers.py:1183
msgid "Allow stock items with different supplier parts to be merged"
msgstr ""
-#: stock/serializers.py:1182
+#: stock/serializers.py:1188
msgid "Allow mismatched status"
msgstr ""
-#: stock/serializers.py:1183
+#: stock/serializers.py:1189
msgid "Allow stock items with different status codes to be merged"
msgstr ""
-#: stock/serializers.py:1193
+#: stock/serializers.py:1199
msgid "At least two stock items must be provided"
msgstr ""
-#: stock/serializers.py:1260
+#: stock/serializers.py:1266
msgid "No Change"
msgstr ""
-#: stock/serializers.py:1289
+#: stock/serializers.py:1295
msgid "StockItem primary key value"
msgstr ""
-#: stock/serializers.py:1308
+#: stock/serializers.py:1314
msgid "Stock item status code"
msgstr ""
-#: stock/serializers.py:1336
+#: stock/serializers.py:1342
msgid "Stock transaction notes"
msgstr ""
@@ -10662,7 +10693,7 @@ msgid "The following parts are low on required stock"
msgstr ""
#: templates/email/build_order_required_stock.html:18
-#: templates/js/translated/bom.js:1668 templates/js/translated/build.js:2557
+#: templates/js/translated/bom.js:1674 templates/js/translated/build.js:2557
msgid "Required Quantity"
msgstr ""
@@ -10676,7 +10707,7 @@ msgid "Click on the following link to view this part"
msgstr ""
#: templates/email/low_stock_notification.html:18
-#: templates/js/translated/part.js:3209
+#: templates/js/translated/part.js:3218
msgid "Minimum Quantity"
msgstr ""
@@ -11051,62 +11082,68 @@ msgstr ""
msgid "No pricing available"
msgstr ""
-#: templates/js/translated/bom.js:1182 templates/js/translated/build.js:2596
+#: templates/js/translated/bom.js:1184 templates/js/translated/build.js:2622
+#, fuzzy
+#| msgid "External Link"
+msgid "External stock"
+msgstr "Extern länk"
+
+#: templates/js/translated/bom.js:1188 templates/js/translated/build.js:2596
#: templates/js/translated/sales_order.js:1910
msgid "No Stock Available"
msgstr ""
-#: templates/js/translated/bom.js:1187 templates/js/translated/build.js:2600
+#: templates/js/translated/bom.js:1193 templates/js/translated/build.js:2600
msgid "Includes variant and substitute stock"
msgstr ""
-#: templates/js/translated/bom.js:1189 templates/js/translated/build.js:2602
+#: templates/js/translated/bom.js:1195 templates/js/translated/build.js:2602
#: templates/js/translated/part.js:1256
#: templates/js/translated/sales_order.js:1907
msgid "Includes variant stock"
msgstr ""
-#: templates/js/translated/bom.js:1191 templates/js/translated/build.js:2604
+#: templates/js/translated/bom.js:1197 templates/js/translated/build.js:2604
msgid "Includes substitute stock"
msgstr ""
-#: templates/js/translated/bom.js:1219 templates/js/translated/build.js:2587
+#: templates/js/translated/bom.js:1225 templates/js/translated/build.js:2587
msgid "Consumable item"
msgstr ""
-#: templates/js/translated/bom.js:1279
+#: templates/js/translated/bom.js:1285
msgid "Validate BOM Item"
msgstr ""
-#: templates/js/translated/bom.js:1281
+#: templates/js/translated/bom.js:1287
msgid "This line has been validated"
msgstr ""
-#: templates/js/translated/bom.js:1283
+#: templates/js/translated/bom.js:1289
msgid "Edit substitute parts"
msgstr ""
-#: templates/js/translated/bom.js:1285 templates/js/translated/bom.js:1480
+#: templates/js/translated/bom.js:1291 templates/js/translated/bom.js:1486
msgid "Edit BOM Item"
msgstr ""
-#: templates/js/translated/bom.js:1287
+#: templates/js/translated/bom.js:1293
msgid "Delete BOM Item"
msgstr ""
-#: templates/js/translated/bom.js:1307
+#: templates/js/translated/bom.js:1313
msgid "View BOM"
msgstr ""
-#: templates/js/translated/bom.js:1391
+#: templates/js/translated/bom.js:1397
msgid "No BOM items found"
msgstr ""
-#: templates/js/translated/bom.js:1651 templates/js/translated/build.js:2486
+#: templates/js/translated/bom.js:1657 templates/js/translated/build.js:2486
msgid "Required Part"
msgstr ""
-#: templates/js/translated/bom.js:1677
+#: templates/js/translated/bom.js:1683
msgid "Inherited from parent BOM"
msgstr ""
@@ -11449,29 +11486,29 @@ msgstr ""
msgid "Sufficient stock available"
msgstr ""
-#: templates/js/translated/build.js:2643
+#: templates/js/translated/build.js:2647
msgid "Consumable Item"
msgstr ""
-#: templates/js/translated/build.js:2648
+#: templates/js/translated/build.js:2652
msgid "Tracked item"
msgstr ""
-#: templates/js/translated/build.js:2655
+#: templates/js/translated/build.js:2659
#: templates/js/translated/sales_order.js:2016
msgid "Build stock"
msgstr ""
-#: templates/js/translated/build.js:2660 templates/js/translated/stock.js:1829
+#: templates/js/translated/build.js:2664 templates/js/translated/stock.js:1829
msgid "Order stock"
msgstr ""
-#: templates/js/translated/build.js:2664
+#: templates/js/translated/build.js:2668
#: templates/js/translated/sales_order.js:2010
msgid "Allocate stock"
msgstr ""
-#: templates/js/translated/build.js:2668
+#: templates/js/translated/build.js:2672
msgid "Remove stock allocation"
msgstr ""
@@ -12313,64 +12350,64 @@ msgstr ""
msgid "Subscribed category"
msgstr ""
-#: templates/js/translated/part.js:2855
+#: templates/js/translated/part.js:2864
msgid "No test templates matching query"
msgstr ""
-#: templates/js/translated/part.js:2877 templates/js/translated/search.js:342
+#: templates/js/translated/part.js:2886 templates/js/translated/search.js:342
msgid "results"
msgstr "resultat"
-#: templates/js/translated/part.js:2927 templates/js/translated/stock.js:1446
+#: templates/js/translated/part.js:2936 templates/js/translated/stock.js:1446
msgid "Edit test result"
msgstr ""
-#: templates/js/translated/part.js:2928 templates/js/translated/stock.js:1447
+#: templates/js/translated/part.js:2937 templates/js/translated/stock.js:1447
#: templates/js/translated/stock.js:1692
msgid "Delete test result"
msgstr ""
-#: templates/js/translated/part.js:2932
+#: templates/js/translated/part.js:2941
msgid "This test is defined for a parent part"
msgstr ""
-#: templates/js/translated/part.js:2948
+#: templates/js/translated/part.js:2957
msgid "Edit Test Result Template"
msgstr ""
-#: templates/js/translated/part.js:2962
+#: templates/js/translated/part.js:2971
msgid "Delete Test Result Template"
msgstr ""
-#: templates/js/translated/part.js:3041 templates/js/translated/part.js:3042
+#: templates/js/translated/part.js:3050 templates/js/translated/part.js:3051
msgid "No date specified"
msgstr ""
-#: templates/js/translated/part.js:3044
+#: templates/js/translated/part.js:3053
msgid "Specified date is in the past"
msgstr ""
-#: templates/js/translated/part.js:3050
+#: templates/js/translated/part.js:3059
msgid "Speculative"
msgstr ""
-#: templates/js/translated/part.js:3100
+#: templates/js/translated/part.js:3109
msgid "No scheduling information available for this part"
msgstr ""
-#: templates/js/translated/part.js:3106
+#: templates/js/translated/part.js:3115
msgid "Error fetching scheduling information for this part"
msgstr ""
-#: templates/js/translated/part.js:3202
+#: templates/js/translated/part.js:3211
msgid "Scheduled Stock Quantities"
msgstr ""
-#: templates/js/translated/part.js:3218
+#: templates/js/translated/part.js:3227
msgid "Maximum Quantity"
msgstr ""
-#: templates/js/translated/part.js:3263
+#: templates/js/translated/part.js:3272
msgid "Minimum Stock Level"
msgstr ""
@@ -14052,4 +14089,3 @@ msgstr ""
#: users/models.py:413
msgid "Permission to delete items"
msgstr ""
-
diff --git a/InvenTree/locale/th/LC_MESSAGES/django.po b/InvenTree/locale/th/LC_MESSAGES/django.po
index 1f7f53fc5f..f1c5fbb529 100644
--- a/InvenTree/locale/th/LC_MESSAGES/django.po
+++ b/InvenTree/locale/th/LC_MESSAGES/django.po
@@ -2,7 +2,7 @@ msgid ""
msgstr ""
"Project-Id-Version: inventree\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2024-02-28 04:05+0000\n"
+"POT-Creation-Date: 2024-03-05 00:41+0000\n"
"PO-Revision-Date: 2024-02-28 07:23\n"
"Last-Translator: \n"
"Language-Team: Thai\n"
@@ -66,9 +66,9 @@ msgstr "ป้อนวันที่"
#: report/templates/report/inventree_build_order_base.html:172
#: stock/admin.py:226 stock/models.py:2335 stock/models.py:2451
#: stock/serializers.py:479 stock/serializers.py:632 stock/serializers.py:728
-#: stock/serializers.py:778 stock/serializers.py:1081 stock/serializers.py:1170
-#: stock/serializers.py:1335 stock/templates/stock/stock_sidebar.html:25
-#: templates/js/translated/barcode.js:143 templates/js/translated/bom.js:1259
+#: stock/serializers.py:778 stock/serializers.py:1087 stock/serializers.py:1176
+#: stock/serializers.py:1341 stock/templates/stock/stock_sidebar.html:25
+#: templates/js/translated/barcode.js:143 templates/js/translated/bom.js:1265
#: templates/js/translated/company.js:1674 templates/js/translated/order.js:347
#: templates/js/translated/part.js:1080
#: templates/js/translated/purchase_order.js:2201
@@ -523,7 +523,7 @@ msgstr "ชื่อ"
#: templates/js/translated/order.js:298 templates/js/translated/part.js:1238
#: templates/js/translated/part.js:1483 templates/js/translated/part.js:1621
#: templates/js/translated/part.js:1958 templates/js/translated/part.js:2355
-#: templates/js/translated/part.js:2785 templates/js/translated/part.js:2887
+#: templates/js/translated/part.js:2785 templates/js/translated/part.js:2896
#: templates/js/translated/plugin.js:80
#: templates/js/translated/purchase_order.js:1707
#: templates/js/translated/purchase_order.js:1850
@@ -678,7 +678,7 @@ msgstr ""
msgid "Downloading images from remote URL is not enabled"
msgstr ""
-#: InvenTree/status.py:66 part/serializers.py:1120
+#: InvenTree/status.py:66 part/serializers.py:1138
msgid "Background worker check failed"
msgstr ""
@@ -960,7 +960,7 @@ msgid "Tracked"
msgstr ""
#: build/api.py:285 part/admin.py:144 templates/js/translated/build.js:1741
-#: templates/js/translated/build.js:2626
+#: templates/js/translated/build.js:2630
#: templates/js/translated/sales_order.js:1929
#: templates/js/translated/table_filters.js:571
msgid "Allocated"
@@ -1044,11 +1044,11 @@ msgstr ""
#: build/models.py:199 build/templates/build/build_base.html:97
#: build/templates/build/detail.html:29 company/models.py:1044
#: order/models.py:1389 order/models.py:1532 order/models.py:1533
-#: part/api.py:1528 part/models.py:389 part/models.py:3003 part/models.py:3147
-#: part/models.py:3291 part/models.py:3314 part/models.py:3335
-#: part/models.py:3357 part/models.py:3458 part/models.py:3754
-#: part/models.py:3885 part/models.py:3978 part/models.py:4339
-#: part/serializers.py:1066 part/serializers.py:1631
+#: part/api.py:1528 part/api.py:1820 part/models.py:389 part/models.py:3003
+#: part/models.py:3147 part/models.py:3291 part/models.py:3314
+#: part/models.py:3335 part/models.py:3357 part/models.py:3458
+#: part/models.py:3754 part/models.py:3885 part/models.py:3978
+#: part/models.py:4339 part/serializers.py:1084 part/serializers.py:1659
#: part/templates/part/part_app_base.html:8
#: part/templates/part/part_pricing.html:12
#: part/templates/part/upload_bom.html:52
@@ -1147,7 +1147,7 @@ msgid "Build status code"
msgstr ""
#: build/models.py:264 build/serializers.py:280 order/serializers.py:549
-#: stock/models.py:826 stock/serializers.py:1300
+#: stock/models.py:826 stock/serializers.py:1306
#: templates/js/translated/purchase_order.js:1129
msgid "Batch Code"
msgstr ""
@@ -1242,48 +1242,48 @@ msgstr ""
msgid "Project code for this build order"
msgstr ""
-#: build/models.py:559
+#: build/models.py:575
#, python-brace-format
msgid "Build order {build} has been completed"
msgstr ""
-#: build/models.py:565
+#: build/models.py:581
msgid "A build order has been completed"
msgstr ""
-#: build/models.py:783 build/models.py:858
+#: build/models.py:799 build/models.py:874
msgid "No build output specified"
msgstr ""
-#: build/models.py:786
+#: build/models.py:802
msgid "Build output is already completed"
msgstr ""
-#: build/models.py:789
+#: build/models.py:805
msgid "Build output does not match Build Order"
msgstr ""
-#: build/models.py:862 build/serializers.py:223 build/serializers.py:262
+#: build/models.py:878 build/serializers.py:223 build/serializers.py:262
#: build/serializers.py:831 order/models.py:526 order/serializers.py:401
-#: order/serializers.py:544 part/serializers.py:1423 part/serializers.py:1789
+#: order/serializers.py:544 part/serializers.py:1442 part/serializers.py:1817
#: stock/models.py:665 stock/models.py:1477 stock/serializers.py:450
msgid "Quantity must be greater than zero"
msgstr ""
-#: build/models.py:867 build/serializers.py:228
+#: build/models.py:883 build/serializers.py:228
msgid "Quantity cannot be greater than the output quantity"
msgstr ""
-#: build/models.py:924 build/serializers.py:533
+#: build/models.py:940 build/serializers.py:533
#, python-brace-format
msgid "Build output {serial} has not passed all required tests"
msgstr ""
-#: build/models.py:1286
+#: build/models.py:1302
msgid "Build object"
msgstr ""
-#: build/models.py:1300 build/models.py:1558 build/serializers.py:210
+#: build/models.py:1316 build/models.py:1574 build/serializers.py:210
#: build/serializers.py:247 build/templates/build/build_base.html:102
#: build/templates/build/detail.html:34 common/models.py:2432
#: order/models.py:1247 order/models.py:1902 order/serializers.py:1306
@@ -1310,7 +1310,7 @@ msgstr ""
#: templates/js/translated/company.js:1808
#: templates/js/translated/model_renderers.js:230
#: templates/js/translated/order.js:304 templates/js/translated/part.js:961
-#: templates/js/translated/part.js:1811 templates/js/translated/part.js:3332
+#: templates/js/translated/part.js:1811 templates/js/translated/part.js:3341
#: templates/js/translated/pricing.js:381
#: templates/js/translated/pricing.js:474
#: templates/js/translated/pricing.js:522
@@ -1330,38 +1330,38 @@ msgstr ""
msgid "Quantity"
msgstr ""
-#: build/models.py:1301
+#: build/models.py:1317
msgid "Required quantity for build order"
msgstr ""
-#: build/models.py:1381
+#: build/models.py:1397
msgid "Build item must specify a build output, as master part is marked as trackable"
msgstr ""
-#: build/models.py:1390
+#: build/models.py:1406
#, python-brace-format
msgid "Allocated quantity ({q}) must not exceed available stock quantity ({a})"
msgstr ""
-#: build/models.py:1400 order/models.py:1853
+#: build/models.py:1416 order/models.py:1853
msgid "Stock item is over-allocated"
msgstr ""
-#: build/models.py:1406 order/models.py:1856
+#: build/models.py:1422 order/models.py:1856
msgid "Allocation quantity must be greater than zero"
msgstr ""
-#: build/models.py:1412
+#: build/models.py:1428
msgid "Quantity must be 1 for serialized stock"
msgstr ""
-#: build/models.py:1473
+#: build/models.py:1489
msgid "Selected stock item does not match BOM line"
msgstr ""
-#: build/models.py:1545 build/serializers.py:811 order/serializers.py:1150
-#: order/serializers.py:1171 stock/serializers.py:544 stock/serializers.py:1019
-#: stock/serializers.py:1131 stock/templates/stock/item_base.html:10
+#: build/models.py:1561 build/serializers.py:811 order/serializers.py:1150
+#: order/serializers.py:1171 stock/serializers.py:544 stock/serializers.py:1025
+#: stock/serializers.py:1137 stock/templates/stock/item_base.html:10
#: stock/templates/stock/item_base.html:23
#: stock/templates/stock/item_base.html:194
#: templates/js/translated/build.js:1742
@@ -1376,19 +1376,19 @@ msgstr ""
msgid "Stock Item"
msgstr ""
-#: build/models.py:1546
+#: build/models.py:1562
msgid "Source stock item"
msgstr ""
-#: build/models.py:1559
+#: build/models.py:1575
msgid "Stock quantity to allocate to build"
msgstr ""
-#: build/models.py:1567
+#: build/models.py:1583
msgid "Install into"
msgstr ""
-#: build/models.py:1568
+#: build/models.py:1584
msgid "Destination stock item"
msgstr ""
@@ -1452,9 +1452,9 @@ msgid "A list of build outputs must be provided"
msgstr ""
#: build/serializers.py:426 build/serializers.py:498 order/serializers.py:533
-#: order/serializers.py:641 order/serializers.py:1646 part/serializers.py:1086
+#: order/serializers.py:641 order/serializers.py:1646 part/serializers.py:1104
#: stock/serializers.py:472 stock/serializers.py:627 stock/serializers.py:723
-#: stock/serializers.py:1163 stock/serializers.py:1419
+#: stock/serializers.py:1169 stock/serializers.py:1425
#: stock/templates/stock/item_base.html:394
#: templates/js/translated/barcode.js:547
#: templates/js/translated/barcode.js:795 templates/js/translated/build.js:999
@@ -1494,7 +1494,7 @@ msgstr ""
#: build/serializers.py:505 build/templates/build/build_base.html:151
#: build/templates/build/detail.html:62 order/models.py:910
#: order/models.py:2005 order/serializers.py:565 stock/admin.py:165
-#: stock/serializers.py:774 stock/serializers.py:1307
+#: stock/serializers.py:774 stock/serializers.py:1313
#: stock/templates/stock/item_base.html:427
#: templates/js/translated/barcode.js:252 templates/js/translated/build.js:2189
#: templates/js/translated/purchase_order.js:1308
@@ -1602,7 +1602,7 @@ msgstr ""
msgid "bom_item.part must point to the same part as the build order"
msgstr ""
-#: build/serializers.py:817 stock/serializers.py:1032
+#: build/serializers.py:817 stock/serializers.py:1038
msgid "Item must be in stock"
msgstr ""
@@ -1659,44 +1659,45 @@ msgstr ""
msgid "Allocate optional BOM items to build order"
msgstr ""
-#: build/serializers.py:1096 part/models.py:3895 part/models.py:4331
+#: build/serializers.py:1097 part/models.py:3895 part/models.py:4331
#: stock/api.py:745
msgid "BOM Item"
msgstr ""
-#: build/serializers.py:1105 templates/js/translated/index.js:130
+#: build/serializers.py:1106 templates/js/translated/index.js:130
msgid "Allocated Stock"
msgstr ""
-#: build/serializers.py:1110 part/admin.py:132 part/bom.py:173
-#: part/serializers.py:1441 part/templates/part/part_base.html:210
-#: templates/js/translated/bom.js:1202 templates/js/translated/build.js:2614
-#: templates/js/translated/part.js:709 templates/js/translated/part.js:2148
+#: build/serializers.py:1111 part/admin.py:132 part/bom.py:173
+#: part/serializers.py:798 part/serializers.py:1460
+#: part/templates/part/part_base.html:210 templates/js/translated/bom.js:1208
+#: templates/js/translated/build.js:2614 templates/js/translated/part.js:709
+#: templates/js/translated/part.js:2148
#: templates/js/translated/table_filters.js:170
msgid "On Order"
msgstr ""
-#: build/serializers.py:1115 part/serializers.py:1443
+#: build/serializers.py:1116 part/serializers.py:1462
#: templates/js/translated/build.js:2618
#: templates/js/translated/table_filters.js:360
msgid "In Production"
msgstr ""
-#: build/serializers.py:1120 part/bom.py:172 part/serializers.py:1454
+#: build/serializers.py:1121 part/bom.py:172 part/serializers.py:1473
#: part/templates/part/part_base.html:192
#: templates/js/translated/sales_order.js:1893
msgid "Available Stock"
msgstr ""
-#: build/tasks.py:149
+#: build/tasks.py:171
msgid "Stock required for build order"
msgstr ""
-#: build/tasks.py:166
+#: build/tasks.py:188
msgid "Overdue Build Order"
msgstr ""
-#: build/tasks.py:171
+#: build/tasks.py:193
#, python-brace-format
msgid "Build order {bo} is now overdue"
msgstr ""
@@ -1990,27 +1991,31 @@ msgstr ""
msgid "Order Parts"
msgstr ""
-#: build/templates/build/detail.html:210
-msgid "Incomplete Build Outputs"
-msgstr ""
-
-#: build/templates/build/detail.html:214
-msgid "Create new build output"
+#: build/templates/build/detail.html:205
+msgid "Available stock has been filtered based on specified source location for this build order"
msgstr ""
#: build/templates/build/detail.html:215
+msgid "Incomplete Build Outputs"
+msgstr ""
+
+#: build/templates/build/detail.html:219
+msgid "Create new build output"
+msgstr ""
+
+#: build/templates/build/detail.html:220
msgid "New Build Output"
msgstr ""
-#: build/templates/build/detail.html:232 build/templates/build/sidebar.html:15
+#: build/templates/build/detail.html:237 build/templates/build/sidebar.html:15
msgid "Consumed Stock"
msgstr ""
-#: build/templates/build/detail.html:244
+#: build/templates/build/detail.html:249
msgid "Completed Build Outputs"
msgstr ""
-#: build/templates/build/detail.html:256 build/templates/build/sidebar.html:19
+#: build/templates/build/detail.html:261 build/templates/build/sidebar.html:19
#: company/templates/company/detail.html:229
#: company/templates/company/manufacturer_part.html:141
#: company/templates/company/manufacturer_part_sidebar.html:9
@@ -2026,15 +2031,15 @@ msgstr ""
msgid "Attachments"
msgstr ""
-#: build/templates/build/detail.html:271
+#: build/templates/build/detail.html:276
msgid "Build Notes"
msgstr ""
-#: build/templates/build/detail.html:426
+#: build/templates/build/detail.html:434
msgid "Allocation Complete"
msgstr ""
-#: build/templates/build/detail.html:427
+#: build/templates/build/detail.html:435
msgid "All lines have been fully allocated"
msgstr ""
@@ -2436,7 +2441,7 @@ msgid "Parts are templates by default"
msgstr ""
#: common/models.py:1456 part/admin.py:91 part/admin.py:431 part/models.py:1015
-#: templates/js/translated/bom.js:1633
+#: templates/js/translated/bom.js:1639
#: templates/js/translated/table_filters.js:330
#: templates/js/translated/table_filters.js:721
msgid "Assembly"
@@ -3495,7 +3500,7 @@ msgstr ""
msgid "Price break quantity"
msgstr ""
-#: common/models.py:2440 company/serializers.py:484 order/admin.py:42
+#: common/models.py:2440 company/serializers.py:486 order/admin.py:42
#: order/models.py:1321 order/models.py:2226
#: templates/js/translated/company.js:1813 templates/js/translated/part.js:1885
#: templates/js/translated/pricing.js:621
@@ -3972,7 +3977,7 @@ msgstr ""
#: company/models.py:495 company/templates/company/company_base.html:76
#: company/templates/company/manufacturer_part.html:90
-#: company/templates/company/supplier_part.html:145 part/serializers.py:497
+#: company/templates/company/supplier_part.html:145 part/serializers.py:505
#: stock/templates/stock/item_base.html:207
#: templates/js/translated/company.js:506
#: templates/js/translated/company.js:1108
@@ -3987,7 +3992,7 @@ msgid "Select manufacturer"
msgstr ""
#: company/models.py:502 company/templates/company/manufacturer_part.html:101
-#: company/templates/company/supplier_part.html:153 part/serializers.py:507
+#: company/templates/company/supplier_part.html:153 part/serializers.py:515
#: templates/js/translated/company.js:351
#: templates/js/translated/company.js:1107
#: templates/js/translated/company.js:1302
@@ -4059,7 +4064,7 @@ msgstr ""
#: company/models.py:795 company/templates/company/company_base.html:81
#: company/templates/company/supplier_part.html:129 order/models.py:453
#: order/templates/order/order_base.html:136 part/bom.py:272 part/bom.py:310
-#: part/serializers.py:481 plugin/builtin/suppliers/digikey.py:25
+#: part/serializers.py:489 plugin/builtin/suppliers/digikey.py:25
#: plugin/builtin/suppliers/lcsc.py:26 plugin/builtin/suppliers/mouser.py:24
#: plugin/builtin/suppliers/tme.py:26 stock/templates/stock/item_base.html:224
#: templates/email/overdue_purchase_order.html:16
@@ -4076,7 +4081,7 @@ msgstr ""
msgid "Select supplier"
msgstr ""
-#: company/models.py:802 part/serializers.py:492
+#: company/models.py:802 part/serializers.py:500
msgid "Supplier stock keeping unit"
msgstr ""
@@ -4112,7 +4117,7 @@ msgid "Minimum charge (e.g. stocking fee)"
msgstr ""
#: company/models.py:851 company/templates/company/supplier_part.html:160
-#: stock/admin.py:224 stock/models.py:785 stock/serializers.py:1317
+#: stock/admin.py:224 stock/models.py:785 stock/serializers.py:1323
#: stock/templates/stock/item_base.html:240
#: templates/js/translated/company.js:1636
#: templates/js/translated/stock.js:2387
@@ -4157,7 +4162,7 @@ msgstr ""
msgid "Date of last update of availability data"
msgstr ""
-#: company/serializers.py:153
+#: company/serializers.py:155
msgid "Default currency used for this supplier"
msgstr ""
@@ -4218,7 +4223,7 @@ msgstr ""
#: company/templates/company/company_base.html:86 order/models.py:898
#: order/models.py:1993 order/templates/order/return_order_base.html:131
#: order/templates/order/sales_order_base.html:144 stock/models.py:807
-#: stock/models.py:808 stock/serializers.py:1067
+#: stock/models.py:808 stock/serializers.py:1073
#: stock/templates/stock/item_base.html:405
#: templates/email/overdue_sales_order.html:16
#: templates/js/translated/company.js:502
@@ -4429,8 +4434,9 @@ msgstr ""
#: company/templates/company/manufacturer_part.html:119
#: company/templates/company/supplier_part.html:15 company/views.py:31
-#: part/admin.py:122 part/templates/part/part_sidebar.html:33
-#: templates/InvenTree/search.html:190 templates/navbar.html:48
+#: part/admin.py:122 part/serializers.py:802
+#: part/templates/part/part_sidebar.html:33 templates/InvenTree/search.html:190
+#: templates/navbar.html:48
msgid "Suppliers"
msgstr ""
@@ -4528,7 +4534,7 @@ msgid "No supplier information available"
msgstr ""
#: company/templates/company/supplier_part.html:139 part/bom.py:279
-#: part/bom.py:311 part/serializers.py:491
+#: part/bom.py:311 part/serializers.py:499
#: templates/js/translated/company.js:349 templates/js/translated/part.js:1786
#: templates/js/translated/pricing.js:510
#: templates/js/translated/purchase_order.js:1851
@@ -4577,10 +4583,12 @@ msgstr ""
msgid "Update Part Availability"
msgstr ""
-#: company/templates/company/supplier_part_sidebar.html:5 part/stocktake.py:223
+#: company/templates/company/supplier_part_sidebar.html:5
+#: part/serializers.py:801 part/stocktake.py:223
#: part/templates/part/category.html:183
#: part/templates/part/category_sidebar.html:17 stock/admin.py:69
-#: stock/serializers.py:760 stock/templates/stock/location.html:170
+#: stock/serializers.py:760 stock/serializers.py:924
+#: stock/templates/stock/location.html:170
#: stock/templates/stock/location.html:184
#: stock/templates/stock/location.html:196
#: stock/templates/stock/location_sidebar.html:7
@@ -4640,7 +4648,7 @@ msgid "Label template file"
msgstr ""
#: label/models.py:143 part/models.py:3484 report/models.py:322
-#: templates/js/translated/part.js:2891
+#: templates/js/translated/part.js:2900
#: templates/js/translated/table_filters.js:481
msgid "Enabled"
msgstr ""
@@ -5733,7 +5741,7 @@ msgid "Pending Shipments"
msgstr ""
#: order/templates/order/sales_order_detail.html:71
-#: templates/js/translated/bom.js:1271 templates/js/translated/filters.js:296
+#: templates/js/translated/bom.js:1277 templates/js/translated/filters.js:296
msgid "Actions"
msgstr ""
@@ -5861,10 +5869,10 @@ msgstr ""
msgid "Category Path"
msgstr ""
-#: part/admin.py:323 part/models.py:390 part/serializers.py:259
-#: part/serializers.py:373 part/templates/part/cat_link.html:3
-#: part/templates/part/category.html:23 part/templates/part/category.html:141
-#: part/templates/part/category.html:161
+#: part/admin.py:323 part/models.py:390 part/serializers.py:112
+#: part/serializers.py:265 part/serializers.py:381
+#: part/templates/part/cat_link.html:3 part/templates/part/category.html:23
+#: part/templates/part/category.html:141 part/templates/part/category.html:161
#: part/templates/part/category_sidebar.html:9
#: templates/InvenTree/index.html:36 templates/InvenTree/search.html:84
#: templates/InvenTree/settings/sidebar.html:47
@@ -5889,13 +5897,13 @@ msgstr ""
msgid "Part IPN"
msgstr ""
-#: part/admin.py:421 part/serializers.py:1220
+#: part/admin.py:421 part/serializers.py:1238
#: templates/js/translated/pricing.js:358
#: templates/js/translated/pricing.js:1024
msgid "Minimum Price"
msgstr ""
-#: part/admin.py:426 part/serializers.py:1235
+#: part/admin.py:426 part/serializers.py:1253
#: templates/js/translated/pricing.js:353
#: templates/js/translated/pricing.js:1032
msgid "Maximum Price"
@@ -5974,7 +5982,7 @@ msgid "This option must be selected"
msgstr ""
#: part/api.py:1541 part/models.py:895 part/models.py:3385 part/models.py:3831
-#: part/serializers.py:388 part/serializers.py:1076
+#: part/serializers.py:396 part/serializers.py:1094
#: part/templates/part/part_base.html:260 stock/api.py:733
#: templates/InvenTree/settings/settings_staff_js.html:300
#: templates/js/translated/notification.js:60
@@ -5982,12 +5990,17 @@ msgstr ""
msgid "Category"
msgstr ""
+#: part/api.py:1828
+msgid "Uses"
+msgstr ""
+
#: part/bom.py:170 part/models.py:100 part/models.py:938
#: part/templates/part/category.html:116 part/templates/part/part_base.html:367
msgid "Default Location"
msgstr ""
-#: part/bom.py:171 templates/email/low_stock_notification.html:16
+#: part/bom.py:171 part/serializers.py:803
+#: templates/email/low_stock_notification.html:16
msgid "Total Stock"
msgstr ""
@@ -6010,7 +6023,8 @@ msgstr ""
msgid "Default location for parts in this category"
msgstr ""
-#: part/models.py:106 stock/models.py:165 templates/js/translated/stock.js:2736
+#: part/models.py:106 stock/models.py:165 templates/js/translated/part.js:2810
+#: templates/js/translated/stock.js:2736
#: templates/js/translated/table_filters.js:239
#: templates/js/translated/table_filters.js:283
msgid "Structural"
@@ -6418,7 +6432,7 @@ msgstr ""
msgid "Test with this name already exists for this part"
msgstr ""
-#: part/models.py:3464 templates/js/translated/part.js:2870
+#: part/models.py:3464 templates/js/translated/part.js:2879
msgid "Test Name"
msgstr ""
@@ -6446,7 +6460,7 @@ msgstr ""
msgid "Is this test enabled?"
msgstr ""
-#: part/models.py:3489 templates/js/translated/part.js:2899
+#: part/models.py:3489 templates/js/translated/part.js:2908
#: templates/js/translated/table_filters.js:477
msgid "Required"
msgstr ""
@@ -6455,7 +6469,7 @@ msgstr ""
msgid "Is this test required to pass?"
msgstr ""
-#: part/models.py:3495 templates/js/translated/part.js:2907
+#: part/models.py:3495 templates/js/translated/part.js:2916
msgid "Requires Value"
msgstr ""
@@ -6463,7 +6477,7 @@ msgstr ""
msgid "Does this test require a value when adding a test result?"
msgstr ""
-#: part/models.py:3501 templates/js/translated/part.js:2914
+#: part/models.py:3501 templates/js/translated/part.js:2923
msgid "Requires Attachment"
msgstr ""
@@ -6685,311 +6699,323 @@ msgstr ""
msgid "Duplicate relationship already exists"
msgstr ""
-#: part/serializers.py:128 part/templates/part/category.html:122
-#: part/templates/part/category.html:207
+#: part/serializers.py:114 part/serializers.py:134
+#: part/templates/part/category.html:122 part/templates/part/category.html:207
#: part/templates/part/category_sidebar.html:7
msgid "Subcategories"
msgstr ""
-#: part/serializers.py:172
+#: part/serializers.py:178
msgid "Results"
msgstr ""
-#: part/serializers.py:173
+#: part/serializers.py:179
msgid "Number of results recorded against this template"
msgstr ""
-#: part/serializers.py:197 part/serializers.py:215 stock/serializers.py:384
+#: part/serializers.py:203 part/serializers.py:221 stock/serializers.py:384
msgid "Purchase currency of this stock item"
msgstr ""
-#: part/serializers.py:260
+#: part/serializers.py:266
msgid "Number of parts using this template"
msgstr ""
-#: part/serializers.py:379
+#: part/serializers.py:387
msgid "No parts selected"
msgstr ""
-#: part/serializers.py:389
+#: part/serializers.py:397
msgid "Select category"
msgstr ""
-#: part/serializers.py:419
+#: part/serializers.py:427
msgid "Original Part"
msgstr ""
-#: part/serializers.py:420
+#: part/serializers.py:428
msgid "Select original part to duplicate"
msgstr ""
-#: part/serializers.py:425
+#: part/serializers.py:433
msgid "Copy Image"
msgstr ""
-#: part/serializers.py:426
+#: part/serializers.py:434
msgid "Copy image from original part"
msgstr ""
-#: part/serializers.py:432 part/templates/part/detail.html:277
+#: part/serializers.py:440 part/templates/part/detail.html:277
msgid "Copy BOM"
msgstr ""
-#: part/serializers.py:433
+#: part/serializers.py:441
msgid "Copy bill of materials from original part"
msgstr ""
-#: part/serializers.py:439
+#: part/serializers.py:447
msgid "Copy Parameters"
msgstr ""
-#: part/serializers.py:440
+#: part/serializers.py:448
msgid "Copy parameter data from original part"
msgstr ""
-#: part/serializers.py:446
+#: part/serializers.py:454
msgid "Copy Notes"
msgstr ""
-#: part/serializers.py:447
+#: part/serializers.py:455
msgid "Copy notes from original part"
msgstr ""
-#: part/serializers.py:460
+#: part/serializers.py:468
msgid "Initial Stock Quantity"
msgstr ""
-#: part/serializers.py:462
+#: part/serializers.py:470
msgid "Specify initial stock quantity for this Part. If quantity is zero, no stock is added."
msgstr ""
-#: part/serializers.py:469
+#: part/serializers.py:477
msgid "Initial Stock Location"
msgstr ""
-#: part/serializers.py:470
+#: part/serializers.py:478
msgid "Specify initial stock location for this Part"
msgstr ""
-#: part/serializers.py:482
+#: part/serializers.py:490
msgid "Select supplier (or leave blank to skip)"
msgstr ""
-#: part/serializers.py:498
+#: part/serializers.py:506
msgid "Select manufacturer (or leave blank to skip)"
msgstr ""
-#: part/serializers.py:508
+#: part/serializers.py:516
msgid "Manufacturer part number"
msgstr ""
-#: part/serializers.py:515
+#: part/serializers.py:523
msgid "Selected company is not a valid supplier"
msgstr ""
-#: part/serializers.py:524
+#: part/serializers.py:532
msgid "Selected company is not a valid manufacturer"
msgstr ""
-#: part/serializers.py:535
+#: part/serializers.py:543
msgid "Manufacturer part matching this MPN already exists"
msgstr ""
-#: part/serializers.py:542
+#: part/serializers.py:550
msgid "Supplier part matching this SKU already exists"
msgstr ""
-#: part/serializers.py:815 part/templates/part/copy_part.html:9
+#: part/serializers.py:804
+msgid "External Stock"
+msgstr ""
+
+#: part/serializers.py:806
+msgid "Unallocated Stock"
+msgstr ""
+
+#: part/serializers.py:808
+msgid "Variant Stock"
+msgstr ""
+
+#: part/serializers.py:833 part/templates/part/copy_part.html:9
#: templates/js/translated/part.js:471
msgid "Duplicate Part"
msgstr ""
-#: part/serializers.py:816
+#: part/serializers.py:834
msgid "Copy initial data from another Part"
msgstr ""
-#: part/serializers.py:822 templates/js/translated/part.js:102
+#: part/serializers.py:840 templates/js/translated/part.js:102
msgid "Initial Stock"
msgstr ""
-#: part/serializers.py:823
+#: part/serializers.py:841
msgid "Create Part with initial stock quantity"
msgstr ""
-#: part/serializers.py:829
+#: part/serializers.py:847
msgid "Supplier Information"
msgstr ""
-#: part/serializers.py:830
+#: part/serializers.py:848
msgid "Add initial supplier information for this part"
msgstr ""
-#: part/serializers.py:838
+#: part/serializers.py:856
msgid "Copy Category Parameters"
msgstr ""
-#: part/serializers.py:839
+#: part/serializers.py:857
msgid "Copy parameter templates from selected part category"
msgstr ""
-#: part/serializers.py:844
+#: part/serializers.py:862
msgid "Existing Image"
msgstr ""
-#: part/serializers.py:845
+#: part/serializers.py:863
msgid "Filename of an existing part image"
msgstr ""
-#: part/serializers.py:862
+#: part/serializers.py:880
msgid "Image file does not exist"
msgstr ""
-#: part/serializers.py:1068
+#: part/serializers.py:1086
msgid "Limit stocktake report to a particular part, and any variant parts"
msgstr ""
-#: part/serializers.py:1078
+#: part/serializers.py:1096
msgid "Limit stocktake report to a particular part category, and any child categories"
msgstr ""
-#: part/serializers.py:1088
+#: part/serializers.py:1106
msgid "Limit stocktake report to a particular stock location, and any child locations"
msgstr ""
-#: part/serializers.py:1094
+#: part/serializers.py:1112
msgid "Exclude External Stock"
msgstr ""
-#: part/serializers.py:1095
+#: part/serializers.py:1113
msgid "Exclude stock items in external locations"
msgstr ""
-#: part/serializers.py:1100
+#: part/serializers.py:1118
msgid "Generate Report"
msgstr ""
-#: part/serializers.py:1101
+#: part/serializers.py:1119
msgid "Generate report file containing calculated stocktake data"
msgstr ""
-#: part/serializers.py:1106
+#: part/serializers.py:1124
msgid "Update Parts"
msgstr ""
-#: part/serializers.py:1107
+#: part/serializers.py:1125
msgid "Update specified parts with calculated stocktake data"
msgstr ""
-#: part/serializers.py:1115
+#: part/serializers.py:1133
msgid "Stocktake functionality is not enabled"
msgstr ""
-#: part/serializers.py:1221
+#: part/serializers.py:1239
msgid "Override calculated value for minimum price"
msgstr ""
-#: part/serializers.py:1228
+#: part/serializers.py:1246
msgid "Minimum price currency"
msgstr ""
-#: part/serializers.py:1236
+#: part/serializers.py:1254
msgid "Override calculated value for maximum price"
msgstr ""
-#: part/serializers.py:1243
+#: part/serializers.py:1261
msgid "Maximum price currency"
msgstr ""
-#: part/serializers.py:1272
+#: part/serializers.py:1290
msgid "Update"
msgstr ""
-#: part/serializers.py:1273
+#: part/serializers.py:1291
msgid "Update pricing for this part"
msgstr ""
-#: part/serializers.py:1296
+#: part/serializers.py:1314
#, python-brace-format
msgid "Could not convert from provided currencies to {default_currency}"
msgstr ""
-#: part/serializers.py:1303
+#: part/serializers.py:1321
msgid "Minimum price must not be greater than maximum price"
msgstr ""
-#: part/serializers.py:1306
+#: part/serializers.py:1324
msgid "Maximum price must not be less than minimum price"
msgstr ""
-#: part/serializers.py:1632
+#: part/serializers.py:1660
msgid "Select part to copy BOM from"
msgstr ""
-#: part/serializers.py:1640
+#: part/serializers.py:1668
msgid "Remove Existing Data"
msgstr ""
-#: part/serializers.py:1641
+#: part/serializers.py:1669
msgid "Remove existing BOM items before copying"
msgstr ""
-#: part/serializers.py:1646
+#: part/serializers.py:1674
msgid "Include Inherited"
msgstr ""
-#: part/serializers.py:1647
+#: part/serializers.py:1675
msgid "Include BOM items which are inherited from templated parts"
msgstr ""
-#: part/serializers.py:1652
+#: part/serializers.py:1680
msgid "Skip Invalid Rows"
msgstr ""
-#: part/serializers.py:1653
+#: part/serializers.py:1681
msgid "Enable this option to skip invalid rows"
msgstr ""
-#: part/serializers.py:1658
+#: part/serializers.py:1686
msgid "Copy Substitute Parts"
msgstr ""
-#: part/serializers.py:1659
+#: part/serializers.py:1687
msgid "Copy substitute parts when duplicate BOM items"
msgstr ""
-#: part/serializers.py:1693
+#: part/serializers.py:1721
msgid "Clear Existing BOM"
msgstr ""
-#: part/serializers.py:1694
+#: part/serializers.py:1722
msgid "Delete existing BOM items before uploading"
msgstr ""
-#: part/serializers.py:1724
+#: part/serializers.py:1752
msgid "No part column specified"
msgstr ""
-#: part/serializers.py:1768
+#: part/serializers.py:1796
msgid "Multiple matching parts found"
msgstr ""
-#: part/serializers.py:1771
+#: part/serializers.py:1799
msgid "No matching part found"
msgstr ""
-#: part/serializers.py:1774
+#: part/serializers.py:1802
msgid "Part is not designated as a component"
msgstr ""
-#: part/serializers.py:1783
+#: part/serializers.py:1811
msgid "Quantity not provided"
msgstr ""
-#: part/serializers.py:1791
+#: part/serializers.py:1819
msgid "Invalid quantity"
msgstr ""
-#: part/serializers.py:1812
+#: part/serializers.py:1840
msgid "At least one BOM item is required"
msgstr ""
@@ -7221,7 +7247,7 @@ msgid "Validate BOM"
msgstr ""
#: part/templates/part/detail.html:283 part/templates/part/detail.html:284
-#: templates/js/translated/bom.js:1314 templates/js/translated/bom.js:1315
+#: templates/js/translated/bom.js:1320 templates/js/translated/bom.js:1321
msgid "Add BOM Item"
msgstr ""
@@ -7405,7 +7431,7 @@ msgstr ""
msgid "Allocated to Sales Orders"
msgstr ""
-#: part/templates/part/part_base.html:235 templates/js/translated/bom.js:1213
+#: part/templates/part/part_base.html:235 templates/js/translated/bom.js:1219
msgid "Can Build"
msgstr ""
@@ -8784,7 +8810,7 @@ msgstr ""
msgid "Where is this stock item located?"
msgstr ""
-#: stock/models.py:786 stock/serializers.py:1318
+#: stock/models.py:786 stock/serializers.py:1324
msgid "Packaging this stock item is stored in"
msgstr ""
@@ -8796,7 +8822,7 @@ msgstr ""
msgid "Serial number for this item"
msgstr ""
-#: stock/models.py:830 stock/serializers.py:1301
+#: stock/models.py:830 stock/serializers.py:1307
msgid "Batch code for this stock item"
msgstr ""
@@ -8905,7 +8931,7 @@ msgstr ""
msgid "Serialized stock cannot be merged"
msgstr ""
-#: stock/models.py:1639 stock/serializers.py:1207
+#: stock/models.py:1639 stock/serializers.py:1213
msgid "Duplicate stock items"
msgstr ""
@@ -8986,7 +9012,7 @@ msgstr ""
msgid "Enter serial numbers for new items"
msgstr ""
-#: stock/serializers.py:473 stock/serializers.py:1164 stock/serializers.py:1420
+#: stock/serializers.py:473 stock/serializers.py:1170 stock/serializers.py:1426
msgid "Destination stock location"
msgstr ""
@@ -9059,77 +9085,78 @@ msgstr ""
msgid "No stock items selected"
msgstr ""
-#: stock/serializers.py:863 stock/templates/stock/location.html:165
+#: stock/serializers.py:863 stock/serializers.py:926
+#: stock/templates/stock/location.html:165
#: stock/templates/stock/location.html:213
#: stock/templates/stock/location_sidebar.html:5
msgid "Sublocations"
msgstr ""
-#: stock/serializers.py:1036
+#: stock/serializers.py:1042
msgid "Part must be salable"
msgstr ""
-#: stock/serializers.py:1040
+#: stock/serializers.py:1046
msgid "Item is allocated to a sales order"
msgstr ""
-#: stock/serializers.py:1044
+#: stock/serializers.py:1050
msgid "Item is allocated to a build order"
msgstr ""
-#: stock/serializers.py:1068
+#: stock/serializers.py:1074
msgid "Customer to assign stock items"
msgstr ""
-#: stock/serializers.py:1074
+#: stock/serializers.py:1080
msgid "Selected company is not a customer"
msgstr ""
-#: stock/serializers.py:1082
+#: stock/serializers.py:1088
msgid "Stock assignment notes"
msgstr ""
-#: stock/serializers.py:1092 stock/serializers.py:1346
+#: stock/serializers.py:1098 stock/serializers.py:1352
msgid "A list of stock items must be provided"
msgstr ""
-#: stock/serializers.py:1171
+#: stock/serializers.py:1177
msgid "Stock merging notes"
msgstr ""
-#: stock/serializers.py:1176
+#: stock/serializers.py:1182
msgid "Allow mismatched suppliers"
msgstr ""
-#: stock/serializers.py:1177
+#: stock/serializers.py:1183
msgid "Allow stock items with different supplier parts to be merged"
msgstr ""
-#: stock/serializers.py:1182
+#: stock/serializers.py:1188
msgid "Allow mismatched status"
msgstr ""
-#: stock/serializers.py:1183
+#: stock/serializers.py:1189
msgid "Allow stock items with different status codes to be merged"
msgstr ""
-#: stock/serializers.py:1193
+#: stock/serializers.py:1199
msgid "At least two stock items must be provided"
msgstr ""
-#: stock/serializers.py:1260
+#: stock/serializers.py:1266
msgid "No Change"
msgstr ""
-#: stock/serializers.py:1289
+#: stock/serializers.py:1295
msgid "StockItem primary key value"
msgstr ""
-#: stock/serializers.py:1308
+#: stock/serializers.py:1314
msgid "Stock item status code"
msgstr ""
-#: stock/serializers.py:1336
+#: stock/serializers.py:1342
msgid "Stock transaction notes"
msgstr ""
@@ -10662,7 +10689,7 @@ msgid "The following parts are low on required stock"
msgstr ""
#: templates/email/build_order_required_stock.html:18
-#: templates/js/translated/bom.js:1668 templates/js/translated/build.js:2557
+#: templates/js/translated/bom.js:1674 templates/js/translated/build.js:2557
msgid "Required Quantity"
msgstr ""
@@ -10676,7 +10703,7 @@ msgid "Click on the following link to view this part"
msgstr ""
#: templates/email/low_stock_notification.html:18
-#: templates/js/translated/part.js:3209
+#: templates/js/translated/part.js:3218
msgid "Minimum Quantity"
msgstr ""
@@ -11051,62 +11078,66 @@ msgstr ""
msgid "No pricing available"
msgstr ""
-#: templates/js/translated/bom.js:1182 templates/js/translated/build.js:2596
+#: templates/js/translated/bom.js:1184 templates/js/translated/build.js:2622
+msgid "External stock"
+msgstr ""
+
+#: templates/js/translated/bom.js:1188 templates/js/translated/build.js:2596
#: templates/js/translated/sales_order.js:1910
msgid "No Stock Available"
msgstr ""
-#: templates/js/translated/bom.js:1187 templates/js/translated/build.js:2600
+#: templates/js/translated/bom.js:1193 templates/js/translated/build.js:2600
msgid "Includes variant and substitute stock"
msgstr ""
-#: templates/js/translated/bom.js:1189 templates/js/translated/build.js:2602
+#: templates/js/translated/bom.js:1195 templates/js/translated/build.js:2602
#: templates/js/translated/part.js:1256
#: templates/js/translated/sales_order.js:1907
msgid "Includes variant stock"
msgstr ""
-#: templates/js/translated/bom.js:1191 templates/js/translated/build.js:2604
+#: templates/js/translated/bom.js:1197 templates/js/translated/build.js:2604
msgid "Includes substitute stock"
msgstr ""
-#: templates/js/translated/bom.js:1219 templates/js/translated/build.js:2587
+#: templates/js/translated/bom.js:1225 templates/js/translated/build.js:2587
msgid "Consumable item"
msgstr ""
-#: templates/js/translated/bom.js:1279
+#: templates/js/translated/bom.js:1285
msgid "Validate BOM Item"
msgstr ""
-#: templates/js/translated/bom.js:1281
+#: templates/js/translated/bom.js:1287
msgid "This line has been validated"
msgstr ""
-#: templates/js/translated/bom.js:1283
+#: templates/js/translated/bom.js:1289
msgid "Edit substitute parts"
msgstr ""
-#: templates/js/translated/bom.js:1285 templates/js/translated/bom.js:1480
+#: templates/js/translated/bom.js:1291 templates/js/translated/bom.js:1486
msgid "Edit BOM Item"
msgstr ""
-#: templates/js/translated/bom.js:1287
+#: templates/js/translated/bom.js:1293
msgid "Delete BOM Item"
msgstr ""
-#: templates/js/translated/bom.js:1307
+#: templates/js/translated/bom.js:1313
msgid "View BOM"
msgstr ""
-#: templates/js/translated/bom.js:1391
+#: templates/js/translated/bom.js:1397
msgid "No BOM items found"
msgstr ""
-#: templates/js/translated/bom.js:1651 templates/js/translated/build.js:2486
+#: templates/js/translated/bom.js:1657 templates/js/translated/build.js:2486
msgid "Required Part"
msgstr ""
-#: templates/js/translated/bom.js:1677
+#: templates/js/translated/bom.js:1683
msgid "Inherited from parent BOM"
msgstr ""
@@ -11449,29 +11480,29 @@ msgstr ""
msgid "Sufficient stock available"
msgstr ""
-#: templates/js/translated/build.js:2643
+#: templates/js/translated/build.js:2647
msgid "Consumable Item"
msgstr ""
-#: templates/js/translated/build.js:2648
+#: templates/js/translated/build.js:2652
msgid "Tracked item"
msgstr ""
-#: templates/js/translated/build.js:2655
+#: templates/js/translated/build.js:2659
#: templates/js/translated/sales_order.js:2016
msgid "Build stock"
msgstr ""
-#: templates/js/translated/build.js:2660 templates/js/translated/stock.js:1829
+#: templates/js/translated/build.js:2664 templates/js/translated/stock.js:1829
msgid "Order stock"
msgstr ""
-#: templates/js/translated/build.js:2664
+#: templates/js/translated/build.js:2668
#: templates/js/translated/sales_order.js:2010
msgid "Allocate stock"
msgstr ""
-#: templates/js/translated/build.js:2668
+#: templates/js/translated/build.js:2672
msgid "Remove stock allocation"
msgstr ""
@@ -12313,64 +12344,64 @@ msgstr ""
msgid "Subscribed category"
msgstr ""
-#: templates/js/translated/part.js:2855
+#: templates/js/translated/part.js:2864
msgid "No test templates matching query"
msgstr ""
-#: templates/js/translated/part.js:2877 templates/js/translated/search.js:342
+#: templates/js/translated/part.js:2886 templates/js/translated/search.js:342
msgid "results"
msgstr ""
-#: templates/js/translated/part.js:2927 templates/js/translated/stock.js:1446
+#: templates/js/translated/part.js:2936 templates/js/translated/stock.js:1446
msgid "Edit test result"
msgstr ""
-#: templates/js/translated/part.js:2928 templates/js/translated/stock.js:1447
+#: templates/js/translated/part.js:2937 templates/js/translated/stock.js:1447
#: templates/js/translated/stock.js:1692
msgid "Delete test result"
msgstr ""
-#: templates/js/translated/part.js:2932
+#: templates/js/translated/part.js:2941
msgid "This test is defined for a parent part"
msgstr ""
-#: templates/js/translated/part.js:2948
+#: templates/js/translated/part.js:2957
msgid "Edit Test Result Template"
msgstr ""
-#: templates/js/translated/part.js:2962
+#: templates/js/translated/part.js:2971
msgid "Delete Test Result Template"
msgstr ""
-#: templates/js/translated/part.js:3041 templates/js/translated/part.js:3042
+#: templates/js/translated/part.js:3050 templates/js/translated/part.js:3051
msgid "No date specified"
msgstr ""
-#: templates/js/translated/part.js:3044
+#: templates/js/translated/part.js:3053
msgid "Specified date is in the past"
msgstr ""
-#: templates/js/translated/part.js:3050
+#: templates/js/translated/part.js:3059
msgid "Speculative"
msgstr ""
-#: templates/js/translated/part.js:3100
+#: templates/js/translated/part.js:3109
msgid "No scheduling information available for this part"
msgstr ""
-#: templates/js/translated/part.js:3106
+#: templates/js/translated/part.js:3115
msgid "Error fetching scheduling information for this part"
msgstr ""
-#: templates/js/translated/part.js:3202
+#: templates/js/translated/part.js:3211
msgid "Scheduled Stock Quantities"
msgstr ""
-#: templates/js/translated/part.js:3218
+#: templates/js/translated/part.js:3227
msgid "Maximum Quantity"
msgstr ""
-#: templates/js/translated/part.js:3263
+#: templates/js/translated/part.js:3272
msgid "Minimum Stock Level"
msgstr ""
@@ -14052,4 +14083,3 @@ msgstr ""
#: users/models.py:413
msgid "Permission to delete items"
msgstr ""
-
diff --git a/InvenTree/locale/tr/LC_MESSAGES/django.po b/InvenTree/locale/tr/LC_MESSAGES/django.po
index e2eb65ff87..87aa424aef 100644
--- a/InvenTree/locale/tr/LC_MESSAGES/django.po
+++ b/InvenTree/locale/tr/LC_MESSAGES/django.po
@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: inventree\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2024-02-28 04:05+0000\n"
-"PO-Revision-Date: 2024-02-28 07:23\n"
+"POT-Creation-Date: 2024-03-02 07:22+0000\n"
+"PO-Revision-Date: 2024-03-06 10:36\n"
"Last-Translator: \n"
"Language-Team: Turkish\n"
"Language: tr_TR\n"
@@ -28,7 +28,7 @@ msgstr "Kullanıcının bu modeli görüntüleme izni yok"
#: InvenTree/conversion.py:160
#, python-brace-format
msgid "Invalid unit provided ({unit})"
-msgstr ""
+msgstr "Geçersiz ürün girildi ({unit})"
#: InvenTree/conversion.py:170
msgid "No value provided"
@@ -66,9 +66,9 @@ msgstr "Tarih giriniz"
#: report/templates/report/inventree_build_order_base.html:172
#: stock/admin.py:226 stock/models.py:2335 stock/models.py:2451
#: stock/serializers.py:479 stock/serializers.py:632 stock/serializers.py:728
-#: stock/serializers.py:778 stock/serializers.py:1081 stock/serializers.py:1170
-#: stock/serializers.py:1335 stock/templates/stock/stock_sidebar.html:25
-#: templates/js/translated/barcode.js:143 templates/js/translated/bom.js:1259
+#: stock/serializers.py:778 stock/serializers.py:1087 stock/serializers.py:1176
+#: stock/serializers.py:1341 stock/templates/stock/stock_sidebar.html:25
+#: templates/js/translated/barcode.js:143 templates/js/translated/bom.js:1265
#: templates/js/translated/company.js:1674 templates/js/translated/order.js:347
#: templates/js/translated/part.js:1080
#: templates/js/translated/purchase_order.js:2201
@@ -345,7 +345,7 @@ msgstr "E-posta"
#: InvenTree/models.py:107
msgid "Error running plugin validation"
-msgstr ""
+msgstr "Eklenti doğrulama sırasında hata oluştu"
#: InvenTree/models.py:162
msgid "Metadata must be a python dict object"
@@ -377,11 +377,11 @@ msgstr "Referans alanı boş olamaz"
#: InvenTree/models.py:431
msgid "Reference must match required pattern"
-msgstr ""
+msgstr "Referans {pattern} deseniyle mutlaka eşleşmeli"
#: InvenTree/models.py:463
msgid "Reference number is too large"
-msgstr ""
+msgstr "Referans sayısı çok fazla"
#: InvenTree/models.py:537
msgid "Missing file"
@@ -473,7 +473,7 @@ msgstr "Dosya adı değiştirilirken hata"
#: InvenTree/models.py:847
msgid "Duplicate names cannot exist under the same parent"
-msgstr ""
+msgstr "Aynı kaynak altında birden fazla aynı isim kullanılamaz"
#: InvenTree/models.py:864
msgid "Invalid choice"
@@ -523,7 +523,7 @@ msgstr "Adı"
#: templates/js/translated/order.js:298 templates/js/translated/part.js:1238
#: templates/js/translated/part.js:1483 templates/js/translated/part.js:1621
#: templates/js/translated/part.js:1958 templates/js/translated/part.js:2355
-#: templates/js/translated/part.js:2785 templates/js/translated/part.js:2887
+#: templates/js/translated/part.js:2785 templates/js/translated/part.js:2896
#: templates/js/translated/plugin.js:80
#: templates/js/translated/purchase_order.js:1707
#: templates/js/translated/purchase_order.js:1850
@@ -551,7 +551,7 @@ msgstr "Yol"
#: InvenTree/models.py:1022
msgid "Markdown notes (optional)"
-msgstr ""
+msgstr "Markdown notları (isteğe bağlı)"
#: InvenTree/models.py:1051
msgid "Barcode Data"
@@ -567,11 +567,11 @@ msgstr "Barkod Hash"
#: InvenTree/models.py:1059
msgid "Unique hash of barcode data"
-msgstr ""
+msgstr "Barkod verisinin benzersiz hash'i"
#: InvenTree/models.py:1112
msgid "Existing barcode found"
-msgstr ""
+msgstr "Var olan barkod bulundu"
#: InvenTree/models.py:1155
msgid "Server Error"
@@ -579,7 +579,7 @@ msgstr "Sunucu Hatası"
#: InvenTree/models.py:1156
msgid "An error has been logged by the server."
-msgstr ""
+msgstr "Bir hafta sunucu tarafından kayıt edildi."
#: InvenTree/serializers.py:62 part/models.py:4134
msgid "Must be a valid number"
@@ -594,27 +594,27 @@ msgstr "Para birimi"
#: InvenTree/serializers.py:102
msgid "Select currency from available options"
-msgstr ""
+msgstr "Var olan seçeneklerden bir döviz birimi seçin"
#: InvenTree/serializers.py:436
msgid "You do not have permission to change this user role."
-msgstr ""
+msgstr "Bu kullanıcı rolünü değiştirmek için izniniz yok."
#: InvenTree/serializers.py:448
msgid "Only superusers can create new users"
-msgstr ""
+msgstr "Sadece süper kullanıcılar yeni kullanıcı oluşturabilir"
#: InvenTree/serializers.py:467
msgid "Your account has been created."
-msgstr ""
+msgstr "Kullanıcı hesabınız oluşturulmuştur."
#: InvenTree/serializers.py:469
msgid "Please use the password reset function to login"
-msgstr ""
+msgstr "Giriş yapmak için lütfen şifre sıfırlama fonksiyonunu kullanınız"
#: InvenTree/serializers.py:476
msgid "Welcome to InvenTree"
-msgstr ""
+msgstr "InvenTree'ye Hoşgeldiniz"
#: InvenTree/serializers.py:537
msgid "Filename"
@@ -668,17 +668,17 @@ msgstr "Tekrarlanan kolon ismi:'{col}'"
#: InvenTree/serializers.py:854
msgid "Remote Image"
-msgstr ""
+msgstr "Uzaktan Görüntüler"
#: InvenTree/serializers.py:855
msgid "URL of remote image file"
-msgstr ""
+msgstr "Uzaktan görüntü dosya URL'si"
#: InvenTree/serializers.py:873
msgid "Downloading images from remote URL is not enabled"
msgstr ""
-#: InvenTree/status.py:66 part/serializers.py:1120
+#: InvenTree/status.py:66 part/serializers.py:1138
msgid "Background worker check failed"
msgstr "Arka plan çalışanı kontrolü başarısız oldu"
@@ -960,7 +960,7 @@ msgid "Tracked"
msgstr ""
#: build/api.py:285 part/admin.py:144 templates/js/translated/build.js:1741
-#: templates/js/translated/build.js:2626
+#: templates/js/translated/build.js:2630
#: templates/js/translated/sales_order.js:1929
#: templates/js/translated/table_filters.js:571
msgid "Allocated"
@@ -1044,11 +1044,11 @@ msgstr "Bu yapım işinin tahsis edildiği yapım işi emri"
#: build/models.py:199 build/templates/build/build_base.html:97
#: build/templates/build/detail.html:29 company/models.py:1044
#: order/models.py:1389 order/models.py:1532 order/models.py:1533
-#: part/api.py:1528 part/models.py:389 part/models.py:3003 part/models.py:3147
-#: part/models.py:3291 part/models.py:3314 part/models.py:3335
-#: part/models.py:3357 part/models.py:3458 part/models.py:3754
-#: part/models.py:3885 part/models.py:3978 part/models.py:4339
-#: part/serializers.py:1066 part/serializers.py:1631
+#: part/api.py:1528 part/api.py:1820 part/models.py:389 part/models.py:3003
+#: part/models.py:3147 part/models.py:3291 part/models.py:3314
+#: part/models.py:3335 part/models.py:3357 part/models.py:3458
+#: part/models.py:3754 part/models.py:3885 part/models.py:3978
+#: part/models.py:4339 part/serializers.py:1084 part/serializers.py:1659
#: part/templates/part/part_app_base.html:8
#: part/templates/part/part_pricing.html:12
#: part/templates/part/upload_bom.html:52
@@ -1147,7 +1147,7 @@ msgid "Build status code"
msgstr "Yapım işi durum kodu"
#: build/models.py:264 build/serializers.py:280 order/serializers.py:549
-#: stock/models.py:826 stock/serializers.py:1300
+#: stock/models.py:826 stock/serializers.py:1306
#: templates/js/translated/purchase_order.js:1129
msgid "Batch Code"
msgstr "Sıra numarası"
@@ -1242,48 +1242,48 @@ msgstr ""
msgid "Project code for this build order"
msgstr ""
-#: build/models.py:559
+#: build/models.py:575
#, python-brace-format
msgid "Build order {build} has been completed"
msgstr ""
-#: build/models.py:565
+#: build/models.py:581
msgid "A build order has been completed"
msgstr ""
-#: build/models.py:783 build/models.py:858
+#: build/models.py:799 build/models.py:874
msgid "No build output specified"
msgstr "Yapım işi çıktısı belirtilmedi"
-#: build/models.py:786
+#: build/models.py:802
msgid "Build output is already completed"
msgstr "Yapım işi çıktısı zaten tamamlanmış"
-#: build/models.py:789
+#: build/models.py:805
msgid "Build output does not match Build Order"
msgstr "Yapım işi çıktısı, yapım işi emri ile eşleşmiyor"
-#: build/models.py:862 build/serializers.py:223 build/serializers.py:262
+#: build/models.py:878 build/serializers.py:223 build/serializers.py:262
#: build/serializers.py:831 order/models.py:526 order/serializers.py:401
-#: order/serializers.py:544 part/serializers.py:1423 part/serializers.py:1789
+#: order/serializers.py:544 part/serializers.py:1442 part/serializers.py:1817
#: stock/models.py:665 stock/models.py:1477 stock/serializers.py:450
msgid "Quantity must be greater than zero"
msgstr ""
-#: build/models.py:867 build/serializers.py:228
+#: build/models.py:883 build/serializers.py:228
msgid "Quantity cannot be greater than the output quantity"
msgstr ""
-#: build/models.py:924 build/serializers.py:533
+#: build/models.py:940 build/serializers.py:533
#, python-brace-format
msgid "Build output {serial} has not passed all required tests"
msgstr ""
-#: build/models.py:1286
+#: build/models.py:1302
msgid "Build object"
msgstr ""
-#: build/models.py:1300 build/models.py:1558 build/serializers.py:210
+#: build/models.py:1316 build/models.py:1574 build/serializers.py:210
#: build/serializers.py:247 build/templates/build/build_base.html:102
#: build/templates/build/detail.html:34 common/models.py:2432
#: order/models.py:1247 order/models.py:1902 order/serializers.py:1306
@@ -1310,7 +1310,7 @@ msgstr ""
#: templates/js/translated/company.js:1808
#: templates/js/translated/model_renderers.js:230
#: templates/js/translated/order.js:304 templates/js/translated/part.js:961
-#: templates/js/translated/part.js:1811 templates/js/translated/part.js:3332
+#: templates/js/translated/part.js:1811 templates/js/translated/part.js:3341
#: templates/js/translated/pricing.js:381
#: templates/js/translated/pricing.js:474
#: templates/js/translated/pricing.js:522
@@ -1330,38 +1330,38 @@ msgstr ""
msgid "Quantity"
msgstr "Miktar"
-#: build/models.py:1301
+#: build/models.py:1317
msgid "Required quantity for build order"
msgstr ""
-#: build/models.py:1381
+#: build/models.py:1397
msgid "Build item must specify a build output, as master part is marked as trackable"
msgstr "Ana parça izlenebilir olarak işaretlendiğinden, yapım işi çıktısı için bir yapım işi ögesi belirtmelidir"
-#: build/models.py:1390
+#: build/models.py:1406
#, python-brace-format
msgid "Allocated quantity ({q}) must not exceed available stock quantity ({a})"
msgstr ""
-#: build/models.py:1400 order/models.py:1853
+#: build/models.py:1416 order/models.py:1853
msgid "Stock item is over-allocated"
msgstr "Stok kalemi fazladan tahsis edilmiş"
-#: build/models.py:1406 order/models.py:1856
+#: build/models.py:1422 order/models.py:1856
msgid "Allocation quantity must be greater than zero"
msgstr "Tahsis edilen miktar sıfırdan büyük olmalıdır"
-#: build/models.py:1412
+#: build/models.py:1428
msgid "Quantity must be 1 for serialized stock"
msgstr "Seri numaralı stok için miktar bir olmalı"
-#: build/models.py:1473
+#: build/models.py:1489
msgid "Selected stock item does not match BOM line"
msgstr ""
-#: build/models.py:1545 build/serializers.py:811 order/serializers.py:1150
-#: order/serializers.py:1171 stock/serializers.py:544 stock/serializers.py:1019
-#: stock/serializers.py:1131 stock/templates/stock/item_base.html:10
+#: build/models.py:1561 build/serializers.py:811 order/serializers.py:1150
+#: order/serializers.py:1171 stock/serializers.py:544 stock/serializers.py:1025
+#: stock/serializers.py:1137 stock/templates/stock/item_base.html:10
#: stock/templates/stock/item_base.html:23
#: stock/templates/stock/item_base.html:194
#: templates/js/translated/build.js:1742
@@ -1376,19 +1376,19 @@ msgstr ""
msgid "Stock Item"
msgstr "Stok Kalemi"
-#: build/models.py:1546
+#: build/models.py:1562
msgid "Source stock item"
msgstr "Kaynak stok kalemi"
-#: build/models.py:1559
+#: build/models.py:1575
msgid "Stock quantity to allocate to build"
msgstr "Yapım işi için tahsis edilen stok miktarı"
-#: build/models.py:1567
+#: build/models.py:1583
msgid "Install into"
msgstr "Kurulduğu yer"
-#: build/models.py:1568
+#: build/models.py:1584
msgid "Destination stock item"
msgstr "Hedef stok kalemi"
@@ -1452,9 +1452,9 @@ msgid "A list of build outputs must be provided"
msgstr ""
#: build/serializers.py:426 build/serializers.py:498 order/serializers.py:533
-#: order/serializers.py:641 order/serializers.py:1646 part/serializers.py:1086
+#: order/serializers.py:641 order/serializers.py:1646 part/serializers.py:1104
#: stock/serializers.py:472 stock/serializers.py:627 stock/serializers.py:723
-#: stock/serializers.py:1163 stock/serializers.py:1419
+#: stock/serializers.py:1169 stock/serializers.py:1425
#: stock/templates/stock/item_base.html:394
#: templates/js/translated/barcode.js:547
#: templates/js/translated/barcode.js:795 templates/js/translated/build.js:999
@@ -1494,7 +1494,7 @@ msgstr ""
#: build/serializers.py:505 build/templates/build/build_base.html:151
#: build/templates/build/detail.html:62 order/models.py:910
#: order/models.py:2005 order/serializers.py:565 stock/admin.py:165
-#: stock/serializers.py:774 stock/serializers.py:1307
+#: stock/serializers.py:774 stock/serializers.py:1313
#: stock/templates/stock/item_base.html:427
#: templates/js/translated/barcode.js:252 templates/js/translated/build.js:2189
#: templates/js/translated/purchase_order.js:1308
@@ -1602,7 +1602,7 @@ msgstr ""
msgid "bom_item.part must point to the same part as the build order"
msgstr ""
-#: build/serializers.py:817 stock/serializers.py:1032
+#: build/serializers.py:817 stock/serializers.py:1038
msgid "Item must be in stock"
msgstr ""
@@ -1659,44 +1659,45 @@ msgstr ""
msgid "Allocate optional BOM items to build order"
msgstr ""
-#: build/serializers.py:1096 part/models.py:3895 part/models.py:4331
+#: build/serializers.py:1097 part/models.py:3895 part/models.py:4331
#: stock/api.py:745
msgid "BOM Item"
msgstr ""
-#: build/serializers.py:1105 templates/js/translated/index.js:130
+#: build/serializers.py:1106 templates/js/translated/index.js:130
msgid "Allocated Stock"
msgstr ""
-#: build/serializers.py:1110 part/admin.py:132 part/bom.py:173
-#: part/serializers.py:1441 part/templates/part/part_base.html:210
-#: templates/js/translated/bom.js:1202 templates/js/translated/build.js:2614
-#: templates/js/translated/part.js:709 templates/js/translated/part.js:2148
+#: build/serializers.py:1111 part/admin.py:132 part/bom.py:173
+#: part/serializers.py:798 part/serializers.py:1460
+#: part/templates/part/part_base.html:210 templates/js/translated/bom.js:1208
+#: templates/js/translated/build.js:2614 templates/js/translated/part.js:709
+#: templates/js/translated/part.js:2148
#: templates/js/translated/table_filters.js:170
msgid "On Order"
msgstr ""
-#: build/serializers.py:1115 part/serializers.py:1443
+#: build/serializers.py:1116 part/serializers.py:1462
#: templates/js/translated/build.js:2618
#: templates/js/translated/table_filters.js:360
msgid "In Production"
msgstr ""
-#: build/serializers.py:1120 part/bom.py:172 part/serializers.py:1454
+#: build/serializers.py:1121 part/bom.py:172 part/serializers.py:1473
#: part/templates/part/part_base.html:192
#: templates/js/translated/sales_order.js:1893
msgid "Available Stock"
msgstr ""
-#: build/tasks.py:149
+#: build/tasks.py:171
msgid "Stock required for build order"
msgstr ""
-#: build/tasks.py:166
+#: build/tasks.py:188
msgid "Overdue Build Order"
msgstr ""
-#: build/tasks.py:171
+#: build/tasks.py:193
#, python-brace-format
msgid "Build order {bo} is now overdue"
msgstr ""
@@ -1990,27 +1991,31 @@ msgstr "Gerekli parçaları sipariş edin"
msgid "Order Parts"
msgstr "Parça Siparişi"
-#: build/templates/build/detail.html:210
+#: build/templates/build/detail.html:205
+msgid "Available stock has been filtered based on specified source location for this build order"
+msgstr ""
+
+#: build/templates/build/detail.html:215
msgid "Incomplete Build Outputs"
msgstr "Tamamlanmamış Yapım İşi Çıktıları"
-#: build/templates/build/detail.html:214
+#: build/templates/build/detail.html:219
msgid "Create new build output"
msgstr "Yeni yapım işi çıktısı oluştur"
-#: build/templates/build/detail.html:215
+#: build/templates/build/detail.html:220
msgid "New Build Output"
msgstr ""
-#: build/templates/build/detail.html:232 build/templates/build/sidebar.html:15
+#: build/templates/build/detail.html:237 build/templates/build/sidebar.html:15
msgid "Consumed Stock"
msgstr ""
-#: build/templates/build/detail.html:244
+#: build/templates/build/detail.html:249
msgid "Completed Build Outputs"
msgstr "Tamamlanmış Yapım İşi Çıktıları"
-#: build/templates/build/detail.html:256 build/templates/build/sidebar.html:19
+#: build/templates/build/detail.html:261 build/templates/build/sidebar.html:19
#: company/templates/company/detail.html:229
#: company/templates/company/manufacturer_part.html:141
#: company/templates/company/manufacturer_part_sidebar.html:9
@@ -2026,15 +2031,15 @@ msgstr "Tamamlanmış Yapım İşi Çıktıları"
msgid "Attachments"
msgstr "Ekler"
-#: build/templates/build/detail.html:271
+#: build/templates/build/detail.html:276
msgid "Build Notes"
msgstr "Yapım İşi Notları"
-#: build/templates/build/detail.html:426
+#: build/templates/build/detail.html:434
msgid "Allocation Complete"
msgstr ""
-#: build/templates/build/detail.html:427
+#: build/templates/build/detail.html:435
msgid "All lines have been fully allocated"
msgstr ""
@@ -2436,7 +2441,7 @@ msgid "Parts are templates by default"
msgstr "Parçaları varsayılan olan şablondur"
#: common/models.py:1456 part/admin.py:91 part/admin.py:431 part/models.py:1015
-#: templates/js/translated/bom.js:1633
+#: templates/js/translated/bom.js:1639
#: templates/js/translated/table_filters.js:330
#: templates/js/translated/table_filters.js:721
msgid "Assembly"
@@ -3495,7 +3500,7 @@ msgstr ""
msgid "Price break quantity"
msgstr ""
-#: common/models.py:2440 company/serializers.py:484 order/admin.py:42
+#: common/models.py:2440 company/serializers.py:486 order/admin.py:42
#: order/models.py:1321 order/models.py:2226
#: templates/js/translated/company.js:1813 templates/js/translated/part.js:1885
#: templates/js/translated/pricing.js:621
@@ -3972,7 +3977,7 @@ msgstr "Parça seçin"
#: company/models.py:495 company/templates/company/company_base.html:76
#: company/templates/company/manufacturer_part.html:90
-#: company/templates/company/supplier_part.html:145 part/serializers.py:497
+#: company/templates/company/supplier_part.html:145 part/serializers.py:505
#: stock/templates/stock/item_base.html:207
#: templates/js/translated/company.js:506
#: templates/js/translated/company.js:1108
@@ -3987,7 +3992,7 @@ msgid "Select manufacturer"
msgstr "Üretici seçin"
#: company/models.py:502 company/templates/company/manufacturer_part.html:101
-#: company/templates/company/supplier_part.html:153 part/serializers.py:507
+#: company/templates/company/supplier_part.html:153 part/serializers.py:515
#: templates/js/translated/company.js:351
#: templates/js/translated/company.js:1107
#: templates/js/translated/company.js:1302
@@ -4059,7 +4064,7 @@ msgstr ""
#: company/models.py:795 company/templates/company/company_base.html:81
#: company/templates/company/supplier_part.html:129 order/models.py:453
#: order/templates/order/order_base.html:136 part/bom.py:272 part/bom.py:310
-#: part/serializers.py:481 plugin/builtin/suppliers/digikey.py:25
+#: part/serializers.py:489 plugin/builtin/suppliers/digikey.py:25
#: plugin/builtin/suppliers/lcsc.py:26 plugin/builtin/suppliers/mouser.py:24
#: plugin/builtin/suppliers/tme.py:26 stock/templates/stock/item_base.html:224
#: templates/email/overdue_purchase_order.html:16
@@ -4076,7 +4081,7 @@ msgstr "Tedarikçi"
msgid "Select supplier"
msgstr "Tedarikçi seçin"
-#: company/models.py:802 part/serializers.py:492
+#: company/models.py:802 part/serializers.py:500
msgid "Supplier stock keeping unit"
msgstr ""
@@ -4112,7 +4117,7 @@ msgid "Minimum charge (e.g. stocking fee)"
msgstr ""
#: company/models.py:851 company/templates/company/supplier_part.html:160
-#: stock/admin.py:224 stock/models.py:785 stock/serializers.py:1317
+#: stock/admin.py:224 stock/models.py:785 stock/serializers.py:1323
#: stock/templates/stock/item_base.html:240
#: templates/js/translated/company.js:1636
#: templates/js/translated/stock.js:2387
@@ -4157,7 +4162,7 @@ msgstr ""
msgid "Date of last update of availability data"
msgstr ""
-#: company/serializers.py:153
+#: company/serializers.py:155
msgid "Default currency used for this supplier"
msgstr ""
@@ -4218,7 +4223,7 @@ msgstr ""
#: company/templates/company/company_base.html:86 order/models.py:898
#: order/models.py:1993 order/templates/order/return_order_base.html:131
#: order/templates/order/sales_order_base.html:144 stock/models.py:807
-#: stock/models.py:808 stock/serializers.py:1067
+#: stock/models.py:808 stock/serializers.py:1073
#: stock/templates/stock/item_base.html:405
#: templates/email/overdue_sales_order.html:16
#: templates/js/translated/company.js:502
@@ -4429,8 +4434,9 @@ msgstr ""
#: company/templates/company/manufacturer_part.html:119
#: company/templates/company/supplier_part.html:15 company/views.py:31
-#: part/admin.py:122 part/templates/part/part_sidebar.html:33
-#: templates/InvenTree/search.html:190 templates/navbar.html:48
+#: part/admin.py:122 part/serializers.py:802
+#: part/templates/part/part_sidebar.html:33 templates/InvenTree/search.html:190
+#: templates/navbar.html:48
msgid "Suppliers"
msgstr ""
@@ -4528,7 +4534,7 @@ msgid "No supplier information available"
msgstr ""
#: company/templates/company/supplier_part.html:139 part/bom.py:279
-#: part/bom.py:311 part/serializers.py:491
+#: part/bom.py:311 part/serializers.py:499
#: templates/js/translated/company.js:349 templates/js/translated/part.js:1786
#: templates/js/translated/pricing.js:510
#: templates/js/translated/purchase_order.js:1851
@@ -4577,10 +4583,12 @@ msgstr ""
msgid "Update Part Availability"
msgstr ""
-#: company/templates/company/supplier_part_sidebar.html:5 part/stocktake.py:223
+#: company/templates/company/supplier_part_sidebar.html:5
+#: part/serializers.py:801 part/stocktake.py:223
#: part/templates/part/category.html:183
#: part/templates/part/category_sidebar.html:17 stock/admin.py:69
-#: stock/serializers.py:760 stock/templates/stock/location.html:170
+#: stock/serializers.py:760 stock/serializers.py:924
+#: stock/templates/stock/location.html:170
#: stock/templates/stock/location.html:184
#: stock/templates/stock/location.html:196
#: stock/templates/stock/location_sidebar.html:7
@@ -4640,7 +4648,7 @@ msgid "Label template file"
msgstr "Etiket şablon listesi"
#: label/models.py:143 part/models.py:3484 report/models.py:322
-#: templates/js/translated/part.js:2891
+#: templates/js/translated/part.js:2900
#: templates/js/translated/table_filters.js:481
msgid "Enabled"
msgstr "Etkin"
@@ -5733,7 +5741,7 @@ msgid "Pending Shipments"
msgstr ""
#: order/templates/order/sales_order_detail.html:71
-#: templates/js/translated/bom.js:1271 templates/js/translated/filters.js:296
+#: templates/js/translated/bom.js:1277 templates/js/translated/filters.js:296
msgid "Actions"
msgstr "İşlemler"
@@ -5861,10 +5869,10 @@ msgstr ""
msgid "Category Path"
msgstr ""
-#: part/admin.py:323 part/models.py:390 part/serializers.py:259
-#: part/serializers.py:373 part/templates/part/cat_link.html:3
-#: part/templates/part/category.html:23 part/templates/part/category.html:141
-#: part/templates/part/category.html:161
+#: part/admin.py:323 part/models.py:390 part/serializers.py:112
+#: part/serializers.py:265 part/serializers.py:381
+#: part/templates/part/cat_link.html:3 part/templates/part/category.html:23
+#: part/templates/part/category.html:141 part/templates/part/category.html:161
#: part/templates/part/category_sidebar.html:9
#: templates/InvenTree/index.html:36 templates/InvenTree/search.html:84
#: templates/InvenTree/settings/sidebar.html:47
@@ -5889,13 +5897,13 @@ msgstr ""
msgid "Part IPN"
msgstr ""
-#: part/admin.py:421 part/serializers.py:1220
+#: part/admin.py:421 part/serializers.py:1238
#: templates/js/translated/pricing.js:358
#: templates/js/translated/pricing.js:1024
msgid "Minimum Price"
msgstr ""
-#: part/admin.py:426 part/serializers.py:1235
+#: part/admin.py:426 part/serializers.py:1253
#: templates/js/translated/pricing.js:353
#: templates/js/translated/pricing.js:1032
msgid "Maximum Price"
@@ -5974,7 +5982,7 @@ msgid "This option must be selected"
msgstr ""
#: part/api.py:1541 part/models.py:895 part/models.py:3385 part/models.py:3831
-#: part/serializers.py:388 part/serializers.py:1076
+#: part/serializers.py:396 part/serializers.py:1094
#: part/templates/part/part_base.html:260 stock/api.py:733
#: templates/InvenTree/settings/settings_staff_js.html:300
#: templates/js/translated/notification.js:60
@@ -5982,12 +5990,17 @@ msgstr ""
msgid "Category"
msgstr ""
+#: part/api.py:1828
+msgid "Uses"
+msgstr ""
+
#: part/bom.py:170 part/models.py:100 part/models.py:938
#: part/templates/part/category.html:116 part/templates/part/part_base.html:367
msgid "Default Location"
msgstr "Varsayılan Konum"
-#: part/bom.py:171 templates/email/low_stock_notification.html:16
+#: part/bom.py:171 part/serializers.py:803
+#: templates/email/low_stock_notification.html:16
msgid "Total Stock"
msgstr ""
@@ -6010,7 +6023,8 @@ msgstr "Parça Kategorileri"
msgid "Default location for parts in this category"
msgstr "Bu kategori içindeki parçalar için varsayılan konum"
-#: part/models.py:106 stock/models.py:165 templates/js/translated/stock.js:2736
+#: part/models.py:106 stock/models.py:165 templates/js/translated/part.js:2810
+#: templates/js/translated/stock.js:2736
#: templates/js/translated/table_filters.js:239
#: templates/js/translated/table_filters.js:283
msgid "Structural"
@@ -6418,7 +6432,7 @@ msgstr "Test şablonları sadece takip edilebilir paçalar için oluşturulabili
msgid "Test with this name already exists for this part"
msgstr ""
-#: part/models.py:3464 templates/js/translated/part.js:2870
+#: part/models.py:3464 templates/js/translated/part.js:2879
msgid "Test Name"
msgstr "Test Adı"
@@ -6446,7 +6460,7 @@ msgstr ""
msgid "Is this test enabled?"
msgstr ""
-#: part/models.py:3489 templates/js/translated/part.js:2899
+#: part/models.py:3489 templates/js/translated/part.js:2908
#: templates/js/translated/table_filters.js:477
msgid "Required"
msgstr "Gerekli"
@@ -6455,7 +6469,7 @@ msgstr "Gerekli"
msgid "Is this test required to pass?"
msgstr "Testi geçmesi için bu gerekli mi?"
-#: part/models.py:3495 templates/js/translated/part.js:2907
+#: part/models.py:3495 templates/js/translated/part.js:2916
msgid "Requires Value"
msgstr ""
@@ -6463,7 +6477,7 @@ msgstr ""
msgid "Does this test require a value when adding a test result?"
msgstr ""
-#: part/models.py:3501 templates/js/translated/part.js:2914
+#: part/models.py:3501 templates/js/translated/part.js:2923
msgid "Requires Attachment"
msgstr ""
@@ -6685,311 +6699,323 @@ msgstr ""
msgid "Duplicate relationship already exists"
msgstr ""
-#: part/serializers.py:128 part/templates/part/category.html:122
-#: part/templates/part/category.html:207
+#: part/serializers.py:114 part/serializers.py:134
+#: part/templates/part/category.html:122 part/templates/part/category.html:207
#: part/templates/part/category_sidebar.html:7
msgid "Subcategories"
msgstr "Alt kategoriler"
-#: part/serializers.py:172
+#: part/serializers.py:178
msgid "Results"
msgstr ""
-#: part/serializers.py:173
+#: part/serializers.py:179
msgid "Number of results recorded against this template"
msgstr ""
-#: part/serializers.py:197 part/serializers.py:215 stock/serializers.py:384
+#: part/serializers.py:203 part/serializers.py:221 stock/serializers.py:384
msgid "Purchase currency of this stock item"
msgstr ""
-#: part/serializers.py:260
+#: part/serializers.py:266
msgid "Number of parts using this template"
msgstr ""
-#: part/serializers.py:379
+#: part/serializers.py:387
msgid "No parts selected"
msgstr ""
-#: part/serializers.py:389
+#: part/serializers.py:397
msgid "Select category"
msgstr ""
-#: part/serializers.py:419
+#: part/serializers.py:427
msgid "Original Part"
msgstr ""
-#: part/serializers.py:420
+#: part/serializers.py:428
msgid "Select original part to duplicate"
msgstr ""
-#: part/serializers.py:425
+#: part/serializers.py:433
msgid "Copy Image"
msgstr ""
-#: part/serializers.py:426
+#: part/serializers.py:434
msgid "Copy image from original part"
msgstr ""
-#: part/serializers.py:432 part/templates/part/detail.html:277
+#: part/serializers.py:440 part/templates/part/detail.html:277
msgid "Copy BOM"
msgstr ""
-#: part/serializers.py:433
+#: part/serializers.py:441
msgid "Copy bill of materials from original part"
msgstr ""
-#: part/serializers.py:439
+#: part/serializers.py:447
msgid "Copy Parameters"
msgstr ""
-#: part/serializers.py:440
+#: part/serializers.py:448
msgid "Copy parameter data from original part"
msgstr ""
-#: part/serializers.py:446
+#: part/serializers.py:454
msgid "Copy Notes"
msgstr ""
-#: part/serializers.py:447
+#: part/serializers.py:455
msgid "Copy notes from original part"
msgstr ""
-#: part/serializers.py:460
+#: part/serializers.py:468
msgid "Initial Stock Quantity"
msgstr ""
-#: part/serializers.py:462
+#: part/serializers.py:470
msgid "Specify initial stock quantity for this Part. If quantity is zero, no stock is added."
msgstr ""
-#: part/serializers.py:469
+#: part/serializers.py:477
msgid "Initial Stock Location"
msgstr ""
-#: part/serializers.py:470
+#: part/serializers.py:478
msgid "Specify initial stock location for this Part"
msgstr ""
-#: part/serializers.py:482
+#: part/serializers.py:490
msgid "Select supplier (or leave blank to skip)"
msgstr ""
-#: part/serializers.py:498
+#: part/serializers.py:506
msgid "Select manufacturer (or leave blank to skip)"
msgstr ""
-#: part/serializers.py:508
+#: part/serializers.py:516
msgid "Manufacturer part number"
msgstr ""
-#: part/serializers.py:515
+#: part/serializers.py:523
msgid "Selected company is not a valid supplier"
msgstr ""
-#: part/serializers.py:524
+#: part/serializers.py:532
msgid "Selected company is not a valid manufacturer"
msgstr ""
-#: part/serializers.py:535
+#: part/serializers.py:543
msgid "Manufacturer part matching this MPN already exists"
msgstr ""
-#: part/serializers.py:542
+#: part/serializers.py:550
msgid "Supplier part matching this SKU already exists"
msgstr ""
-#: part/serializers.py:815 part/templates/part/copy_part.html:9
+#: part/serializers.py:804
+msgid "External Stock"
+msgstr ""
+
+#: part/serializers.py:806
+msgid "Unallocated Stock"
+msgstr ""
+
+#: part/serializers.py:808
+msgid "Variant Stock"
+msgstr ""
+
+#: part/serializers.py:833 part/templates/part/copy_part.html:9
#: templates/js/translated/part.js:471
msgid "Duplicate Part"
msgstr ""
-#: part/serializers.py:816
+#: part/serializers.py:834
msgid "Copy initial data from another Part"
msgstr ""
-#: part/serializers.py:822 templates/js/translated/part.js:102
+#: part/serializers.py:840 templates/js/translated/part.js:102
msgid "Initial Stock"
msgstr ""
-#: part/serializers.py:823
+#: part/serializers.py:841
msgid "Create Part with initial stock quantity"
msgstr ""
-#: part/serializers.py:829
+#: part/serializers.py:847
msgid "Supplier Information"
msgstr ""
-#: part/serializers.py:830
+#: part/serializers.py:848
msgid "Add initial supplier information for this part"
msgstr ""
-#: part/serializers.py:838
+#: part/serializers.py:856
msgid "Copy Category Parameters"
msgstr ""
-#: part/serializers.py:839
+#: part/serializers.py:857
msgid "Copy parameter templates from selected part category"
msgstr ""
-#: part/serializers.py:844
+#: part/serializers.py:862
msgid "Existing Image"
msgstr ""
-#: part/serializers.py:845
+#: part/serializers.py:863
msgid "Filename of an existing part image"
msgstr ""
-#: part/serializers.py:862
+#: part/serializers.py:880
msgid "Image file does not exist"
msgstr ""
-#: part/serializers.py:1068
+#: part/serializers.py:1086
msgid "Limit stocktake report to a particular part, and any variant parts"
msgstr ""
-#: part/serializers.py:1078
+#: part/serializers.py:1096
msgid "Limit stocktake report to a particular part category, and any child categories"
msgstr ""
-#: part/serializers.py:1088
+#: part/serializers.py:1106
msgid "Limit stocktake report to a particular stock location, and any child locations"
msgstr ""
-#: part/serializers.py:1094
+#: part/serializers.py:1112
msgid "Exclude External Stock"
msgstr ""
-#: part/serializers.py:1095
+#: part/serializers.py:1113
msgid "Exclude stock items in external locations"
msgstr ""
-#: part/serializers.py:1100
+#: part/serializers.py:1118
msgid "Generate Report"
msgstr ""
-#: part/serializers.py:1101
+#: part/serializers.py:1119
msgid "Generate report file containing calculated stocktake data"
msgstr ""
-#: part/serializers.py:1106
+#: part/serializers.py:1124
msgid "Update Parts"
msgstr ""
-#: part/serializers.py:1107
+#: part/serializers.py:1125
msgid "Update specified parts with calculated stocktake data"
msgstr ""
-#: part/serializers.py:1115
+#: part/serializers.py:1133
msgid "Stocktake functionality is not enabled"
msgstr ""
-#: part/serializers.py:1221
+#: part/serializers.py:1239
msgid "Override calculated value for minimum price"
msgstr ""
-#: part/serializers.py:1228
+#: part/serializers.py:1246
msgid "Minimum price currency"
msgstr ""
-#: part/serializers.py:1236
+#: part/serializers.py:1254
msgid "Override calculated value for maximum price"
msgstr ""
-#: part/serializers.py:1243
+#: part/serializers.py:1261
msgid "Maximum price currency"
msgstr ""
-#: part/serializers.py:1272
+#: part/serializers.py:1290
msgid "Update"
msgstr ""
-#: part/serializers.py:1273
+#: part/serializers.py:1291
msgid "Update pricing for this part"
msgstr ""
-#: part/serializers.py:1296
+#: part/serializers.py:1314
#, python-brace-format
msgid "Could not convert from provided currencies to {default_currency}"
msgstr ""
-#: part/serializers.py:1303
+#: part/serializers.py:1321
msgid "Minimum price must not be greater than maximum price"
msgstr ""
-#: part/serializers.py:1306
+#: part/serializers.py:1324
msgid "Maximum price must not be less than minimum price"
msgstr ""
-#: part/serializers.py:1632
+#: part/serializers.py:1660
msgid "Select part to copy BOM from"
msgstr ""
-#: part/serializers.py:1640
+#: part/serializers.py:1668
msgid "Remove Existing Data"
msgstr ""
-#: part/serializers.py:1641
+#: part/serializers.py:1669
msgid "Remove existing BOM items before copying"
msgstr ""
-#: part/serializers.py:1646
+#: part/serializers.py:1674
msgid "Include Inherited"
msgstr ""
-#: part/serializers.py:1647
+#: part/serializers.py:1675
msgid "Include BOM items which are inherited from templated parts"
msgstr ""
-#: part/serializers.py:1652
+#: part/serializers.py:1680
msgid "Skip Invalid Rows"
msgstr ""
-#: part/serializers.py:1653
+#: part/serializers.py:1681
msgid "Enable this option to skip invalid rows"
msgstr ""
-#: part/serializers.py:1658
+#: part/serializers.py:1686
msgid "Copy Substitute Parts"
msgstr ""
-#: part/serializers.py:1659
+#: part/serializers.py:1687
msgid "Copy substitute parts when duplicate BOM items"
msgstr ""
-#: part/serializers.py:1693
+#: part/serializers.py:1721
msgid "Clear Existing BOM"
msgstr ""
-#: part/serializers.py:1694
+#: part/serializers.py:1722
msgid "Delete existing BOM items before uploading"
msgstr ""
-#: part/serializers.py:1724
+#: part/serializers.py:1752
msgid "No part column specified"
msgstr ""
-#: part/serializers.py:1768
+#: part/serializers.py:1796
msgid "Multiple matching parts found"
msgstr ""
-#: part/serializers.py:1771
+#: part/serializers.py:1799
msgid "No matching part found"
msgstr ""
-#: part/serializers.py:1774
+#: part/serializers.py:1802
msgid "Part is not designated as a component"
msgstr ""
-#: part/serializers.py:1783
+#: part/serializers.py:1811
msgid "Quantity not provided"
msgstr ""
-#: part/serializers.py:1791
+#: part/serializers.py:1819
msgid "Invalid quantity"
msgstr ""
-#: part/serializers.py:1812
+#: part/serializers.py:1840
msgid "At least one BOM item is required"
msgstr ""
@@ -7221,7 +7247,7 @@ msgid "Validate BOM"
msgstr ""
#: part/templates/part/detail.html:283 part/templates/part/detail.html:284
-#: templates/js/translated/bom.js:1314 templates/js/translated/bom.js:1315
+#: templates/js/translated/bom.js:1320 templates/js/translated/bom.js:1321
msgid "Add BOM Item"
msgstr ""
@@ -7405,7 +7431,7 @@ msgstr ""
msgid "Allocated to Sales Orders"
msgstr ""
-#: part/templates/part/part_base.html:235 templates/js/translated/bom.js:1213
+#: part/templates/part/part_base.html:235 templates/js/translated/bom.js:1219
msgid "Can Build"
msgstr ""
@@ -8784,7 +8810,7 @@ msgstr "Bu stok kalemi için tedarikçi parçası seçin"
msgid "Where is this stock item located?"
msgstr ""
-#: stock/models.py:786 stock/serializers.py:1318
+#: stock/models.py:786 stock/serializers.py:1324
msgid "Packaging this stock item is stored in"
msgstr ""
@@ -8796,7 +8822,7 @@ msgstr ""
msgid "Serial number for this item"
msgstr "Bu öge için seri numarası"
-#: stock/models.py:830 stock/serializers.py:1301
+#: stock/models.py:830 stock/serializers.py:1307
msgid "Batch code for this stock item"
msgstr ""
@@ -8905,7 +8931,7 @@ msgstr ""
msgid "Serialized stock cannot be merged"
msgstr ""
-#: stock/models.py:1639 stock/serializers.py:1207
+#: stock/models.py:1639 stock/serializers.py:1213
msgid "Duplicate stock items"
msgstr ""
@@ -8986,7 +9012,7 @@ msgstr ""
msgid "Enter serial numbers for new items"
msgstr ""
-#: stock/serializers.py:473 stock/serializers.py:1164 stock/serializers.py:1420
+#: stock/serializers.py:473 stock/serializers.py:1170 stock/serializers.py:1426
msgid "Destination stock location"
msgstr ""
@@ -9059,77 +9085,78 @@ msgstr ""
msgid "No stock items selected"
msgstr ""
-#: stock/serializers.py:863 stock/templates/stock/location.html:165
+#: stock/serializers.py:863 stock/serializers.py:926
+#: stock/templates/stock/location.html:165
#: stock/templates/stock/location.html:213
#: stock/templates/stock/location_sidebar.html:5
msgid "Sublocations"
msgstr "Alt konumlar"
-#: stock/serializers.py:1036
+#: stock/serializers.py:1042
msgid "Part must be salable"
msgstr ""
-#: stock/serializers.py:1040
+#: stock/serializers.py:1046
msgid "Item is allocated to a sales order"
msgstr ""
-#: stock/serializers.py:1044
+#: stock/serializers.py:1050
msgid "Item is allocated to a build order"
msgstr ""
-#: stock/serializers.py:1068
+#: stock/serializers.py:1074
msgid "Customer to assign stock items"
msgstr ""
-#: stock/serializers.py:1074
+#: stock/serializers.py:1080
msgid "Selected company is not a customer"
msgstr ""
-#: stock/serializers.py:1082
+#: stock/serializers.py:1088
msgid "Stock assignment notes"
msgstr ""
-#: stock/serializers.py:1092 stock/serializers.py:1346
+#: stock/serializers.py:1098 stock/serializers.py:1352
msgid "A list of stock items must be provided"
msgstr ""
-#: stock/serializers.py:1171
+#: stock/serializers.py:1177
msgid "Stock merging notes"
msgstr ""
-#: stock/serializers.py:1176
+#: stock/serializers.py:1182
msgid "Allow mismatched suppliers"
msgstr ""
-#: stock/serializers.py:1177
+#: stock/serializers.py:1183
msgid "Allow stock items with different supplier parts to be merged"
msgstr ""
-#: stock/serializers.py:1182
+#: stock/serializers.py:1188
msgid "Allow mismatched status"
msgstr ""
-#: stock/serializers.py:1183
+#: stock/serializers.py:1189
msgid "Allow stock items with different status codes to be merged"
msgstr ""
-#: stock/serializers.py:1193
+#: stock/serializers.py:1199
msgid "At least two stock items must be provided"
msgstr ""
-#: stock/serializers.py:1260
+#: stock/serializers.py:1266
msgid "No Change"
msgstr ""
-#: stock/serializers.py:1289
+#: stock/serializers.py:1295
msgid "StockItem primary key value"
msgstr ""
-#: stock/serializers.py:1308
+#: stock/serializers.py:1314
msgid "Stock item status code"
msgstr ""
-#: stock/serializers.py:1336
+#: stock/serializers.py:1342
msgid "Stock transaction notes"
msgstr ""
@@ -10662,7 +10689,7 @@ msgid "The following parts are low on required stock"
msgstr ""
#: templates/email/build_order_required_stock.html:18
-#: templates/js/translated/bom.js:1668 templates/js/translated/build.js:2557
+#: templates/js/translated/bom.js:1674 templates/js/translated/build.js:2557
msgid "Required Quantity"
msgstr ""
@@ -10676,7 +10703,7 @@ msgid "Click on the following link to view this part"
msgstr ""
#: templates/email/low_stock_notification.html:18
-#: templates/js/translated/part.js:3209
+#: templates/js/translated/part.js:3218
msgid "Minimum Quantity"
msgstr ""
@@ -11051,62 +11078,66 @@ msgstr ""
msgid "No pricing available"
msgstr ""
-#: templates/js/translated/bom.js:1182 templates/js/translated/build.js:2596
+#: templates/js/translated/bom.js:1184 templates/js/translated/build.js:2622
+msgid "External stock"
+msgstr ""
+
+#: templates/js/translated/bom.js:1188 templates/js/translated/build.js:2596
#: templates/js/translated/sales_order.js:1910
msgid "No Stock Available"
msgstr ""
-#: templates/js/translated/bom.js:1187 templates/js/translated/build.js:2600
+#: templates/js/translated/bom.js:1193 templates/js/translated/build.js:2600
msgid "Includes variant and substitute stock"
msgstr ""
-#: templates/js/translated/bom.js:1189 templates/js/translated/build.js:2602
+#: templates/js/translated/bom.js:1195 templates/js/translated/build.js:2602
#: templates/js/translated/part.js:1256
#: templates/js/translated/sales_order.js:1907
msgid "Includes variant stock"
msgstr ""
-#: templates/js/translated/bom.js:1191 templates/js/translated/build.js:2604
+#: templates/js/translated/bom.js:1197 templates/js/translated/build.js:2604
msgid "Includes substitute stock"
msgstr ""
-#: templates/js/translated/bom.js:1219 templates/js/translated/build.js:2587
+#: templates/js/translated/bom.js:1225 templates/js/translated/build.js:2587
msgid "Consumable item"
msgstr ""
-#: templates/js/translated/bom.js:1279
+#: templates/js/translated/bom.js:1285
msgid "Validate BOM Item"
msgstr ""
-#: templates/js/translated/bom.js:1281
+#: templates/js/translated/bom.js:1287
msgid "This line has been validated"
msgstr ""
-#: templates/js/translated/bom.js:1283
+#: templates/js/translated/bom.js:1289
msgid "Edit substitute parts"
msgstr ""
-#: templates/js/translated/bom.js:1285 templates/js/translated/bom.js:1480
+#: templates/js/translated/bom.js:1291 templates/js/translated/bom.js:1486
msgid "Edit BOM Item"
msgstr ""
-#: templates/js/translated/bom.js:1287
+#: templates/js/translated/bom.js:1293
msgid "Delete BOM Item"
msgstr ""
-#: templates/js/translated/bom.js:1307
+#: templates/js/translated/bom.js:1313
msgid "View BOM"
msgstr ""
-#: templates/js/translated/bom.js:1391
+#: templates/js/translated/bom.js:1397
msgid "No BOM items found"
msgstr ""
-#: templates/js/translated/bom.js:1651 templates/js/translated/build.js:2486
+#: templates/js/translated/bom.js:1657 templates/js/translated/build.js:2486
msgid "Required Part"
msgstr ""
-#: templates/js/translated/bom.js:1677
+#: templates/js/translated/bom.js:1683
msgid "Inherited from parent BOM"
msgstr ""
@@ -11449,29 +11480,29 @@ msgstr ""
msgid "Sufficient stock available"
msgstr ""
-#: templates/js/translated/build.js:2643
+#: templates/js/translated/build.js:2647
msgid "Consumable Item"
msgstr ""
-#: templates/js/translated/build.js:2648
+#: templates/js/translated/build.js:2652
msgid "Tracked item"
msgstr ""
-#: templates/js/translated/build.js:2655
+#: templates/js/translated/build.js:2659
#: templates/js/translated/sales_order.js:2016
msgid "Build stock"
msgstr ""
-#: templates/js/translated/build.js:2660 templates/js/translated/stock.js:1829
+#: templates/js/translated/build.js:2664 templates/js/translated/stock.js:1829
msgid "Order stock"
msgstr ""
-#: templates/js/translated/build.js:2664
+#: templates/js/translated/build.js:2668
#: templates/js/translated/sales_order.js:2010
msgid "Allocate stock"
msgstr ""
-#: templates/js/translated/build.js:2668
+#: templates/js/translated/build.js:2672
msgid "Remove stock allocation"
msgstr ""
@@ -12313,64 +12344,64 @@ msgstr ""
msgid "Subscribed category"
msgstr ""
-#: templates/js/translated/part.js:2855
+#: templates/js/translated/part.js:2864
msgid "No test templates matching query"
msgstr ""
-#: templates/js/translated/part.js:2877 templates/js/translated/search.js:342
+#: templates/js/translated/part.js:2886 templates/js/translated/search.js:342
msgid "results"
msgstr ""
-#: templates/js/translated/part.js:2927 templates/js/translated/stock.js:1446
+#: templates/js/translated/part.js:2936 templates/js/translated/stock.js:1446
msgid "Edit test result"
msgstr ""
-#: templates/js/translated/part.js:2928 templates/js/translated/stock.js:1447
+#: templates/js/translated/part.js:2937 templates/js/translated/stock.js:1447
#: templates/js/translated/stock.js:1692
msgid "Delete test result"
msgstr ""
-#: templates/js/translated/part.js:2932
+#: templates/js/translated/part.js:2941
msgid "This test is defined for a parent part"
msgstr ""
-#: templates/js/translated/part.js:2948
+#: templates/js/translated/part.js:2957
msgid "Edit Test Result Template"
msgstr ""
-#: templates/js/translated/part.js:2962
+#: templates/js/translated/part.js:2971
msgid "Delete Test Result Template"
msgstr ""
-#: templates/js/translated/part.js:3041 templates/js/translated/part.js:3042
+#: templates/js/translated/part.js:3050 templates/js/translated/part.js:3051
msgid "No date specified"
msgstr ""
-#: templates/js/translated/part.js:3044
+#: templates/js/translated/part.js:3053
msgid "Specified date is in the past"
msgstr ""
-#: templates/js/translated/part.js:3050
+#: templates/js/translated/part.js:3059
msgid "Speculative"
msgstr ""
-#: templates/js/translated/part.js:3100
+#: templates/js/translated/part.js:3109
msgid "No scheduling information available for this part"
msgstr ""
-#: templates/js/translated/part.js:3106
+#: templates/js/translated/part.js:3115
msgid "Error fetching scheduling information for this part"
msgstr ""
-#: templates/js/translated/part.js:3202
+#: templates/js/translated/part.js:3211
msgid "Scheduled Stock Quantities"
msgstr ""
-#: templates/js/translated/part.js:3218
+#: templates/js/translated/part.js:3227
msgid "Maximum Quantity"
msgstr ""
-#: templates/js/translated/part.js:3263
+#: templates/js/translated/part.js:3272
msgid "Minimum Stock Level"
msgstr ""
@@ -14052,4 +14083,3 @@ msgstr "Parçaları düzenleme izni"
#: users/models.py:413
msgid "Permission to delete items"
msgstr "Parçaları silme izni"
-
diff --git a/InvenTree/locale/vi/LC_MESSAGES/django.po b/InvenTree/locale/vi/LC_MESSAGES/django.po
index 5826ccb63e..97043eea21 100644
--- a/InvenTree/locale/vi/LC_MESSAGES/django.po
+++ b/InvenTree/locale/vi/LC_MESSAGES/django.po
@@ -2,7 +2,7 @@ msgid ""
msgstr ""
"Project-Id-Version: inventree\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2024-02-28 04:05+0000\n"
+"POT-Creation-Date: 2024-03-05 00:41+0000\n"
"PO-Revision-Date: 2024-02-28 07:23\n"
"Last-Translator: \n"
"Language-Team: Vietnamese\n"
@@ -66,9 +66,9 @@ msgstr "Nhập ngày"
#: report/templates/report/inventree_build_order_base.html:172
#: stock/admin.py:226 stock/models.py:2335 stock/models.py:2451
#: stock/serializers.py:479 stock/serializers.py:632 stock/serializers.py:728
-#: stock/serializers.py:778 stock/serializers.py:1081 stock/serializers.py:1170
-#: stock/serializers.py:1335 stock/templates/stock/stock_sidebar.html:25
-#: templates/js/translated/barcode.js:143 templates/js/translated/bom.js:1259
+#: stock/serializers.py:778 stock/serializers.py:1087 stock/serializers.py:1176
+#: stock/serializers.py:1341 stock/templates/stock/stock_sidebar.html:25
+#: templates/js/translated/barcode.js:143 templates/js/translated/bom.js:1265
#: templates/js/translated/company.js:1674 templates/js/translated/order.js:347
#: templates/js/translated/part.js:1080
#: templates/js/translated/purchase_order.js:2201
@@ -523,7 +523,7 @@ msgstr "Tên"
#: templates/js/translated/order.js:298 templates/js/translated/part.js:1238
#: templates/js/translated/part.js:1483 templates/js/translated/part.js:1621
#: templates/js/translated/part.js:1958 templates/js/translated/part.js:2355
-#: templates/js/translated/part.js:2785 templates/js/translated/part.js:2887
+#: templates/js/translated/part.js:2785 templates/js/translated/part.js:2896
#: templates/js/translated/plugin.js:80
#: templates/js/translated/purchase_order.js:1707
#: templates/js/translated/purchase_order.js:1850
@@ -678,7 +678,7 @@ msgstr "URL của tệp hình ảnh bên ngoài"
msgid "Downloading images from remote URL is not enabled"
msgstr "Chức năng tải hình ảnh từ URL bên ngoài không được bật"
-#: InvenTree/status.py:66 part/serializers.py:1120
+#: InvenTree/status.py:66 part/serializers.py:1138
msgid "Background worker check failed"
msgstr "Nhân công chạy ngầm kiểm tra thất bại"
@@ -960,7 +960,7 @@ msgid "Tracked"
msgstr "Đã theo dõi"
#: build/api.py:285 part/admin.py:144 templates/js/translated/build.js:1741
-#: templates/js/translated/build.js:2626
+#: templates/js/translated/build.js:2630
#: templates/js/translated/sales_order.js:1929
#: templates/js/translated/table_filters.js:571
msgid "Allocated"
@@ -1044,11 +1044,11 @@ msgstr "Đơn đặt bản dựng với bản dựng này đã được phân b
#: build/models.py:199 build/templates/build/build_base.html:97
#: build/templates/build/detail.html:29 company/models.py:1044
#: order/models.py:1389 order/models.py:1532 order/models.py:1533
-#: part/api.py:1528 part/models.py:389 part/models.py:3003 part/models.py:3147
-#: part/models.py:3291 part/models.py:3314 part/models.py:3335
-#: part/models.py:3357 part/models.py:3458 part/models.py:3754
-#: part/models.py:3885 part/models.py:3978 part/models.py:4339
-#: part/serializers.py:1066 part/serializers.py:1631
+#: part/api.py:1528 part/api.py:1820 part/models.py:389 part/models.py:3003
+#: part/models.py:3147 part/models.py:3291 part/models.py:3314
+#: part/models.py:3335 part/models.py:3357 part/models.py:3458
+#: part/models.py:3754 part/models.py:3885 part/models.py:3978
+#: part/models.py:4339 part/serializers.py:1084 part/serializers.py:1659
#: part/templates/part/part_app_base.html:8
#: part/templates/part/part_pricing.html:12
#: part/templates/part/upload_bom.html:52
@@ -1147,7 +1147,7 @@ msgid "Build status code"
msgstr "Mã trạng thái bản dựng"
#: build/models.py:264 build/serializers.py:280 order/serializers.py:549
-#: stock/models.py:826 stock/serializers.py:1300
+#: stock/models.py:826 stock/serializers.py:1306
#: templates/js/translated/purchase_order.js:1129
msgid "Batch Code"
msgstr "Mã lô hàng"
@@ -1242,48 +1242,48 @@ msgstr "Mã dự án"
msgid "Project code for this build order"
msgstr "Mã dự án cho đơn đặt bản dựng này"
-#: build/models.py:559
+#: build/models.py:575
#, python-brace-format
msgid "Build order {build} has been completed"
msgstr "Đơn đặt bản dựng {build} đã được hoàn thành"
-#: build/models.py:565
+#: build/models.py:581
msgid "A build order has been completed"
msgstr "Một đơn đặt bản dựng đã được hoàn thành"
-#: build/models.py:783 build/models.py:858
+#: build/models.py:799 build/models.py:874
msgid "No build output specified"
msgstr "Không có đầu ra bản dựng đã được chỉ ra"
-#: build/models.py:786
+#: build/models.py:802
msgid "Build output is already completed"
msgstr "Đầu ra bản dựng đã được hoàn thiện"
-#: build/models.py:789
+#: build/models.py:805
msgid "Build output does not match Build Order"
msgstr "Đầu ra bản dựng không phù hợp với đơn đặt bản dựng"
-#: build/models.py:862 build/serializers.py:223 build/serializers.py:262
+#: build/models.py:878 build/serializers.py:223 build/serializers.py:262
#: build/serializers.py:831 order/models.py:526 order/serializers.py:401
-#: order/serializers.py:544 part/serializers.py:1423 part/serializers.py:1789
+#: order/serializers.py:544 part/serializers.py:1442 part/serializers.py:1817
#: stock/models.py:665 stock/models.py:1477 stock/serializers.py:450
msgid "Quantity must be greater than zero"
msgstr "Số lượng phải lớn hơn 0"
-#: build/models.py:867 build/serializers.py:228
+#: build/models.py:883 build/serializers.py:228
msgid "Quantity cannot be greater than the output quantity"
msgstr "Số lượng không thể lớn hơn số lượng đầu ra"
-#: build/models.py:924 build/serializers.py:533
+#: build/models.py:940 build/serializers.py:533
#, python-brace-format
msgid "Build output {serial} has not passed all required tests"
msgstr ""
-#: build/models.py:1286
+#: build/models.py:1302
msgid "Build object"
msgstr "Dựng đối tượng"
-#: build/models.py:1300 build/models.py:1558 build/serializers.py:210
+#: build/models.py:1316 build/models.py:1574 build/serializers.py:210
#: build/serializers.py:247 build/templates/build/build_base.html:102
#: build/templates/build/detail.html:34 common/models.py:2432
#: order/models.py:1247 order/models.py:1902 order/serializers.py:1306
@@ -1310,7 +1310,7 @@ msgstr "Dựng đối tượng"
#: templates/js/translated/company.js:1808
#: templates/js/translated/model_renderers.js:230
#: templates/js/translated/order.js:304 templates/js/translated/part.js:961
-#: templates/js/translated/part.js:1811 templates/js/translated/part.js:3332
+#: templates/js/translated/part.js:1811 templates/js/translated/part.js:3341
#: templates/js/translated/pricing.js:381
#: templates/js/translated/pricing.js:474
#: templates/js/translated/pricing.js:522
@@ -1330,38 +1330,38 @@ msgstr "Dựng đối tượng"
msgid "Quantity"
msgstr "Số lượng"
-#: build/models.py:1301
+#: build/models.py:1317
msgid "Required quantity for build order"
msgstr "Yêu cầu số lượng để dựng đơn đặt"
-#: build/models.py:1381
+#: build/models.py:1397
msgid "Build item must specify a build output, as master part is marked as trackable"
msgstr "Xây dựng mục phải xác định đầu ra, bởi vì sản phẩm chủ được đánh dấu là có thể theo dõi"
-#: build/models.py:1390
+#: build/models.py:1406
#, python-brace-format
msgid "Allocated quantity ({q}) must not exceed available stock quantity ({a})"
msgstr "Số lượng được phân bổ ({q}) không thể vượt quá số lượng có trong kho ({a})"
-#: build/models.py:1400 order/models.py:1853
+#: build/models.py:1416 order/models.py:1853
msgid "Stock item is over-allocated"
msgstr "Kho hàng đã bị phân bổ quá đà"
-#: build/models.py:1406 order/models.py:1856
+#: build/models.py:1422 order/models.py:1856
msgid "Allocation quantity must be greater than zero"
msgstr "Số lượng phân bổ phải lớn hơn 0"
-#: build/models.py:1412
+#: build/models.py:1428
msgid "Quantity must be 1 for serialized stock"
msgstr "Số lượng phải là 1 cho kho sê ri"
-#: build/models.py:1473
+#: build/models.py:1489
msgid "Selected stock item does not match BOM line"
msgstr "Hàng trong kho đã chọn không phù hợp với đường BOM"
-#: build/models.py:1545 build/serializers.py:811 order/serializers.py:1150
-#: order/serializers.py:1171 stock/serializers.py:544 stock/serializers.py:1019
-#: stock/serializers.py:1131 stock/templates/stock/item_base.html:10
+#: build/models.py:1561 build/serializers.py:811 order/serializers.py:1150
+#: order/serializers.py:1171 stock/serializers.py:544 stock/serializers.py:1025
+#: stock/serializers.py:1137 stock/templates/stock/item_base.html:10
#: stock/templates/stock/item_base.html:23
#: stock/templates/stock/item_base.html:194
#: templates/js/translated/build.js:1742
@@ -1376,19 +1376,19 @@ msgstr "Hàng trong kho đã chọn không phù hợp với đường BOM"
msgid "Stock Item"
msgstr "Kho hàng"
-#: build/models.py:1546
+#: build/models.py:1562
msgid "Source stock item"
msgstr "Kho hàng gốc"
-#: build/models.py:1559
+#: build/models.py:1575
msgid "Stock quantity to allocate to build"
msgstr "Số lượng kho hàng cần chỉ định để xây dựng"
-#: build/models.py:1567
+#: build/models.py:1583
msgid "Install into"
msgstr "Cài đặt vào"
-#: build/models.py:1568
+#: build/models.py:1584
msgid "Destination stock item"
msgstr "Kho hàng đích"
@@ -1452,9 +1452,9 @@ msgid "A list of build outputs must be provided"
msgstr "Danh sách đầu ra bản dựng phải được cung cấp"
#: build/serializers.py:426 build/serializers.py:498 order/serializers.py:533
-#: order/serializers.py:641 order/serializers.py:1646 part/serializers.py:1086
+#: order/serializers.py:641 order/serializers.py:1646 part/serializers.py:1104
#: stock/serializers.py:472 stock/serializers.py:627 stock/serializers.py:723
-#: stock/serializers.py:1163 stock/serializers.py:1419
+#: stock/serializers.py:1169 stock/serializers.py:1425
#: stock/templates/stock/item_base.html:394
#: templates/js/translated/barcode.js:547
#: templates/js/translated/barcode.js:795 templates/js/translated/build.js:999
@@ -1494,7 +1494,7 @@ msgstr "Vị trí cho đầu ra bản dựng hoàn thiện"
#: build/serializers.py:505 build/templates/build/build_base.html:151
#: build/templates/build/detail.html:62 order/models.py:910
#: order/models.py:2005 order/serializers.py:565 stock/admin.py:165
-#: stock/serializers.py:774 stock/serializers.py:1307
+#: stock/serializers.py:774 stock/serializers.py:1313
#: stock/templates/stock/item_base.html:427
#: templates/js/translated/barcode.js:252 templates/js/translated/build.js:2189
#: templates/js/translated/purchase_order.js:1308
@@ -1602,7 +1602,7 @@ msgstr "Mục chi tiết bản dựng"
msgid "bom_item.part must point to the same part as the build order"
msgstr "bom_item.part phải trỏ đến phần tương tự của đơn đặt bản dựng"
-#: build/serializers.py:817 stock/serializers.py:1032
+#: build/serializers.py:817 stock/serializers.py:1038
msgid "Item must be in stock"
msgstr "Hàng hóa phải trong kho"
@@ -1659,44 +1659,45 @@ msgstr "Mục tùy chọn"
msgid "Allocate optional BOM items to build order"
msgstr "Phân bổ các mục hóa đơn vật liệu tùy chọn đến đơn đặt bản dựng"
-#: build/serializers.py:1096 part/models.py:3895 part/models.py:4331
+#: build/serializers.py:1097 part/models.py:3895 part/models.py:4331
#: stock/api.py:745
msgid "BOM Item"
msgstr "Mục BOM"
-#: build/serializers.py:1105 templates/js/translated/index.js:130
+#: build/serializers.py:1106 templates/js/translated/index.js:130
msgid "Allocated Stock"
msgstr ""
-#: build/serializers.py:1110 part/admin.py:132 part/bom.py:173
-#: part/serializers.py:1441 part/templates/part/part_base.html:210
-#: templates/js/translated/bom.js:1202 templates/js/translated/build.js:2614
-#: templates/js/translated/part.js:709 templates/js/translated/part.js:2148
+#: build/serializers.py:1111 part/admin.py:132 part/bom.py:173
+#: part/serializers.py:798 part/serializers.py:1460
+#: part/templates/part/part_base.html:210 templates/js/translated/bom.js:1208
+#: templates/js/translated/build.js:2614 templates/js/translated/part.js:709
+#: templates/js/translated/part.js:2148
#: templates/js/translated/table_filters.js:170
msgid "On Order"
msgstr "Bật đơn hàng"
-#: build/serializers.py:1115 part/serializers.py:1443
+#: build/serializers.py:1116 part/serializers.py:1462
#: templates/js/translated/build.js:2618
#: templates/js/translated/table_filters.js:360
msgid "In Production"
msgstr "Đang sản xuất"
-#: build/serializers.py:1120 part/bom.py:172 part/serializers.py:1454
+#: build/serializers.py:1121 part/bom.py:172 part/serializers.py:1473
#: part/templates/part/part_base.html:192
#: templates/js/translated/sales_order.js:1893
msgid "Available Stock"
msgstr "Số hàng tồn"
-#: build/tasks.py:149
+#: build/tasks.py:171
msgid "Stock required for build order"
msgstr "Kho được yêu cầu cho đặt hàng bản dựng"
-#: build/tasks.py:166
+#: build/tasks.py:188
msgid "Overdue Build Order"
msgstr "Đơn đặt bản dựng quá hạn"
-#: build/tasks.py:171
+#: build/tasks.py:193
#, python-brace-format
msgid "Build order {bo} is now overdue"
msgstr "Đặt hàng bản dựng {bo} đang quá hạn"
@@ -1990,27 +1991,31 @@ msgstr "Đơn đặt yêu cầu sản phẩm"
msgid "Order Parts"
msgstr "Đặt hàng sản phẩm"
-#: build/templates/build/detail.html:210
+#: build/templates/build/detail.html:205
+msgid "Available stock has been filtered based on specified source location for this build order"
+msgstr ""
+
+#: build/templates/build/detail.html:215
msgid "Incomplete Build Outputs"
msgstr "Đầu ra bản dựng chưa hoàn thành"
-#: build/templates/build/detail.html:214
+#: build/templates/build/detail.html:219
msgid "Create new build output"
msgstr "Tạo đầu ra bản dựng mới"
-#: build/templates/build/detail.html:215
+#: build/templates/build/detail.html:220
msgid "New Build Output"
msgstr "Đầu ra bản dựng mới"
-#: build/templates/build/detail.html:232 build/templates/build/sidebar.html:15
+#: build/templates/build/detail.html:237 build/templates/build/sidebar.html:15
msgid "Consumed Stock"
msgstr "Kho tiêu thụ"
-#: build/templates/build/detail.html:244
+#: build/templates/build/detail.html:249
msgid "Completed Build Outputs"
msgstr "Đầu ra bản dựng hoàn thiện"
-#: build/templates/build/detail.html:256 build/templates/build/sidebar.html:19
+#: build/templates/build/detail.html:261 build/templates/build/sidebar.html:19
#: company/templates/company/detail.html:229
#: company/templates/company/manufacturer_part.html:141
#: company/templates/company/manufacturer_part_sidebar.html:9
@@ -2026,15 +2031,15 @@ msgstr "Đầu ra bản dựng hoàn thiện"
msgid "Attachments"
msgstr "Tập tin đính kèm"
-#: build/templates/build/detail.html:271
+#: build/templates/build/detail.html:276
msgid "Build Notes"
msgstr "Ghi chép bản dựng"
-#: build/templates/build/detail.html:426
+#: build/templates/build/detail.html:434
msgid "Allocation Complete"
msgstr ""
-#: build/templates/build/detail.html:427
+#: build/templates/build/detail.html:435
msgid "All lines have been fully allocated"
msgstr ""
@@ -2436,7 +2441,7 @@ msgid "Parts are templates by default"
msgstr "Sản phẩm là mẫu bởi mặc định"
#: common/models.py:1456 part/admin.py:91 part/admin.py:431 part/models.py:1015
-#: templates/js/translated/bom.js:1633
+#: templates/js/translated/bom.js:1639
#: templates/js/translated/table_filters.js:330
#: templates/js/translated/table_filters.js:721
msgid "Assembly"
@@ -3495,7 +3500,7 @@ msgstr ""
msgid "Price break quantity"
msgstr "Số lượng giá phá vỡ"
-#: common/models.py:2440 company/serializers.py:484 order/admin.py:42
+#: common/models.py:2440 company/serializers.py:486 order/admin.py:42
#: order/models.py:1321 order/models.py:2226
#: templates/js/translated/company.js:1813 templates/js/translated/part.js:1885
#: templates/js/translated/pricing.js:621
@@ -3972,7 +3977,7 @@ msgstr "Chọn sản phẩm"
#: company/models.py:495 company/templates/company/company_base.html:76
#: company/templates/company/manufacturer_part.html:90
-#: company/templates/company/supplier_part.html:145 part/serializers.py:497
+#: company/templates/company/supplier_part.html:145 part/serializers.py:505
#: stock/templates/stock/item_base.html:207
#: templates/js/translated/company.js:506
#: templates/js/translated/company.js:1108
@@ -3987,7 +3992,7 @@ msgid "Select manufacturer"
msgstr "Chọn nhà sản xuất"
#: company/models.py:502 company/templates/company/manufacturer_part.html:101
-#: company/templates/company/supplier_part.html:153 part/serializers.py:507
+#: company/templates/company/supplier_part.html:153 part/serializers.py:515
#: templates/js/translated/company.js:351
#: templates/js/translated/company.js:1107
#: templates/js/translated/company.js:1302
@@ -4059,7 +4064,7 @@ msgstr "Sản phẩm nhà sản xuất đã liên kết phải tham chiếu vớ
#: company/models.py:795 company/templates/company/company_base.html:81
#: company/templates/company/supplier_part.html:129 order/models.py:453
#: order/templates/order/order_base.html:136 part/bom.py:272 part/bom.py:310
-#: part/serializers.py:481 plugin/builtin/suppliers/digikey.py:25
+#: part/serializers.py:489 plugin/builtin/suppliers/digikey.py:25
#: plugin/builtin/suppliers/lcsc.py:26 plugin/builtin/suppliers/mouser.py:24
#: plugin/builtin/suppliers/tme.py:26 stock/templates/stock/item_base.html:224
#: templates/email/overdue_purchase_order.html:16
@@ -4076,7 +4081,7 @@ msgstr "Nhà cung cấp"
msgid "Select supplier"
msgstr "Chọn nhà cung cấp"
-#: company/models.py:802 part/serializers.py:492
+#: company/models.py:802 part/serializers.py:500
msgid "Supplier stock keeping unit"
msgstr "Đơn vị quản lý kho nhà cung cấp"
@@ -4112,7 +4117,7 @@ msgid "Minimum charge (e.g. stocking fee)"
msgstr "Thu phí tối thiểu (vd: phí kho bãi)"
#: company/models.py:851 company/templates/company/supplier_part.html:160
-#: stock/admin.py:224 stock/models.py:785 stock/serializers.py:1317
+#: stock/admin.py:224 stock/models.py:785 stock/serializers.py:1323
#: stock/templates/stock/item_base.html:240
#: templates/js/translated/company.js:1636
#: templates/js/translated/stock.js:2387
@@ -4157,7 +4162,7 @@ msgstr "Sẵn hàng đã được cập nhật"
msgid "Date of last update of availability data"
msgstr "Ngày cập nhật cuối thông tin tồn kho"
-#: company/serializers.py:153
+#: company/serializers.py:155
msgid "Default currency used for this supplier"
msgstr "Tiền tệ mặc định được sử dụng cho nhà cung cấp này"
@@ -4218,7 +4223,7 @@ msgstr "Xóa ảnh"
#: company/templates/company/company_base.html:86 order/models.py:898
#: order/models.py:1993 order/templates/order/return_order_base.html:131
#: order/templates/order/sales_order_base.html:144 stock/models.py:807
-#: stock/models.py:808 stock/serializers.py:1067
+#: stock/models.py:808 stock/serializers.py:1073
#: stock/templates/stock/item_base.html:405
#: templates/email/overdue_sales_order.html:16
#: templates/js/translated/company.js:502
@@ -4429,8 +4434,9 @@ msgstr "Chưa có thông tin nhà sản xuất"
#: company/templates/company/manufacturer_part.html:119
#: company/templates/company/supplier_part.html:15 company/views.py:31
-#: part/admin.py:122 part/templates/part/part_sidebar.html:33
-#: templates/InvenTree/search.html:190 templates/navbar.html:48
+#: part/admin.py:122 part/serializers.py:802
+#: part/templates/part/part_sidebar.html:33 templates/InvenTree/search.html:190
+#: templates/navbar.html:48
msgid "Suppliers"
msgstr "Nhà cung cấp"
@@ -4528,7 +4534,7 @@ msgid "No supplier information available"
msgstr "Chưa có thông tin nhà cung cấp"
#: company/templates/company/supplier_part.html:139 part/bom.py:279
-#: part/bom.py:311 part/serializers.py:491
+#: part/bom.py:311 part/serializers.py:499
#: templates/js/translated/company.js:349 templates/js/translated/part.js:1786
#: templates/js/translated/pricing.js:510
#: templates/js/translated/purchase_order.js:1851
@@ -4577,10 +4583,12 @@ msgstr "Liên kết mã vạch đến hàng hóa nhà cung cấp"
msgid "Update Part Availability"
msgstr "Cập nhật độ sẵn sàng sản phẩm"
-#: company/templates/company/supplier_part_sidebar.html:5 part/stocktake.py:223
+#: company/templates/company/supplier_part_sidebar.html:5
+#: part/serializers.py:801 part/stocktake.py:223
#: part/templates/part/category.html:183
#: part/templates/part/category_sidebar.html:17 stock/admin.py:69
-#: stock/serializers.py:760 stock/templates/stock/location.html:170
+#: stock/serializers.py:760 stock/serializers.py:924
+#: stock/templates/stock/location.html:170
#: stock/templates/stock/location.html:184
#: stock/templates/stock/location.html:196
#: stock/templates/stock/location_sidebar.html:7
@@ -4640,7 +4648,7 @@ msgid "Label template file"
msgstr "Tệp mẫu nhãn"
#: label/models.py:143 part/models.py:3484 report/models.py:322
-#: templates/js/translated/part.js:2891
+#: templates/js/translated/part.js:2900
#: templates/js/translated/table_filters.js:481
msgid "Enabled"
msgstr "Đã bật"
@@ -5733,7 +5741,7 @@ msgid "Pending Shipments"
msgstr "Vận chuyển đang chờ xử lý"
#: order/templates/order/sales_order_detail.html:71
-#: templates/js/translated/bom.js:1271 templates/js/translated/filters.js:296
+#: templates/js/translated/bom.js:1277 templates/js/translated/filters.js:296
msgid "Actions"
msgstr "Chức năng"
@@ -5861,10 +5869,10 @@ msgstr "Tên cha"
msgid "Category Path"
msgstr "Đưỡng dẫn danh mục"
-#: part/admin.py:323 part/models.py:390 part/serializers.py:259
-#: part/serializers.py:373 part/templates/part/cat_link.html:3
-#: part/templates/part/category.html:23 part/templates/part/category.html:141
-#: part/templates/part/category.html:161
+#: part/admin.py:323 part/models.py:390 part/serializers.py:112
+#: part/serializers.py:265 part/serializers.py:381
+#: part/templates/part/cat_link.html:3 part/templates/part/category.html:23
+#: part/templates/part/category.html:141 part/templates/part/category.html:161
#: part/templates/part/category_sidebar.html:9
#: templates/InvenTree/index.html:36 templates/InvenTree/search.html:84
#: templates/InvenTree/settings/sidebar.html:47
@@ -5889,13 +5897,13 @@ msgstr "IPN cha"
msgid "Part IPN"
msgstr "IPN sản phẩm"
-#: part/admin.py:421 part/serializers.py:1220
+#: part/admin.py:421 part/serializers.py:1238
#: templates/js/translated/pricing.js:358
#: templates/js/translated/pricing.js:1024
msgid "Minimum Price"
msgstr "Giá thấp nhất"
-#: part/admin.py:426 part/serializers.py:1235
+#: part/admin.py:426 part/serializers.py:1253
#: templates/js/translated/pricing.js:353
#: templates/js/translated/pricing.js:1032
msgid "Maximum Price"
@@ -5974,7 +5982,7 @@ msgid "This option must be selected"
msgstr "Tùy chọn này phải được chọn"
#: part/api.py:1541 part/models.py:895 part/models.py:3385 part/models.py:3831
-#: part/serializers.py:388 part/serializers.py:1076
+#: part/serializers.py:396 part/serializers.py:1094
#: part/templates/part/part_base.html:260 stock/api.py:733
#: templates/InvenTree/settings/settings_staff_js.html:300
#: templates/js/translated/notification.js:60
@@ -5982,12 +5990,17 @@ msgstr "Tùy chọn này phải được chọn"
msgid "Category"
msgstr "Danh mục"
+#: part/api.py:1828
+msgid "Uses"
+msgstr ""
+
#: part/bom.py:170 part/models.py:100 part/models.py:938
#: part/templates/part/category.html:116 part/templates/part/part_base.html:367
msgid "Default Location"
msgstr "Điểm bán mặc định"
-#: part/bom.py:171 templates/email/low_stock_notification.html:16
+#: part/bom.py:171 part/serializers.py:803
+#: templates/email/low_stock_notification.html:16
msgid "Total Stock"
msgstr "Tổng số lượng"
@@ -6010,7 +6023,8 @@ msgstr "Danh mục sản phẩm"
msgid "Default location for parts in this category"
msgstr "Vị trí mặc định cho sản phẩm trong danh mục này"
-#: part/models.py:106 stock/models.py:165 templates/js/translated/stock.js:2736
+#: part/models.py:106 stock/models.py:165 templates/js/translated/part.js:2810
+#: templates/js/translated/stock.js:2736
#: templates/js/translated/table_filters.js:239
#: templates/js/translated/table_filters.js:283
msgid "Structural"
@@ -6418,7 +6432,7 @@ msgstr "Chỉ có thể tạo mẫu kiểm thử cho sản phẩm có thể theo
msgid "Test with this name already exists for this part"
msgstr "Kiểm thử với tên này đã tồn tại cho sản phẩm này"
-#: part/models.py:3464 templates/js/translated/part.js:2870
+#: part/models.py:3464 templates/js/translated/part.js:2879
msgid "Test Name"
msgstr "Tên kiểm thử"
@@ -6446,7 +6460,7 @@ msgstr "Nhập mô tả cho kiểm thử này"
msgid "Is this test enabled?"
msgstr ""
-#: part/models.py:3489 templates/js/translated/part.js:2899
+#: part/models.py:3489 templates/js/translated/part.js:2908
#: templates/js/translated/table_filters.js:477
msgid "Required"
msgstr "Bắt buộc"
@@ -6455,7 +6469,7 @@ msgstr "Bắt buộc"
msgid "Is this test required to pass?"
msgstr "Kiểm thử này bắt buộc phải đạt?"
-#: part/models.py:3495 templates/js/translated/part.js:2907
+#: part/models.py:3495 templates/js/translated/part.js:2916
msgid "Requires Value"
msgstr "Giá trị bắt buộc"
@@ -6463,7 +6477,7 @@ msgstr "Giá trị bắt buộc"
msgid "Does this test require a value when adding a test result?"
msgstr "Kiểm thử này yêu cầu 1 giá trị khi thêm một kết quả kiểm thử?"
-#: part/models.py:3501 templates/js/translated/part.js:2914
+#: part/models.py:3501 templates/js/translated/part.js:2923
msgid "Requires Attachment"
msgstr "Yêu cầu đính kèm"
@@ -6685,311 +6699,329 @@ msgstr "Không thể tạo mối quan hệ giữa một sản phẩm và chính
msgid "Duplicate relationship already exists"
msgstr "Đã tồn tại mối quan hệ trùng lặp"
-#: part/serializers.py:128 part/templates/part/category.html:122
-#: part/templates/part/category.html:207
+#: part/serializers.py:114 part/serializers.py:134
+#: part/templates/part/category.html:122 part/templates/part/category.html:207
#: part/templates/part/category_sidebar.html:7
msgid "Subcategories"
msgstr "Phụ mục"
-#: part/serializers.py:172
+#: part/serializers.py:178
msgid "Results"
msgstr ""
-#: part/serializers.py:173
+#: part/serializers.py:179
msgid "Number of results recorded against this template"
msgstr ""
-#: part/serializers.py:197 part/serializers.py:215 stock/serializers.py:384
+#: part/serializers.py:203 part/serializers.py:221 stock/serializers.py:384
msgid "Purchase currency of this stock item"
msgstr "Loại tiền mua hàng của hàng hóa này"
-#: part/serializers.py:260
+#: part/serializers.py:266
msgid "Number of parts using this template"
msgstr ""
-#: part/serializers.py:379
+#: part/serializers.py:387
msgid "No parts selected"
msgstr "Chưa chọn sản phẩm"
-#: part/serializers.py:389
+#: part/serializers.py:397
msgid "Select category"
msgstr "Chọn danh mục"
-#: part/serializers.py:419
+#: part/serializers.py:427
msgid "Original Part"
msgstr "Sản phẩm gốc"
-#: part/serializers.py:420
+#: part/serializers.py:428
msgid "Select original part to duplicate"
msgstr "Chọn sản phẩm gốc để nhân bản"
-#: part/serializers.py:425
+#: part/serializers.py:433
msgid "Copy Image"
msgstr "Sao chép ảnh"
-#: part/serializers.py:426
+#: part/serializers.py:434
msgid "Copy image from original part"
msgstr "Sao chép hình ảnh từ sản phẩm gốc"
-#: part/serializers.py:432 part/templates/part/detail.html:277
+#: part/serializers.py:440 part/templates/part/detail.html:277
msgid "Copy BOM"
msgstr "Sao chép BOM"
-#: part/serializers.py:433
+#: part/serializers.py:441
msgid "Copy bill of materials from original part"
msgstr "Sao chép định mức nguyên vật liệu từ sản phẩm gốc"
-#: part/serializers.py:439
+#: part/serializers.py:447
msgid "Copy Parameters"
msgstr "Sao chép thông số"
-#: part/serializers.py:440
+#: part/serializers.py:448
msgid "Copy parameter data from original part"
msgstr "Sao chép thông tin tham số từ sản phẩm gốc"
-#: part/serializers.py:446
+#: part/serializers.py:454
msgid "Copy Notes"
msgstr "Sao chép ghi chú"
-#: part/serializers.py:447
+#: part/serializers.py:455
msgid "Copy notes from original part"
msgstr "Sao chép ghi chú từ sản phẩm gốc"
-#: part/serializers.py:460
+#: part/serializers.py:468
msgid "Initial Stock Quantity"
msgstr "Số liệu tồn kho ban đầu"
-#: part/serializers.py:462
+#: part/serializers.py:470
msgid "Specify initial stock quantity for this Part. If quantity is zero, no stock is added."
msgstr "Chỉ ra số lượng tồn kho ban đầu cho sản phẩm. Nếu điền là không, không thêm kho nào."
-#: part/serializers.py:469
+#: part/serializers.py:477
msgid "Initial Stock Location"
msgstr "Vị trí kho ban đầu"
-#: part/serializers.py:470
+#: part/serializers.py:478
msgid "Specify initial stock location for this Part"
msgstr "Chỉ định vị trí kho ban đầu cho sản phẩm này"
-#: part/serializers.py:482
+#: part/serializers.py:490
msgid "Select supplier (or leave blank to skip)"
msgstr "Chọn nhà cung cấp (hoặc để trống để bỏ qua)"
-#: part/serializers.py:498
+#: part/serializers.py:506
msgid "Select manufacturer (or leave blank to skip)"
msgstr "Chọn nhà sản xuất (hoặc để trống để bỏ qua)"
-#: part/serializers.py:508
+#: part/serializers.py:516
msgid "Manufacturer part number"
msgstr "Mã số nhà sản xuất"
-#: part/serializers.py:515
+#: part/serializers.py:523
msgid "Selected company is not a valid supplier"
msgstr "Công ty đã chọn không phải là nhà cung ứng hợp lệ"
-#: part/serializers.py:524
+#: part/serializers.py:532
msgid "Selected company is not a valid manufacturer"
msgstr "Công ty đã chọn không phải là nhà sản xuất hợp lệ"
-#: part/serializers.py:535
+#: part/serializers.py:543
msgid "Manufacturer part matching this MPN already exists"
msgstr "Mã số nhà sản xuất khớp với MPN này đã tồn tại"
-#: part/serializers.py:542
+#: part/serializers.py:550
msgid "Supplier part matching this SKU already exists"
msgstr "Mã số nhà cung cấp khớp với SKU này đã tồn tại"
-#: part/serializers.py:815 part/templates/part/copy_part.html:9
+#: part/serializers.py:804
+#, fuzzy
+#| msgid "Exclude External Stock"
+msgid "External Stock"
+msgstr "Ngoại trừ kho bên ngoài"
+
+#: part/serializers.py:806
+#, fuzzy
+#| msgid "Deallocate Stock"
+msgid "Unallocated Stock"
+msgstr "Phân kho"
+
+#: part/serializers.py:808
+#, fuzzy
+#| msgid "Part Stock"
+msgid "Variant Stock"
+msgstr "Kho hàng"
+
+#: part/serializers.py:833 part/templates/part/copy_part.html:9
#: templates/js/translated/part.js:471
msgid "Duplicate Part"
msgstr "Nhân bản sản phẩm"
-#: part/serializers.py:816
+#: part/serializers.py:834
msgid "Copy initial data from another Part"
msgstr "Sao chép dữ liệu ban đầu từ sản phẩm khác"
-#: part/serializers.py:822 templates/js/translated/part.js:102
+#: part/serializers.py:840 templates/js/translated/part.js:102
msgid "Initial Stock"
msgstr "Số liệu kho ban đầu"
-#: part/serializers.py:823
+#: part/serializers.py:841
msgid "Create Part with initial stock quantity"
msgstr "Tạo sản phẩm với số lượng tồn kho ban đầu"
-#: part/serializers.py:829
+#: part/serializers.py:847
msgid "Supplier Information"
msgstr "Thông tin nhà cung cấp"
-#: part/serializers.py:830
+#: part/serializers.py:848
msgid "Add initial supplier information for this part"
msgstr "Thêm thông tin nhà cung cấp ban đầu cho sản phẩm này"
-#: part/serializers.py:838
+#: part/serializers.py:856
msgid "Copy Category Parameters"
msgstr "Sao chép thông số nhóm hàng"
-#: part/serializers.py:839
+#: part/serializers.py:857
msgid "Copy parameter templates from selected part category"
msgstr "Sao chép mẫu tham số từ nhóm sản phẩm được chọn"
-#: part/serializers.py:844
+#: part/serializers.py:862
msgid "Existing Image"
msgstr "Ảnh hiện có"
-#: part/serializers.py:845
+#: part/serializers.py:863
msgid "Filename of an existing part image"
msgstr "Tên tệp của ảnh sản phẩm hiện hữu"
-#: part/serializers.py:862
+#: part/serializers.py:880
msgid "Image file does not exist"
msgstr "Tệp hình ảnh không tồn tại"
-#: part/serializers.py:1068
+#: part/serializers.py:1086
msgid "Limit stocktake report to a particular part, and any variant parts"
msgstr "Hạn chế báo cáo kiểm kê với sản phẩm riêng biệt và sản phẩm biến thể bất kỳ"
-#: part/serializers.py:1078
+#: part/serializers.py:1096
msgid "Limit stocktake report to a particular part category, and any child categories"
msgstr "Hạn chế báo cáo kiểm kê với danh mục sản phẩm riêng biệt và danh mục con bất kỳ"
-#: part/serializers.py:1088
+#: part/serializers.py:1106
msgid "Limit stocktake report to a particular stock location, and any child locations"
msgstr "Hạn chế báo cáo kiểm kê với vị trí kho riêng biệt và vị trí con bất kỳ"
-#: part/serializers.py:1094
+#: part/serializers.py:1112
msgid "Exclude External Stock"
msgstr "Ngoại trừ kho bên ngoài"
-#: part/serializers.py:1095
+#: part/serializers.py:1113
msgid "Exclude stock items in external locations"
msgstr "Loại trừ hàng trong kho của vị trí bên ngoài"
-#: part/serializers.py:1100
+#: part/serializers.py:1118
msgid "Generate Report"
msgstr "Tạo báo cáo"
-#: part/serializers.py:1101
+#: part/serializers.py:1119
msgid "Generate report file containing calculated stocktake data"
msgstr "Tạo tệp báo cáo chứa dữ liệu kiểm kê đã tính toán"
-#: part/serializers.py:1106
+#: part/serializers.py:1124
msgid "Update Parts"
msgstr "Cập nhật sản phẩm"
-#: part/serializers.py:1107
+#: part/serializers.py:1125
msgid "Update specified parts with calculated stocktake data"
msgstr "Cập nhật sản phẩm cụ thể với dữ liệu kiểm kê đã tính"
-#: part/serializers.py:1115
+#: part/serializers.py:1133
msgid "Stocktake functionality is not enabled"
msgstr "Chức năng kiểm kê chưa được bật"
-#: part/serializers.py:1221
+#: part/serializers.py:1239
msgid "Override calculated value for minimum price"
msgstr "Giá trị tính toán ghi đè cho giá tối thiểu"
-#: part/serializers.py:1228
+#: part/serializers.py:1246
msgid "Minimum price currency"
msgstr "Tiền tế giá tối thiểu"
-#: part/serializers.py:1236
+#: part/serializers.py:1254
msgid "Override calculated value for maximum price"
msgstr "Giá trị tính toán ghi đè cho giá tối đa"
-#: part/serializers.py:1243
+#: part/serializers.py:1261
msgid "Maximum price currency"
msgstr "Tiền tế giá tối đa"
-#: part/serializers.py:1272
+#: part/serializers.py:1290
msgid "Update"
msgstr "Cập nhật"
-#: part/serializers.py:1273
+#: part/serializers.py:1291
msgid "Update pricing for this part"
msgstr "Cập nhật giá cho sản phẩm này"
-#: part/serializers.py:1296
+#: part/serializers.py:1314
#, python-brace-format
msgid "Could not convert from provided currencies to {default_currency}"
msgstr "Không thể chuyển đổi từ tiền tệ đã cung cấp cho {default_currency}"
-#: part/serializers.py:1303
+#: part/serializers.py:1321
msgid "Minimum price must not be greater than maximum price"
msgstr "Giá tối thiểu không được lớn hơn giá tối đa"
-#: part/serializers.py:1306
+#: part/serializers.py:1324
msgid "Maximum price must not be less than minimum price"
msgstr "Giá tối đa không được nhỏ hơn giá tối thiểu"
-#: part/serializers.py:1632
+#: part/serializers.py:1660
msgid "Select part to copy BOM from"
msgstr "Chọn sản phẩm để sao chép định mức nguyên vật liệu"
-#: part/serializers.py:1640
+#: part/serializers.py:1668
msgid "Remove Existing Data"
msgstr "Xóa dữ liệu đã tồn tại"
-#: part/serializers.py:1641
+#: part/serializers.py:1669
msgid "Remove existing BOM items before copying"
msgstr "Xóa mục BOM đã tồn tại trước khi sao chép"
-#: part/serializers.py:1646
+#: part/serializers.py:1674
msgid "Include Inherited"
msgstr "Bao gồm thừa hưởng"
-#: part/serializers.py:1647
+#: part/serializers.py:1675
msgid "Include BOM items which are inherited from templated parts"
msgstr "Bao gồm mục BOM được thừa hưởng từ sản phẩm mẫu"
-#: part/serializers.py:1652
+#: part/serializers.py:1680
msgid "Skip Invalid Rows"
msgstr "Bỏ qua dòng không hợp lệ"
-#: part/serializers.py:1653
+#: part/serializers.py:1681
msgid "Enable this option to skip invalid rows"
msgstr "Bật tùy chọn này để bỏ qua dòng không hợp lệ"
-#: part/serializers.py:1658
+#: part/serializers.py:1686
msgid "Copy Substitute Parts"
msgstr "Sao chép sản phẩm thay thế"
-#: part/serializers.py:1659
+#: part/serializers.py:1687
msgid "Copy substitute parts when duplicate BOM items"
msgstr "Sao chép sản phẩm thay thế khi nhân bản hàng hóa BOM"
-#: part/serializers.py:1693
+#: part/serializers.py:1721
msgid "Clear Existing BOM"
msgstr "Dọn dẹp BOM đang tồn tại"
-#: part/serializers.py:1694
+#: part/serializers.py:1722
msgid "Delete existing BOM items before uploading"
msgstr "Xóa mục BOM đang tồn tại trước khi tải lên"
-#: part/serializers.py:1724
+#: part/serializers.py:1752
msgid "No part column specified"
msgstr "Chưa chỉ ra cột sản phẩm"
-#: part/serializers.py:1768
+#: part/serializers.py:1796
msgid "Multiple matching parts found"
msgstr "Tìm thấy nhiều sản phẩm phù hợp"
-#: part/serializers.py:1771
+#: part/serializers.py:1799
msgid "No matching part found"
msgstr "Không tìm thấy sản phẩm nào"
-#: part/serializers.py:1774
+#: part/serializers.py:1802
msgid "Part is not designated as a component"
msgstr "Sản phẩm không được chỉ định như là một thành phần"
-#: part/serializers.py:1783
+#: part/serializers.py:1811
msgid "Quantity not provided"
msgstr "Chưa cung cấp số lượng"
-#: part/serializers.py:1791
+#: part/serializers.py:1819
msgid "Invalid quantity"
msgstr "Số lượng không hợp lệ"
-#: part/serializers.py:1812
+#: part/serializers.py:1840
msgid "At least one BOM item is required"
msgstr "Buộc phải nhập ít nhất một mục BOM"
@@ -7221,7 +7253,7 @@ msgid "Validate BOM"
msgstr "Xác minh BOM"
#: part/templates/part/detail.html:283 part/templates/part/detail.html:284
-#: templates/js/translated/bom.js:1314 templates/js/translated/bom.js:1315
+#: templates/js/translated/bom.js:1320 templates/js/translated/bom.js:1321
msgid "Add BOM Item"
msgstr "Thêm mục BOM"
@@ -7405,7 +7437,7 @@ msgstr "Phân bổ đến đơn đặt bản dựng"
msgid "Allocated to Sales Orders"
msgstr "Phân bổ đến đơn bán hàng"
-#: part/templates/part/part_base.html:235 templates/js/translated/bom.js:1213
+#: part/templates/part/part_base.html:235 templates/js/translated/bom.js:1219
msgid "Can Build"
msgstr "Có thể dựng"
@@ -8784,7 +8816,7 @@ msgstr "Chọn sản phẩm nhà cung cấp khớp với hàng hóa trong kho n
msgid "Where is this stock item located?"
msgstr "Hàng trong kho này được đặt ở đâu?"
-#: stock/models.py:786 stock/serializers.py:1318
+#: stock/models.py:786 stock/serializers.py:1324
msgid "Packaging this stock item is stored in"
msgstr "Đóng gói hàng hóa này được lưu trữ lại"
@@ -8796,7 +8828,7 @@ msgstr "Mục này đã được cài đặt trong mục khác?"
msgid "Serial number for this item"
msgstr "Số sê ri cho mục này"
-#: stock/models.py:830 stock/serializers.py:1301
+#: stock/models.py:830 stock/serializers.py:1307
msgid "Batch code for this stock item"
msgstr "Mã lô cho hàng trong kho này"
@@ -8905,7 +8937,7 @@ msgstr "Hàng trong kho hiện đang sản xuất"
msgid "Serialized stock cannot be merged"
msgstr "Không thể hợp nhất kho nối tiếp"
-#: stock/models.py:1639 stock/serializers.py:1207
+#: stock/models.py:1639 stock/serializers.py:1213
msgid "Duplicate stock items"
msgstr "Mặt hàng trùng lặp"
@@ -8986,7 +9018,7 @@ msgstr "Số lượng phải không vượt quá số lượng trong kho đang c
msgid "Enter serial numbers for new items"
msgstr "Điền số sêri cho hàng hóa mới"
-#: stock/serializers.py:473 stock/serializers.py:1164 stock/serializers.py:1420
+#: stock/serializers.py:473 stock/serializers.py:1170 stock/serializers.py:1426
msgid "Destination stock location"
msgstr "Vị trí kho đích"
@@ -9059,77 +9091,78 @@ msgstr "Chọn mặt hàng để đổi trạng thái"
msgid "No stock items selected"
msgstr "Không có mặt hàng nào được chọn"
-#: stock/serializers.py:863 stock/templates/stock/location.html:165
+#: stock/serializers.py:863 stock/serializers.py:926
+#: stock/templates/stock/location.html:165
#: stock/templates/stock/location.html:213
#: stock/templates/stock/location_sidebar.html:5
msgid "Sublocations"
msgstr "Kho phụ"
-#: stock/serializers.py:1036
+#: stock/serializers.py:1042
msgid "Part must be salable"
msgstr "Sản phẩm phải có thể bán được"
-#: stock/serializers.py:1040
+#: stock/serializers.py:1046
msgid "Item is allocated to a sales order"
msgstr "Hàng hóa được phân bổ đến một đơn hàng bán"
-#: stock/serializers.py:1044
+#: stock/serializers.py:1050
msgid "Item is allocated to a build order"
msgstr "Hàng hóa được phân bổ đến một đơn đặt bản dựng"
-#: stock/serializers.py:1068
+#: stock/serializers.py:1074
msgid "Customer to assign stock items"
msgstr "Khách hàng được gán vào các mặt hàng"
-#: stock/serializers.py:1074
+#: stock/serializers.py:1080
msgid "Selected company is not a customer"
msgstr "Công ty đã chọn không phải là khách hàng"
-#: stock/serializers.py:1082
+#: stock/serializers.py:1088
msgid "Stock assignment notes"
msgstr "Ghi chú phân bổ kho"
-#: stock/serializers.py:1092 stock/serializers.py:1346
+#: stock/serializers.py:1098 stock/serializers.py:1352
msgid "A list of stock items must be provided"
msgstr "Phải cung cấp danh sách mặt hàng"
-#: stock/serializers.py:1171
+#: stock/serializers.py:1177
msgid "Stock merging notes"
msgstr "Ghi chú gộp kho"
-#: stock/serializers.py:1176
+#: stock/serializers.py:1182
msgid "Allow mismatched suppliers"
msgstr "Cho phép nhiều nhà cung không khớp"
-#: stock/serializers.py:1177
+#: stock/serializers.py:1183
msgid "Allow stock items with different supplier parts to be merged"
msgstr "Cho phép mặt hàng cùng sản phẩm nhà cung cấp khác phải được gộp"
-#: stock/serializers.py:1182
+#: stock/serializers.py:1188
msgid "Allow mismatched status"
msgstr "Cho phép trạng thái không khớp"
-#: stock/serializers.py:1183
+#: stock/serializers.py:1189
msgid "Allow stock items with different status codes to be merged"
msgstr "Cho phép mặt hàng với mã trạng thái khác nhau để gộp lại"
-#: stock/serializers.py:1193
+#: stock/serializers.py:1199
msgid "At least two stock items must be provided"
msgstr "Cần cung cấp ít nhất hai mặt hàng"
-#: stock/serializers.py:1260
+#: stock/serializers.py:1266
msgid "No Change"
msgstr ""
-#: stock/serializers.py:1289
+#: stock/serializers.py:1295
msgid "StockItem primary key value"
msgstr "Giá trị khóa chính mặt hàng"
-#: stock/serializers.py:1308
+#: stock/serializers.py:1314
msgid "Stock item status code"
msgstr "Mã trạng thái mặt hàng"
-#: stock/serializers.py:1336
+#: stock/serializers.py:1342
msgid "Stock transaction notes"
msgstr "Ghi chú giao dịch kho"
@@ -10662,7 +10695,7 @@ msgid "The following parts are low on required stock"
msgstr "Sản phẩm sau còn ít hàng trong kho yêu cầu"
#: templates/email/build_order_required_stock.html:18
-#: templates/js/translated/bom.js:1668 templates/js/translated/build.js:2557
+#: templates/js/translated/bom.js:1674 templates/js/translated/build.js:2557
msgid "Required Quantity"
msgstr "Số lượng bắt buộc"
@@ -10676,7 +10709,7 @@ msgid "Click on the following link to view this part"
msgstr "Nhấp chuột vào liên kết dưới đây để xem sản phẩm này"
#: templates/email/low_stock_notification.html:18
-#: templates/js/translated/part.js:3209
+#: templates/js/translated/part.js:3218
msgid "Minimum Quantity"
msgstr "Số lượng tối thiểu"
@@ -11051,62 +11084,68 @@ msgstr ""
msgid "No pricing available"
msgstr ""
-#: templates/js/translated/bom.js:1182 templates/js/translated/build.js:2596
+#: templates/js/translated/bom.js:1184 templates/js/translated/build.js:2622
+#, fuzzy
+#| msgid "External Link"
+msgid "External stock"
+msgstr "Liên kết bên ngoài"
+
+#: templates/js/translated/bom.js:1188 templates/js/translated/build.js:2596
#: templates/js/translated/sales_order.js:1910
msgid "No Stock Available"
msgstr ""
-#: templates/js/translated/bom.js:1187 templates/js/translated/build.js:2600
+#: templates/js/translated/bom.js:1193 templates/js/translated/build.js:2600
msgid "Includes variant and substitute stock"
msgstr ""
-#: templates/js/translated/bom.js:1189 templates/js/translated/build.js:2602
+#: templates/js/translated/bom.js:1195 templates/js/translated/build.js:2602
#: templates/js/translated/part.js:1256
#: templates/js/translated/sales_order.js:1907
msgid "Includes variant stock"
msgstr ""
-#: templates/js/translated/bom.js:1191 templates/js/translated/build.js:2604
+#: templates/js/translated/bom.js:1197 templates/js/translated/build.js:2604
msgid "Includes substitute stock"
msgstr ""
-#: templates/js/translated/bom.js:1219 templates/js/translated/build.js:2587
+#: templates/js/translated/bom.js:1225 templates/js/translated/build.js:2587
msgid "Consumable item"
msgstr ""
-#: templates/js/translated/bom.js:1279
+#: templates/js/translated/bom.js:1285
msgid "Validate BOM Item"
msgstr ""
-#: templates/js/translated/bom.js:1281
+#: templates/js/translated/bom.js:1287
msgid "This line has been validated"
msgstr ""
-#: templates/js/translated/bom.js:1283
+#: templates/js/translated/bom.js:1289
msgid "Edit substitute parts"
msgstr ""
-#: templates/js/translated/bom.js:1285 templates/js/translated/bom.js:1480
+#: templates/js/translated/bom.js:1291 templates/js/translated/bom.js:1486
msgid "Edit BOM Item"
msgstr ""
-#: templates/js/translated/bom.js:1287
+#: templates/js/translated/bom.js:1293
msgid "Delete BOM Item"
msgstr ""
-#: templates/js/translated/bom.js:1307
+#: templates/js/translated/bom.js:1313
msgid "View BOM"
msgstr ""
-#: templates/js/translated/bom.js:1391
+#: templates/js/translated/bom.js:1397
msgid "No BOM items found"
msgstr ""
-#: templates/js/translated/bom.js:1651 templates/js/translated/build.js:2486
+#: templates/js/translated/bom.js:1657 templates/js/translated/build.js:2486
msgid "Required Part"
msgstr ""
-#: templates/js/translated/bom.js:1677
+#: templates/js/translated/bom.js:1683
msgid "Inherited from parent BOM"
msgstr ""
@@ -11449,29 +11488,29 @@ msgstr ""
msgid "Sufficient stock available"
msgstr ""
-#: templates/js/translated/build.js:2643
+#: templates/js/translated/build.js:2647
msgid "Consumable Item"
msgstr ""
-#: templates/js/translated/build.js:2648
+#: templates/js/translated/build.js:2652
msgid "Tracked item"
msgstr ""
-#: templates/js/translated/build.js:2655
+#: templates/js/translated/build.js:2659
#: templates/js/translated/sales_order.js:2016
msgid "Build stock"
msgstr ""
-#: templates/js/translated/build.js:2660 templates/js/translated/stock.js:1829
+#: templates/js/translated/build.js:2664 templates/js/translated/stock.js:1829
msgid "Order stock"
msgstr ""
-#: templates/js/translated/build.js:2664
+#: templates/js/translated/build.js:2668
#: templates/js/translated/sales_order.js:2010
msgid "Allocate stock"
msgstr ""
-#: templates/js/translated/build.js:2668
+#: templates/js/translated/build.js:2672
msgid "Remove stock allocation"
msgstr ""
@@ -12313,64 +12352,64 @@ msgstr ""
msgid "Subscribed category"
msgstr ""
-#: templates/js/translated/part.js:2855
+#: templates/js/translated/part.js:2864
msgid "No test templates matching query"
msgstr ""
-#: templates/js/translated/part.js:2877 templates/js/translated/search.js:342
+#: templates/js/translated/part.js:2886 templates/js/translated/search.js:342
msgid "results"
msgstr ""
-#: templates/js/translated/part.js:2927 templates/js/translated/stock.js:1446
+#: templates/js/translated/part.js:2936 templates/js/translated/stock.js:1446
msgid "Edit test result"
msgstr ""
-#: templates/js/translated/part.js:2928 templates/js/translated/stock.js:1447
+#: templates/js/translated/part.js:2937 templates/js/translated/stock.js:1447
#: templates/js/translated/stock.js:1692
msgid "Delete test result"
msgstr ""
-#: templates/js/translated/part.js:2932
+#: templates/js/translated/part.js:2941
msgid "This test is defined for a parent part"
msgstr ""
-#: templates/js/translated/part.js:2948
+#: templates/js/translated/part.js:2957
msgid "Edit Test Result Template"
msgstr ""
-#: templates/js/translated/part.js:2962
+#: templates/js/translated/part.js:2971
msgid "Delete Test Result Template"
msgstr ""
-#: templates/js/translated/part.js:3041 templates/js/translated/part.js:3042
+#: templates/js/translated/part.js:3050 templates/js/translated/part.js:3051
msgid "No date specified"
msgstr ""
-#: templates/js/translated/part.js:3044
+#: templates/js/translated/part.js:3053
msgid "Specified date is in the past"
msgstr ""
-#: templates/js/translated/part.js:3050
+#: templates/js/translated/part.js:3059
msgid "Speculative"
msgstr ""
-#: templates/js/translated/part.js:3100
+#: templates/js/translated/part.js:3109
msgid "No scheduling information available for this part"
msgstr ""
-#: templates/js/translated/part.js:3106
+#: templates/js/translated/part.js:3115
msgid "Error fetching scheduling information for this part"
msgstr ""
-#: templates/js/translated/part.js:3202
+#: templates/js/translated/part.js:3211
msgid "Scheduled Stock Quantities"
msgstr ""
-#: templates/js/translated/part.js:3218
+#: templates/js/translated/part.js:3227
msgid "Maximum Quantity"
msgstr ""
-#: templates/js/translated/part.js:3263
+#: templates/js/translated/part.js:3272
msgid "Minimum Stock Level"
msgstr ""
@@ -14052,4 +14091,3 @@ msgstr "Quyển để sửa mục"
#: users/models.py:413
msgid "Permission to delete items"
msgstr "Quyền để xóa mục"
-
diff --git a/InvenTree/locale/zh/LC_MESSAGES/django.po b/InvenTree/locale/zh/LC_MESSAGES/django.po
index 380b4d78d5..e4dbd73737 100644
--- a/InvenTree/locale/zh/LC_MESSAGES/django.po
+++ b/InvenTree/locale/zh/LC_MESSAGES/django.po
@@ -2,7 +2,7 @@ msgid ""
msgstr ""
"Project-Id-Version: inventree\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2024-02-28 04:05+0000\n"
+"POT-Creation-Date: 2024-03-05 00:41+0000\n"
"PO-Revision-Date: 2024-02-28 07:23\n"
"Last-Translator: \n"
"Language-Team: Chinese Traditional\n"
@@ -66,9 +66,9 @@ msgstr "輸入日期"
#: report/templates/report/inventree_build_order_base.html:172
#: stock/admin.py:226 stock/models.py:2335 stock/models.py:2451
#: stock/serializers.py:479 stock/serializers.py:632 stock/serializers.py:728
-#: stock/serializers.py:778 stock/serializers.py:1081 stock/serializers.py:1170
-#: stock/serializers.py:1335 stock/templates/stock/stock_sidebar.html:25
-#: templates/js/translated/barcode.js:143 templates/js/translated/bom.js:1259
+#: stock/serializers.py:778 stock/serializers.py:1087 stock/serializers.py:1176
+#: stock/serializers.py:1341 stock/templates/stock/stock_sidebar.html:25
+#: templates/js/translated/barcode.js:143 templates/js/translated/bom.js:1265
#: templates/js/translated/company.js:1674 templates/js/translated/order.js:347
#: templates/js/translated/part.js:1080
#: templates/js/translated/purchase_order.js:2201
@@ -523,7 +523,7 @@ msgstr "名稱"
#: templates/js/translated/order.js:298 templates/js/translated/part.js:1238
#: templates/js/translated/part.js:1483 templates/js/translated/part.js:1621
#: templates/js/translated/part.js:1958 templates/js/translated/part.js:2355
-#: templates/js/translated/part.js:2785 templates/js/translated/part.js:2887
+#: templates/js/translated/part.js:2785 templates/js/translated/part.js:2896
#: templates/js/translated/plugin.js:80
#: templates/js/translated/purchase_order.js:1707
#: templates/js/translated/purchase_order.js:1850
@@ -678,7 +678,7 @@ msgstr "遠端圖片的URL"
msgid "Downloading images from remote URL is not enabled"
msgstr "尚未啟用從遠端URL下載圖片"
-#: InvenTree/status.py:66 part/serializers.py:1120
+#: InvenTree/status.py:66 part/serializers.py:1138
msgid "Background worker check failed"
msgstr "背景工作程式檢查失敗"
@@ -960,7 +960,7 @@ msgid "Tracked"
msgstr ""
#: build/api.py:285 part/admin.py:144 templates/js/translated/build.js:1741
-#: templates/js/translated/build.js:2626
+#: templates/js/translated/build.js:2630
#: templates/js/translated/sales_order.js:1929
#: templates/js/translated/table_filters.js:571
msgid "Allocated"
@@ -1044,11 +1044,11 @@ msgstr "這張生產工單對應的上層生產工單"
#: build/models.py:199 build/templates/build/build_base.html:97
#: build/templates/build/detail.html:29 company/models.py:1044
#: order/models.py:1389 order/models.py:1532 order/models.py:1533
-#: part/api.py:1528 part/models.py:389 part/models.py:3003 part/models.py:3147
-#: part/models.py:3291 part/models.py:3314 part/models.py:3335
-#: part/models.py:3357 part/models.py:3458 part/models.py:3754
-#: part/models.py:3885 part/models.py:3978 part/models.py:4339
-#: part/serializers.py:1066 part/serializers.py:1631
+#: part/api.py:1528 part/api.py:1820 part/models.py:389 part/models.py:3003
+#: part/models.py:3147 part/models.py:3291 part/models.py:3314
+#: part/models.py:3335 part/models.py:3357 part/models.py:3458
+#: part/models.py:3754 part/models.py:3885 part/models.py:3978
+#: part/models.py:4339 part/serializers.py:1084 part/serializers.py:1659
#: part/templates/part/part_app_base.html:8
#: part/templates/part/part_pricing.html:12
#: part/templates/part/upload_bom.html:52
@@ -1147,7 +1147,7 @@ msgid "Build status code"
msgstr "生產狀態代碼"
#: build/models.py:264 build/serializers.py:280 order/serializers.py:549
-#: stock/models.py:826 stock/serializers.py:1300
+#: stock/models.py:826 stock/serializers.py:1306
#: templates/js/translated/purchase_order.js:1129
msgid "Batch Code"
msgstr "批量代碼"
@@ -1242,48 +1242,48 @@ msgstr "專案代碼"
msgid "Project code for this build order"
msgstr "此生產工單隸屬的專案代碼"
-#: build/models.py:559
+#: build/models.py:575
#, python-brace-format
msgid "Build order {build} has been completed"
msgstr "生產工單 {build} 已經完成"
-#: build/models.py:565
+#: build/models.py:581
msgid "A build order has been completed"
msgstr "一張生產工單已經完成"
-#: build/models.py:783 build/models.py:858
+#: build/models.py:799 build/models.py:874
msgid "No build output specified"
msgstr "尚未指定生產品項"
-#: build/models.py:786
+#: build/models.py:802
msgid "Build output is already completed"
msgstr "生產成品已經完成"
-#: build/models.py:789
+#: build/models.py:805
msgid "Build output does not match Build Order"
msgstr "生產品項與生產工單不符"
-#: build/models.py:862 build/serializers.py:223 build/serializers.py:262
+#: build/models.py:878 build/serializers.py:223 build/serializers.py:262
#: build/serializers.py:831 order/models.py:526 order/serializers.py:401
-#: order/serializers.py:544 part/serializers.py:1423 part/serializers.py:1789
+#: order/serializers.py:544 part/serializers.py:1442 part/serializers.py:1817
#: stock/models.py:665 stock/models.py:1477 stock/serializers.py:450
msgid "Quantity must be greater than zero"
msgstr "數量必須大於零"
-#: build/models.py:867 build/serializers.py:228
+#: build/models.py:883 build/serializers.py:228
msgid "Quantity cannot be greater than the output quantity"
msgstr "數量不能大於工單生產數量"
-#: build/models.py:924 build/serializers.py:533
+#: build/models.py:940 build/serializers.py:533
#, python-brace-format
msgid "Build output {serial} has not passed all required tests"
msgstr ""
-#: build/models.py:1286
+#: build/models.py:1302
msgid "Build object"
msgstr ""
-#: build/models.py:1300 build/models.py:1558 build/serializers.py:210
+#: build/models.py:1316 build/models.py:1574 build/serializers.py:210
#: build/serializers.py:247 build/templates/build/build_base.html:102
#: build/templates/build/detail.html:34 common/models.py:2432
#: order/models.py:1247 order/models.py:1902 order/serializers.py:1306
@@ -1310,7 +1310,7 @@ msgstr ""
#: templates/js/translated/company.js:1808
#: templates/js/translated/model_renderers.js:230
#: templates/js/translated/order.js:304 templates/js/translated/part.js:961
-#: templates/js/translated/part.js:1811 templates/js/translated/part.js:3332
+#: templates/js/translated/part.js:1811 templates/js/translated/part.js:3341
#: templates/js/translated/pricing.js:381
#: templates/js/translated/pricing.js:474
#: templates/js/translated/pricing.js:522
@@ -1330,38 +1330,38 @@ msgstr ""
msgid "Quantity"
msgstr "數量"
-#: build/models.py:1301
+#: build/models.py:1317
msgid "Required quantity for build order"
msgstr "生產工單所需數量"
-#: build/models.py:1381
+#: build/models.py:1397
msgid "Build item must specify a build output, as master part is marked as trackable"
msgstr ""
-#: build/models.py:1390
+#: build/models.py:1406
#, python-brace-format
msgid "Allocated quantity ({q}) must not exceed available stock quantity ({a})"
msgstr "分配的數量({q})不能超過可用的庫存數量({a})"
-#: build/models.py:1400 order/models.py:1853
+#: build/models.py:1416 order/models.py:1853
msgid "Stock item is over-allocated"
msgstr "庫存品項超額分配"
-#: build/models.py:1406 order/models.py:1856
+#: build/models.py:1422 order/models.py:1856
msgid "Allocation quantity must be greater than zero"
msgstr "分配的數量必須大於零"
-#: build/models.py:1412
+#: build/models.py:1428
msgid "Quantity must be 1 for serialized stock"
msgstr "有序號的品項數量必須為1"
-#: build/models.py:1473
+#: build/models.py:1489
msgid "Selected stock item does not match BOM line"
msgstr "選擇的庫存品項和BOM的項目不符"
-#: build/models.py:1545 build/serializers.py:811 order/serializers.py:1150
-#: order/serializers.py:1171 stock/serializers.py:544 stock/serializers.py:1019
-#: stock/serializers.py:1131 stock/templates/stock/item_base.html:10
+#: build/models.py:1561 build/serializers.py:811 order/serializers.py:1150
+#: order/serializers.py:1171 stock/serializers.py:544 stock/serializers.py:1025
+#: stock/serializers.py:1137 stock/templates/stock/item_base.html:10
#: stock/templates/stock/item_base.html:23
#: stock/templates/stock/item_base.html:194
#: templates/js/translated/build.js:1742
@@ -1376,19 +1376,19 @@ msgstr "選擇的庫存品項和BOM的項目不符"
msgid "Stock Item"
msgstr "庫存品項"
-#: build/models.py:1546
+#: build/models.py:1562
msgid "Source stock item"
msgstr "來源庫存項目"
-#: build/models.py:1559
+#: build/models.py:1575
msgid "Stock quantity to allocate to build"
msgstr "要分配的庫存數量"
-#: build/models.py:1567
+#: build/models.py:1583
msgid "Install into"
msgstr "安裝到"
-#: build/models.py:1568
+#: build/models.py:1584
msgid "Destination stock item"
msgstr "目的庫存品項"
@@ -1452,9 +1452,9 @@ msgid "A list of build outputs must be provided"
msgstr "必須提供產出清單"
#: build/serializers.py:426 build/serializers.py:498 order/serializers.py:533
-#: order/serializers.py:641 order/serializers.py:1646 part/serializers.py:1086
+#: order/serializers.py:641 order/serializers.py:1646 part/serializers.py:1104
#: stock/serializers.py:472 stock/serializers.py:627 stock/serializers.py:723
-#: stock/serializers.py:1163 stock/serializers.py:1419
+#: stock/serializers.py:1169 stock/serializers.py:1425
#: stock/templates/stock/item_base.html:394
#: templates/js/translated/barcode.js:547
#: templates/js/translated/barcode.js:795 templates/js/translated/build.js:999
@@ -1494,7 +1494,7 @@ msgstr ""
#: build/serializers.py:505 build/templates/build/build_base.html:151
#: build/templates/build/detail.html:62 order/models.py:910
#: order/models.py:2005 order/serializers.py:565 stock/admin.py:165
-#: stock/serializers.py:774 stock/serializers.py:1307
+#: stock/serializers.py:774 stock/serializers.py:1313
#: stock/templates/stock/item_base.html:427
#: templates/js/translated/barcode.js:252 templates/js/translated/build.js:2189
#: templates/js/translated/purchase_order.js:1308
@@ -1602,7 +1602,7 @@ msgstr ""
msgid "bom_item.part must point to the same part as the build order"
msgstr ""
-#: build/serializers.py:817 stock/serializers.py:1032
+#: build/serializers.py:817 stock/serializers.py:1038
msgid "Item must be in stock"
msgstr "商品必須有庫存"
@@ -1659,44 +1659,45 @@ msgstr ""
msgid "Allocate optional BOM items to build order"
msgstr ""
-#: build/serializers.py:1096 part/models.py:3895 part/models.py:4331
+#: build/serializers.py:1097 part/models.py:3895 part/models.py:4331
#: stock/api.py:745
msgid "BOM Item"
msgstr ""
-#: build/serializers.py:1105 templates/js/translated/index.js:130
+#: build/serializers.py:1106 templates/js/translated/index.js:130
msgid "Allocated Stock"
msgstr ""
-#: build/serializers.py:1110 part/admin.py:132 part/bom.py:173
-#: part/serializers.py:1441 part/templates/part/part_base.html:210
-#: templates/js/translated/bom.js:1202 templates/js/translated/build.js:2614
-#: templates/js/translated/part.js:709 templates/js/translated/part.js:2148
+#: build/serializers.py:1111 part/admin.py:132 part/bom.py:173
+#: part/serializers.py:798 part/serializers.py:1460
+#: part/templates/part/part_base.html:210 templates/js/translated/bom.js:1208
+#: templates/js/translated/build.js:2614 templates/js/translated/part.js:709
+#: templates/js/translated/part.js:2148
#: templates/js/translated/table_filters.js:170
msgid "On Order"
msgstr ""
-#: build/serializers.py:1115 part/serializers.py:1443
+#: build/serializers.py:1116 part/serializers.py:1462
#: templates/js/translated/build.js:2618
#: templates/js/translated/table_filters.js:360
msgid "In Production"
msgstr ""
-#: build/serializers.py:1120 part/bom.py:172 part/serializers.py:1454
+#: build/serializers.py:1121 part/bom.py:172 part/serializers.py:1473
#: part/templates/part/part_base.html:192
#: templates/js/translated/sales_order.js:1893
msgid "Available Stock"
msgstr ""
-#: build/tasks.py:149
+#: build/tasks.py:171
msgid "Stock required for build order"
msgstr ""
-#: build/tasks.py:166
+#: build/tasks.py:188
msgid "Overdue Build Order"
msgstr ""
-#: build/tasks.py:171
+#: build/tasks.py:193
#, python-brace-format
msgid "Build order {bo} is now overdue"
msgstr ""
@@ -1990,27 +1991,31 @@ msgstr ""
msgid "Order Parts"
msgstr ""
-#: build/templates/build/detail.html:210
-msgid "Incomplete Build Outputs"
-msgstr ""
-
-#: build/templates/build/detail.html:214
-msgid "Create new build output"
+#: build/templates/build/detail.html:205
+msgid "Available stock has been filtered based on specified source location for this build order"
msgstr ""
#: build/templates/build/detail.html:215
+msgid "Incomplete Build Outputs"
+msgstr ""
+
+#: build/templates/build/detail.html:219
+msgid "Create new build output"
+msgstr ""
+
+#: build/templates/build/detail.html:220
msgid "New Build Output"
msgstr ""
-#: build/templates/build/detail.html:232 build/templates/build/sidebar.html:15
+#: build/templates/build/detail.html:237 build/templates/build/sidebar.html:15
msgid "Consumed Stock"
msgstr ""
-#: build/templates/build/detail.html:244
+#: build/templates/build/detail.html:249
msgid "Completed Build Outputs"
msgstr ""
-#: build/templates/build/detail.html:256 build/templates/build/sidebar.html:19
+#: build/templates/build/detail.html:261 build/templates/build/sidebar.html:19
#: company/templates/company/detail.html:229
#: company/templates/company/manufacturer_part.html:141
#: company/templates/company/manufacturer_part_sidebar.html:9
@@ -2026,15 +2031,15 @@ msgstr ""
msgid "Attachments"
msgstr "附件"
-#: build/templates/build/detail.html:271
+#: build/templates/build/detail.html:276
msgid "Build Notes"
msgstr ""
-#: build/templates/build/detail.html:426
+#: build/templates/build/detail.html:434
msgid "Allocation Complete"
msgstr ""
-#: build/templates/build/detail.html:427
+#: build/templates/build/detail.html:435
msgid "All lines have been fully allocated"
msgstr ""
@@ -2436,7 +2441,7 @@ msgid "Parts are templates by default"
msgstr ""
#: common/models.py:1456 part/admin.py:91 part/admin.py:431 part/models.py:1015
-#: templates/js/translated/bom.js:1633
+#: templates/js/translated/bom.js:1639
#: templates/js/translated/table_filters.js:330
#: templates/js/translated/table_filters.js:721
msgid "Assembly"
@@ -3495,7 +3500,7 @@ msgstr ""
msgid "Price break quantity"
msgstr ""
-#: common/models.py:2440 company/serializers.py:484 order/admin.py:42
+#: common/models.py:2440 company/serializers.py:486 order/admin.py:42
#: order/models.py:1321 order/models.py:2226
#: templates/js/translated/company.js:1813 templates/js/translated/part.js:1885
#: templates/js/translated/pricing.js:621
@@ -3972,7 +3977,7 @@ msgstr ""
#: company/models.py:495 company/templates/company/company_base.html:76
#: company/templates/company/manufacturer_part.html:90
-#: company/templates/company/supplier_part.html:145 part/serializers.py:497
+#: company/templates/company/supplier_part.html:145 part/serializers.py:505
#: stock/templates/stock/item_base.html:207
#: templates/js/translated/company.js:506
#: templates/js/translated/company.js:1108
@@ -3987,7 +3992,7 @@ msgid "Select manufacturer"
msgstr ""
#: company/models.py:502 company/templates/company/manufacturer_part.html:101
-#: company/templates/company/supplier_part.html:153 part/serializers.py:507
+#: company/templates/company/supplier_part.html:153 part/serializers.py:515
#: templates/js/translated/company.js:351
#: templates/js/translated/company.js:1107
#: templates/js/translated/company.js:1302
@@ -4059,7 +4064,7 @@ msgstr ""
#: company/models.py:795 company/templates/company/company_base.html:81
#: company/templates/company/supplier_part.html:129 order/models.py:453
#: order/templates/order/order_base.html:136 part/bom.py:272 part/bom.py:310
-#: part/serializers.py:481 plugin/builtin/suppliers/digikey.py:25
+#: part/serializers.py:489 plugin/builtin/suppliers/digikey.py:25
#: plugin/builtin/suppliers/lcsc.py:26 plugin/builtin/suppliers/mouser.py:24
#: plugin/builtin/suppliers/tme.py:26 stock/templates/stock/item_base.html:224
#: templates/email/overdue_purchase_order.html:16
@@ -4076,7 +4081,7 @@ msgstr ""
msgid "Select supplier"
msgstr ""
-#: company/models.py:802 part/serializers.py:492
+#: company/models.py:802 part/serializers.py:500
msgid "Supplier stock keeping unit"
msgstr ""
@@ -4112,7 +4117,7 @@ msgid "Minimum charge (e.g. stocking fee)"
msgstr ""
#: company/models.py:851 company/templates/company/supplier_part.html:160
-#: stock/admin.py:224 stock/models.py:785 stock/serializers.py:1317
+#: stock/admin.py:224 stock/models.py:785 stock/serializers.py:1323
#: stock/templates/stock/item_base.html:240
#: templates/js/translated/company.js:1636
#: templates/js/translated/stock.js:2387
@@ -4157,7 +4162,7 @@ msgstr ""
msgid "Date of last update of availability data"
msgstr ""
-#: company/serializers.py:153
+#: company/serializers.py:155
msgid "Default currency used for this supplier"
msgstr ""
@@ -4218,7 +4223,7 @@ msgstr ""
#: company/templates/company/company_base.html:86 order/models.py:898
#: order/models.py:1993 order/templates/order/return_order_base.html:131
#: order/templates/order/sales_order_base.html:144 stock/models.py:807
-#: stock/models.py:808 stock/serializers.py:1067
+#: stock/models.py:808 stock/serializers.py:1073
#: stock/templates/stock/item_base.html:405
#: templates/email/overdue_sales_order.html:16
#: templates/js/translated/company.js:502
@@ -4429,8 +4434,9 @@ msgstr ""
#: company/templates/company/manufacturer_part.html:119
#: company/templates/company/supplier_part.html:15 company/views.py:31
-#: part/admin.py:122 part/templates/part/part_sidebar.html:33
-#: templates/InvenTree/search.html:190 templates/navbar.html:48
+#: part/admin.py:122 part/serializers.py:802
+#: part/templates/part/part_sidebar.html:33 templates/InvenTree/search.html:190
+#: templates/navbar.html:48
msgid "Suppliers"
msgstr ""
@@ -4528,7 +4534,7 @@ msgid "No supplier information available"
msgstr ""
#: company/templates/company/supplier_part.html:139 part/bom.py:279
-#: part/bom.py:311 part/serializers.py:491
+#: part/bom.py:311 part/serializers.py:499
#: templates/js/translated/company.js:349 templates/js/translated/part.js:1786
#: templates/js/translated/pricing.js:510
#: templates/js/translated/purchase_order.js:1851
@@ -4577,10 +4583,12 @@ msgstr ""
msgid "Update Part Availability"
msgstr ""
-#: company/templates/company/supplier_part_sidebar.html:5 part/stocktake.py:223
+#: company/templates/company/supplier_part_sidebar.html:5
+#: part/serializers.py:801 part/stocktake.py:223
#: part/templates/part/category.html:183
#: part/templates/part/category_sidebar.html:17 stock/admin.py:69
-#: stock/serializers.py:760 stock/templates/stock/location.html:170
+#: stock/serializers.py:760 stock/serializers.py:924
+#: stock/templates/stock/location.html:170
#: stock/templates/stock/location.html:184
#: stock/templates/stock/location.html:196
#: stock/templates/stock/location_sidebar.html:7
@@ -4640,7 +4648,7 @@ msgid "Label template file"
msgstr ""
#: label/models.py:143 part/models.py:3484 report/models.py:322
-#: templates/js/translated/part.js:2891
+#: templates/js/translated/part.js:2900
#: templates/js/translated/table_filters.js:481
msgid "Enabled"
msgstr ""
@@ -5733,7 +5741,7 @@ msgid "Pending Shipments"
msgstr ""
#: order/templates/order/sales_order_detail.html:71
-#: templates/js/translated/bom.js:1271 templates/js/translated/filters.js:296
+#: templates/js/translated/bom.js:1277 templates/js/translated/filters.js:296
msgid "Actions"
msgstr ""
@@ -5861,10 +5869,10 @@ msgstr ""
msgid "Category Path"
msgstr ""
-#: part/admin.py:323 part/models.py:390 part/serializers.py:259
-#: part/serializers.py:373 part/templates/part/cat_link.html:3
-#: part/templates/part/category.html:23 part/templates/part/category.html:141
-#: part/templates/part/category.html:161
+#: part/admin.py:323 part/models.py:390 part/serializers.py:112
+#: part/serializers.py:265 part/serializers.py:381
+#: part/templates/part/cat_link.html:3 part/templates/part/category.html:23
+#: part/templates/part/category.html:141 part/templates/part/category.html:161
#: part/templates/part/category_sidebar.html:9
#: templates/InvenTree/index.html:36 templates/InvenTree/search.html:84
#: templates/InvenTree/settings/sidebar.html:47
@@ -5889,13 +5897,13 @@ msgstr ""
msgid "Part IPN"
msgstr ""
-#: part/admin.py:421 part/serializers.py:1220
+#: part/admin.py:421 part/serializers.py:1238
#: templates/js/translated/pricing.js:358
#: templates/js/translated/pricing.js:1024
msgid "Minimum Price"
msgstr ""
-#: part/admin.py:426 part/serializers.py:1235
+#: part/admin.py:426 part/serializers.py:1253
#: templates/js/translated/pricing.js:353
#: templates/js/translated/pricing.js:1032
msgid "Maximum Price"
@@ -5974,7 +5982,7 @@ msgid "This option must be selected"
msgstr ""
#: part/api.py:1541 part/models.py:895 part/models.py:3385 part/models.py:3831
-#: part/serializers.py:388 part/serializers.py:1076
+#: part/serializers.py:396 part/serializers.py:1094
#: part/templates/part/part_base.html:260 stock/api.py:733
#: templates/InvenTree/settings/settings_staff_js.html:300
#: templates/js/translated/notification.js:60
@@ -5982,12 +5990,17 @@ msgstr ""
msgid "Category"
msgstr ""
+#: part/api.py:1828
+msgid "Uses"
+msgstr ""
+
#: part/bom.py:170 part/models.py:100 part/models.py:938
#: part/templates/part/category.html:116 part/templates/part/part_base.html:367
msgid "Default Location"
msgstr ""
-#: part/bom.py:171 templates/email/low_stock_notification.html:16
+#: part/bom.py:171 part/serializers.py:803
+#: templates/email/low_stock_notification.html:16
msgid "Total Stock"
msgstr ""
@@ -6010,7 +6023,8 @@ msgstr ""
msgid "Default location for parts in this category"
msgstr ""
-#: part/models.py:106 stock/models.py:165 templates/js/translated/stock.js:2736
+#: part/models.py:106 stock/models.py:165 templates/js/translated/part.js:2810
+#: templates/js/translated/stock.js:2736
#: templates/js/translated/table_filters.js:239
#: templates/js/translated/table_filters.js:283
msgid "Structural"
@@ -6418,7 +6432,7 @@ msgstr ""
msgid "Test with this name already exists for this part"
msgstr ""
-#: part/models.py:3464 templates/js/translated/part.js:2870
+#: part/models.py:3464 templates/js/translated/part.js:2879
msgid "Test Name"
msgstr ""
@@ -6446,7 +6460,7 @@ msgstr ""
msgid "Is this test enabled?"
msgstr ""
-#: part/models.py:3489 templates/js/translated/part.js:2899
+#: part/models.py:3489 templates/js/translated/part.js:2908
#: templates/js/translated/table_filters.js:477
msgid "Required"
msgstr ""
@@ -6455,7 +6469,7 @@ msgstr ""
msgid "Is this test required to pass?"
msgstr ""
-#: part/models.py:3495 templates/js/translated/part.js:2907
+#: part/models.py:3495 templates/js/translated/part.js:2916
msgid "Requires Value"
msgstr ""
@@ -6463,7 +6477,7 @@ msgstr ""
msgid "Does this test require a value when adding a test result?"
msgstr ""
-#: part/models.py:3501 templates/js/translated/part.js:2914
+#: part/models.py:3501 templates/js/translated/part.js:2923
msgid "Requires Attachment"
msgstr ""
@@ -6685,311 +6699,327 @@ msgstr ""
msgid "Duplicate relationship already exists"
msgstr ""
-#: part/serializers.py:128 part/templates/part/category.html:122
-#: part/templates/part/category.html:207
+#: part/serializers.py:114 part/serializers.py:134
+#: part/templates/part/category.html:122 part/templates/part/category.html:207
#: part/templates/part/category_sidebar.html:7
msgid "Subcategories"
msgstr ""
-#: part/serializers.py:172
+#: part/serializers.py:178
msgid "Results"
msgstr ""
-#: part/serializers.py:173
+#: part/serializers.py:179
msgid "Number of results recorded against this template"
msgstr ""
-#: part/serializers.py:197 part/serializers.py:215 stock/serializers.py:384
+#: part/serializers.py:203 part/serializers.py:221 stock/serializers.py:384
msgid "Purchase currency of this stock item"
msgstr ""
-#: part/serializers.py:260
+#: part/serializers.py:266
msgid "Number of parts using this template"
msgstr ""
-#: part/serializers.py:379
+#: part/serializers.py:387
msgid "No parts selected"
msgstr ""
-#: part/serializers.py:389
+#: part/serializers.py:397
msgid "Select category"
msgstr ""
-#: part/serializers.py:419
+#: part/serializers.py:427
msgid "Original Part"
msgstr ""
-#: part/serializers.py:420
+#: part/serializers.py:428
msgid "Select original part to duplicate"
msgstr ""
-#: part/serializers.py:425
+#: part/serializers.py:433
msgid "Copy Image"
msgstr ""
-#: part/serializers.py:426
+#: part/serializers.py:434
msgid "Copy image from original part"
msgstr ""
-#: part/serializers.py:432 part/templates/part/detail.html:277
+#: part/serializers.py:440 part/templates/part/detail.html:277
msgid "Copy BOM"
msgstr ""
-#: part/serializers.py:433
+#: part/serializers.py:441
msgid "Copy bill of materials from original part"
msgstr ""
-#: part/serializers.py:439
+#: part/serializers.py:447
msgid "Copy Parameters"
msgstr ""
-#: part/serializers.py:440
+#: part/serializers.py:448
msgid "Copy parameter data from original part"
msgstr ""
-#: part/serializers.py:446
+#: part/serializers.py:454
msgid "Copy Notes"
msgstr ""
-#: part/serializers.py:447
+#: part/serializers.py:455
msgid "Copy notes from original part"
msgstr ""
-#: part/serializers.py:460
+#: part/serializers.py:468
msgid "Initial Stock Quantity"
msgstr ""
-#: part/serializers.py:462
+#: part/serializers.py:470
msgid "Specify initial stock quantity for this Part. If quantity is zero, no stock is added."
msgstr ""
-#: part/serializers.py:469
+#: part/serializers.py:477
msgid "Initial Stock Location"
msgstr ""
-#: part/serializers.py:470
+#: part/serializers.py:478
msgid "Specify initial stock location for this Part"
msgstr ""
-#: part/serializers.py:482
+#: part/serializers.py:490
msgid "Select supplier (or leave blank to skip)"
msgstr ""
-#: part/serializers.py:498
+#: part/serializers.py:506
msgid "Select manufacturer (or leave blank to skip)"
msgstr ""
-#: part/serializers.py:508
+#: part/serializers.py:516
msgid "Manufacturer part number"
msgstr ""
-#: part/serializers.py:515
+#: part/serializers.py:523
msgid "Selected company is not a valid supplier"
msgstr ""
-#: part/serializers.py:524
+#: part/serializers.py:532
msgid "Selected company is not a valid manufacturer"
msgstr ""
-#: part/serializers.py:535
+#: part/serializers.py:543
msgid "Manufacturer part matching this MPN already exists"
msgstr ""
-#: part/serializers.py:542
+#: part/serializers.py:550
msgid "Supplier part matching this SKU already exists"
msgstr ""
-#: part/serializers.py:815 part/templates/part/copy_part.html:9
+#: part/serializers.py:804
+#, fuzzy
+#| msgid "External Link"
+msgid "External Stock"
+msgstr "外部連結"
+
+#: part/serializers.py:806
+#, fuzzy
+#| msgid "Allocate Stock"
+msgid "Unallocated Stock"
+msgstr "分配庫存"
+
+#: part/serializers.py:808
+msgid "Variant Stock"
+msgstr ""
+
+#: part/serializers.py:833 part/templates/part/copy_part.html:9
#: templates/js/translated/part.js:471
msgid "Duplicate Part"
msgstr ""
-#: part/serializers.py:816
+#: part/serializers.py:834
msgid "Copy initial data from another Part"
msgstr ""
-#: part/serializers.py:822 templates/js/translated/part.js:102
+#: part/serializers.py:840 templates/js/translated/part.js:102
msgid "Initial Stock"
msgstr ""
-#: part/serializers.py:823
+#: part/serializers.py:841
msgid "Create Part with initial stock quantity"
msgstr ""
-#: part/serializers.py:829
+#: part/serializers.py:847
msgid "Supplier Information"
msgstr ""
-#: part/serializers.py:830
+#: part/serializers.py:848
msgid "Add initial supplier information for this part"
msgstr ""
-#: part/serializers.py:838
+#: part/serializers.py:856
msgid "Copy Category Parameters"
msgstr ""
-#: part/serializers.py:839
+#: part/serializers.py:857
msgid "Copy parameter templates from selected part category"
msgstr ""
-#: part/serializers.py:844
+#: part/serializers.py:862
msgid "Existing Image"
msgstr ""
-#: part/serializers.py:845
+#: part/serializers.py:863
msgid "Filename of an existing part image"
msgstr ""
-#: part/serializers.py:862
+#: part/serializers.py:880
msgid "Image file does not exist"
msgstr ""
-#: part/serializers.py:1068
+#: part/serializers.py:1086
msgid "Limit stocktake report to a particular part, and any variant parts"
msgstr ""
-#: part/serializers.py:1078
+#: part/serializers.py:1096
msgid "Limit stocktake report to a particular part category, and any child categories"
msgstr ""
-#: part/serializers.py:1088
+#: part/serializers.py:1106
msgid "Limit stocktake report to a particular stock location, and any child locations"
msgstr ""
-#: part/serializers.py:1094
+#: part/serializers.py:1112
msgid "Exclude External Stock"
msgstr ""
-#: part/serializers.py:1095
+#: part/serializers.py:1113
msgid "Exclude stock items in external locations"
msgstr ""
-#: part/serializers.py:1100
+#: part/serializers.py:1118
msgid "Generate Report"
msgstr ""
-#: part/serializers.py:1101
+#: part/serializers.py:1119
msgid "Generate report file containing calculated stocktake data"
msgstr ""
-#: part/serializers.py:1106
+#: part/serializers.py:1124
msgid "Update Parts"
msgstr ""
-#: part/serializers.py:1107
+#: part/serializers.py:1125
msgid "Update specified parts with calculated stocktake data"
msgstr ""
-#: part/serializers.py:1115
+#: part/serializers.py:1133
msgid "Stocktake functionality is not enabled"
msgstr ""
-#: part/serializers.py:1221
+#: part/serializers.py:1239
msgid "Override calculated value for minimum price"
msgstr ""
-#: part/serializers.py:1228
+#: part/serializers.py:1246
msgid "Minimum price currency"
msgstr ""
-#: part/serializers.py:1236
+#: part/serializers.py:1254
msgid "Override calculated value for maximum price"
msgstr ""
-#: part/serializers.py:1243
+#: part/serializers.py:1261
msgid "Maximum price currency"
msgstr ""
-#: part/serializers.py:1272
+#: part/serializers.py:1290
msgid "Update"
msgstr ""
-#: part/serializers.py:1273
+#: part/serializers.py:1291
msgid "Update pricing for this part"
msgstr ""
-#: part/serializers.py:1296
+#: part/serializers.py:1314
#, python-brace-format
msgid "Could not convert from provided currencies to {default_currency}"
msgstr ""
-#: part/serializers.py:1303
+#: part/serializers.py:1321
msgid "Minimum price must not be greater than maximum price"
msgstr ""
-#: part/serializers.py:1306
+#: part/serializers.py:1324
msgid "Maximum price must not be less than minimum price"
msgstr ""
-#: part/serializers.py:1632
+#: part/serializers.py:1660
msgid "Select part to copy BOM from"
msgstr ""
-#: part/serializers.py:1640
+#: part/serializers.py:1668
msgid "Remove Existing Data"
msgstr ""
-#: part/serializers.py:1641
+#: part/serializers.py:1669
msgid "Remove existing BOM items before copying"
msgstr ""
-#: part/serializers.py:1646
+#: part/serializers.py:1674
msgid "Include Inherited"
msgstr ""
-#: part/serializers.py:1647
+#: part/serializers.py:1675
msgid "Include BOM items which are inherited from templated parts"
msgstr ""
-#: part/serializers.py:1652
+#: part/serializers.py:1680
msgid "Skip Invalid Rows"
msgstr ""
-#: part/serializers.py:1653
+#: part/serializers.py:1681
msgid "Enable this option to skip invalid rows"
msgstr ""
-#: part/serializers.py:1658
+#: part/serializers.py:1686
msgid "Copy Substitute Parts"
msgstr ""
-#: part/serializers.py:1659
+#: part/serializers.py:1687
msgid "Copy substitute parts when duplicate BOM items"
msgstr ""
-#: part/serializers.py:1693
+#: part/serializers.py:1721
msgid "Clear Existing BOM"
msgstr ""
-#: part/serializers.py:1694
+#: part/serializers.py:1722
msgid "Delete existing BOM items before uploading"
msgstr ""
-#: part/serializers.py:1724
+#: part/serializers.py:1752
msgid "No part column specified"
msgstr ""
-#: part/serializers.py:1768
+#: part/serializers.py:1796
msgid "Multiple matching parts found"
msgstr ""
-#: part/serializers.py:1771
+#: part/serializers.py:1799
msgid "No matching part found"
msgstr ""
-#: part/serializers.py:1774
+#: part/serializers.py:1802
msgid "Part is not designated as a component"
msgstr ""
-#: part/serializers.py:1783
+#: part/serializers.py:1811
msgid "Quantity not provided"
msgstr ""
-#: part/serializers.py:1791
+#: part/serializers.py:1819
msgid "Invalid quantity"
msgstr ""
-#: part/serializers.py:1812
+#: part/serializers.py:1840
msgid "At least one BOM item is required"
msgstr ""
@@ -7221,7 +7251,7 @@ msgid "Validate BOM"
msgstr ""
#: part/templates/part/detail.html:283 part/templates/part/detail.html:284
-#: templates/js/translated/bom.js:1314 templates/js/translated/bom.js:1315
+#: templates/js/translated/bom.js:1320 templates/js/translated/bom.js:1321
msgid "Add BOM Item"
msgstr ""
@@ -7405,7 +7435,7 @@ msgstr ""
msgid "Allocated to Sales Orders"
msgstr ""
-#: part/templates/part/part_base.html:235 templates/js/translated/bom.js:1213
+#: part/templates/part/part_base.html:235 templates/js/translated/bom.js:1219
msgid "Can Build"
msgstr ""
@@ -8784,7 +8814,7 @@ msgstr ""
msgid "Where is this stock item located?"
msgstr ""
-#: stock/models.py:786 stock/serializers.py:1318
+#: stock/models.py:786 stock/serializers.py:1324
msgid "Packaging this stock item is stored in"
msgstr ""
@@ -8796,7 +8826,7 @@ msgstr ""
msgid "Serial number for this item"
msgstr ""
-#: stock/models.py:830 stock/serializers.py:1301
+#: stock/models.py:830 stock/serializers.py:1307
msgid "Batch code for this stock item"
msgstr ""
@@ -8905,7 +8935,7 @@ msgstr ""
msgid "Serialized stock cannot be merged"
msgstr ""
-#: stock/models.py:1639 stock/serializers.py:1207
+#: stock/models.py:1639 stock/serializers.py:1213
msgid "Duplicate stock items"
msgstr ""
@@ -8986,7 +9016,7 @@ msgstr ""
msgid "Enter serial numbers for new items"
msgstr ""
-#: stock/serializers.py:473 stock/serializers.py:1164 stock/serializers.py:1420
+#: stock/serializers.py:473 stock/serializers.py:1170 stock/serializers.py:1426
msgid "Destination stock location"
msgstr ""
@@ -9059,77 +9089,78 @@ msgstr ""
msgid "No stock items selected"
msgstr ""
-#: stock/serializers.py:863 stock/templates/stock/location.html:165
+#: stock/serializers.py:863 stock/serializers.py:926
+#: stock/templates/stock/location.html:165
#: stock/templates/stock/location.html:213
#: stock/templates/stock/location_sidebar.html:5
msgid "Sublocations"
msgstr ""
-#: stock/serializers.py:1036
+#: stock/serializers.py:1042
msgid "Part must be salable"
msgstr ""
-#: stock/serializers.py:1040
+#: stock/serializers.py:1046
msgid "Item is allocated to a sales order"
msgstr ""
-#: stock/serializers.py:1044
+#: stock/serializers.py:1050
msgid "Item is allocated to a build order"
msgstr ""
-#: stock/serializers.py:1068
+#: stock/serializers.py:1074
msgid "Customer to assign stock items"
msgstr ""
-#: stock/serializers.py:1074
+#: stock/serializers.py:1080
msgid "Selected company is not a customer"
msgstr ""
-#: stock/serializers.py:1082
+#: stock/serializers.py:1088
msgid "Stock assignment notes"
msgstr ""
-#: stock/serializers.py:1092 stock/serializers.py:1346
+#: stock/serializers.py:1098 stock/serializers.py:1352
msgid "A list of stock items must be provided"
msgstr ""
-#: stock/serializers.py:1171
+#: stock/serializers.py:1177
msgid "Stock merging notes"
msgstr ""
-#: stock/serializers.py:1176
+#: stock/serializers.py:1182
msgid "Allow mismatched suppliers"
msgstr ""
-#: stock/serializers.py:1177
+#: stock/serializers.py:1183
msgid "Allow stock items with different supplier parts to be merged"
msgstr ""
-#: stock/serializers.py:1182
+#: stock/serializers.py:1188
msgid "Allow mismatched status"
msgstr ""
-#: stock/serializers.py:1183
+#: stock/serializers.py:1189
msgid "Allow stock items with different status codes to be merged"
msgstr ""
-#: stock/serializers.py:1193
+#: stock/serializers.py:1199
msgid "At least two stock items must be provided"
msgstr ""
-#: stock/serializers.py:1260
+#: stock/serializers.py:1266
msgid "No Change"
msgstr ""
-#: stock/serializers.py:1289
+#: stock/serializers.py:1295
msgid "StockItem primary key value"
msgstr ""
-#: stock/serializers.py:1308
+#: stock/serializers.py:1314
msgid "Stock item status code"
msgstr ""
-#: stock/serializers.py:1336
+#: stock/serializers.py:1342
msgid "Stock transaction notes"
msgstr ""
@@ -10662,7 +10693,7 @@ msgid "The following parts are low on required stock"
msgstr ""
#: templates/email/build_order_required_stock.html:18
-#: templates/js/translated/bom.js:1668 templates/js/translated/build.js:2557
+#: templates/js/translated/bom.js:1674 templates/js/translated/build.js:2557
msgid "Required Quantity"
msgstr ""
@@ -10676,7 +10707,7 @@ msgid "Click on the following link to view this part"
msgstr ""
#: templates/email/low_stock_notification.html:18
-#: templates/js/translated/part.js:3209
+#: templates/js/translated/part.js:3218
msgid "Minimum Quantity"
msgstr ""
@@ -11051,62 +11082,68 @@ msgstr ""
msgid "No pricing available"
msgstr ""
-#: templates/js/translated/bom.js:1182 templates/js/translated/build.js:2596
+#: templates/js/translated/bom.js:1184 templates/js/translated/build.js:2622
+#, fuzzy
+#| msgid "External Link"
+msgid "External stock"
+msgstr "外部連結"
+
+#: templates/js/translated/bom.js:1188 templates/js/translated/build.js:2596
#: templates/js/translated/sales_order.js:1910
msgid "No Stock Available"
msgstr ""
-#: templates/js/translated/bom.js:1187 templates/js/translated/build.js:2600
+#: templates/js/translated/bom.js:1193 templates/js/translated/build.js:2600
msgid "Includes variant and substitute stock"
msgstr ""
-#: templates/js/translated/bom.js:1189 templates/js/translated/build.js:2602
+#: templates/js/translated/bom.js:1195 templates/js/translated/build.js:2602
#: templates/js/translated/part.js:1256
#: templates/js/translated/sales_order.js:1907
msgid "Includes variant stock"
msgstr ""
-#: templates/js/translated/bom.js:1191 templates/js/translated/build.js:2604
+#: templates/js/translated/bom.js:1197 templates/js/translated/build.js:2604
msgid "Includes substitute stock"
msgstr ""
-#: templates/js/translated/bom.js:1219 templates/js/translated/build.js:2587
+#: templates/js/translated/bom.js:1225 templates/js/translated/build.js:2587
msgid "Consumable item"
msgstr ""
-#: templates/js/translated/bom.js:1279
+#: templates/js/translated/bom.js:1285
msgid "Validate BOM Item"
msgstr ""
-#: templates/js/translated/bom.js:1281
+#: templates/js/translated/bom.js:1287
msgid "This line has been validated"
msgstr ""
-#: templates/js/translated/bom.js:1283
+#: templates/js/translated/bom.js:1289
msgid "Edit substitute parts"
msgstr ""
-#: templates/js/translated/bom.js:1285 templates/js/translated/bom.js:1480
+#: templates/js/translated/bom.js:1291 templates/js/translated/bom.js:1486
msgid "Edit BOM Item"
msgstr ""
-#: templates/js/translated/bom.js:1287
+#: templates/js/translated/bom.js:1293
msgid "Delete BOM Item"
msgstr ""
-#: templates/js/translated/bom.js:1307
+#: templates/js/translated/bom.js:1313
msgid "View BOM"
msgstr ""
-#: templates/js/translated/bom.js:1391
+#: templates/js/translated/bom.js:1397
msgid "No BOM items found"
msgstr ""
-#: templates/js/translated/bom.js:1651 templates/js/translated/build.js:2486
+#: templates/js/translated/bom.js:1657 templates/js/translated/build.js:2486
msgid "Required Part"
msgstr ""
-#: templates/js/translated/bom.js:1677
+#: templates/js/translated/bom.js:1683
msgid "Inherited from parent BOM"
msgstr ""
@@ -11449,29 +11486,29 @@ msgstr ""
msgid "Sufficient stock available"
msgstr ""
-#: templates/js/translated/build.js:2643
+#: templates/js/translated/build.js:2647
msgid "Consumable Item"
msgstr ""
-#: templates/js/translated/build.js:2648
+#: templates/js/translated/build.js:2652
msgid "Tracked item"
msgstr ""
-#: templates/js/translated/build.js:2655
+#: templates/js/translated/build.js:2659
#: templates/js/translated/sales_order.js:2016
msgid "Build stock"
msgstr ""
-#: templates/js/translated/build.js:2660 templates/js/translated/stock.js:1829
+#: templates/js/translated/build.js:2664 templates/js/translated/stock.js:1829
msgid "Order stock"
msgstr ""
-#: templates/js/translated/build.js:2664
+#: templates/js/translated/build.js:2668
#: templates/js/translated/sales_order.js:2010
msgid "Allocate stock"
msgstr ""
-#: templates/js/translated/build.js:2668
+#: templates/js/translated/build.js:2672
msgid "Remove stock allocation"
msgstr ""
@@ -12313,64 +12350,64 @@ msgstr ""
msgid "Subscribed category"
msgstr ""
-#: templates/js/translated/part.js:2855
+#: templates/js/translated/part.js:2864
msgid "No test templates matching query"
msgstr ""
-#: templates/js/translated/part.js:2877 templates/js/translated/search.js:342
+#: templates/js/translated/part.js:2886 templates/js/translated/search.js:342
msgid "results"
msgstr ""
-#: templates/js/translated/part.js:2927 templates/js/translated/stock.js:1446
+#: templates/js/translated/part.js:2936 templates/js/translated/stock.js:1446
msgid "Edit test result"
msgstr ""
-#: templates/js/translated/part.js:2928 templates/js/translated/stock.js:1447
+#: templates/js/translated/part.js:2937 templates/js/translated/stock.js:1447
#: templates/js/translated/stock.js:1692
msgid "Delete test result"
msgstr ""
-#: templates/js/translated/part.js:2932
+#: templates/js/translated/part.js:2941
msgid "This test is defined for a parent part"
msgstr ""
-#: templates/js/translated/part.js:2948
+#: templates/js/translated/part.js:2957
msgid "Edit Test Result Template"
msgstr ""
-#: templates/js/translated/part.js:2962
+#: templates/js/translated/part.js:2971
msgid "Delete Test Result Template"
msgstr ""
-#: templates/js/translated/part.js:3041 templates/js/translated/part.js:3042
+#: templates/js/translated/part.js:3050 templates/js/translated/part.js:3051
msgid "No date specified"
msgstr ""
-#: templates/js/translated/part.js:3044
+#: templates/js/translated/part.js:3053
msgid "Specified date is in the past"
msgstr ""
-#: templates/js/translated/part.js:3050
+#: templates/js/translated/part.js:3059
msgid "Speculative"
msgstr ""
-#: templates/js/translated/part.js:3100
+#: templates/js/translated/part.js:3109
msgid "No scheduling information available for this part"
msgstr ""
-#: templates/js/translated/part.js:3106
+#: templates/js/translated/part.js:3115
msgid "Error fetching scheduling information for this part"
msgstr ""
-#: templates/js/translated/part.js:3202
+#: templates/js/translated/part.js:3211
msgid "Scheduled Stock Quantities"
msgstr ""
-#: templates/js/translated/part.js:3218
+#: templates/js/translated/part.js:3227
msgid "Maximum Quantity"
msgstr ""
-#: templates/js/translated/part.js:3263
+#: templates/js/translated/part.js:3272
msgid "Minimum Stock Level"
msgstr ""
@@ -14052,4 +14089,3 @@ msgstr ""
#: users/models.py:413
msgid "Permission to delete items"
msgstr ""
-
diff --git a/InvenTree/locale/zh_Hans/LC_MESSAGES/django.po b/InvenTree/locale/zh_Hans/LC_MESSAGES/django.po
index 6be00343a6..b9979984b8 100644
--- a/InvenTree/locale/zh_Hans/LC_MESSAGES/django.po
+++ b/InvenTree/locale/zh_Hans/LC_MESSAGES/django.po
@@ -2,7 +2,7 @@ msgid ""
msgstr ""
"Project-Id-Version: inventree\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2024-02-28 06:44+0000\n"
+"POT-Creation-Date: 2024-03-05 00:41+0000\n"
"PO-Revision-Date: 2023-02-28 22:38\n"
"Last-Translator: \n"
"Language-Team: Chinese Simplified\n"
@@ -72,9 +72,9 @@ msgstr "输入日期"
#: report/templates/report/inventree_build_order_base.html:172
#: stock/admin.py:226 stock/models.py:2335 stock/models.py:2451
#: stock/serializers.py:479 stock/serializers.py:632 stock/serializers.py:728
-#: stock/serializers.py:778 stock/serializers.py:1081 stock/serializers.py:1170
-#: stock/serializers.py:1335 stock/templates/stock/stock_sidebar.html:25
-#: templates/js/translated/barcode.js:143 templates/js/translated/bom.js:1259
+#: stock/serializers.py:778 stock/serializers.py:1087 stock/serializers.py:1176
+#: stock/serializers.py:1341 stock/templates/stock/stock_sidebar.html:25
+#: templates/js/translated/barcode.js:143 templates/js/translated/bom.js:1265
#: templates/js/translated/company.js:1674 templates/js/translated/order.js:347
#: templates/js/translated/part.js:1080
#: templates/js/translated/purchase_order.js:2201
@@ -542,7 +542,7 @@ msgstr "名称"
#: templates/js/translated/order.js:298 templates/js/translated/part.js:1238
#: templates/js/translated/part.js:1483 templates/js/translated/part.js:1621
#: templates/js/translated/part.js:1958 templates/js/translated/part.js:2355
-#: templates/js/translated/part.js:2785 templates/js/translated/part.js:2887
+#: templates/js/translated/part.js:2785 templates/js/translated/part.js:2896
#: templates/js/translated/plugin.js:80
#: templates/js/translated/purchase_order.js:1707
#: templates/js/translated/purchase_order.js:1850
@@ -703,7 +703,7 @@ msgstr "远程图像文件的 URL"
msgid "Downloading images from remote URL is not enabled"
msgstr "未启用从远程 URL下载图像"
-#: InvenTree/status.py:66 part/serializers.py:1120
+#: InvenTree/status.py:66 part/serializers.py:1138
msgid "Background worker check failed"
msgstr "后台工作人员检查失败"
@@ -1003,7 +1003,7 @@ msgid "Tracked"
msgstr ""
#: build/api.py:285 part/admin.py:144 templates/js/translated/build.js:1741
-#: templates/js/translated/build.js:2626
+#: templates/js/translated/build.js:2630
#: templates/js/translated/sales_order.js:1929
#: templates/js/translated/table_filters.js:571
msgid "Allocated"
@@ -1091,11 +1091,11 @@ msgstr "此次生产匹配的订单"
#: build/models.py:199 build/templates/build/build_base.html:97
#: build/templates/build/detail.html:29 company/models.py:1044
#: order/models.py:1389 order/models.py:1532 order/models.py:1533
-#: part/api.py:1528 part/models.py:389 part/models.py:3003 part/models.py:3147
-#: part/models.py:3291 part/models.py:3314 part/models.py:3335
-#: part/models.py:3357 part/models.py:3458 part/models.py:3754
-#: part/models.py:3885 part/models.py:3978 part/models.py:4339
-#: part/serializers.py:1066 part/serializers.py:1631
+#: part/api.py:1528 part/api.py:1820 part/models.py:389 part/models.py:3003
+#: part/models.py:3147 part/models.py:3291 part/models.py:3314
+#: part/models.py:3335 part/models.py:3357 part/models.py:3458
+#: part/models.py:3754 part/models.py:3885 part/models.py:3978
+#: part/models.py:4339 part/serializers.py:1084 part/serializers.py:1659
#: part/templates/part/part_app_base.html:8
#: part/templates/part/part_pricing.html:12
#: part/templates/part/upload_bom.html:52
@@ -1194,7 +1194,7 @@ msgid "Build status code"
msgstr "生产状态代码"
#: build/models.py:264 build/serializers.py:280 order/serializers.py:549
-#: stock/models.py:826 stock/serializers.py:1300
+#: stock/models.py:826 stock/serializers.py:1306
#: templates/js/translated/purchase_order.js:1129
msgid "Batch Code"
msgstr "批量代码"
@@ -1293,52 +1293,52 @@ msgstr "商品二维码"
msgid "Project code for this build order"
msgstr "此构建订单的优先级"
-#: build/models.py:559
+#: build/models.py:575
#, python-brace-format
msgid "Build order {build} has been completed"
msgstr "生产订单 {build} 已完成"
-#: build/models.py:565
+#: build/models.py:581
msgid "A build order has been completed"
msgstr "生产订单已完成"
-#: build/models.py:783 build/models.py:858
+#: build/models.py:799 build/models.py:874
msgid "No build output specified"
msgstr "未指定生产产出"
-#: build/models.py:786
+#: build/models.py:802
msgid "Build output is already completed"
msgstr "生产产出已完成"
-#: build/models.py:789
+#: build/models.py:805
msgid "Build output does not match Build Order"
msgstr "生产产出与订单不匹配"
-#: build/models.py:862 build/serializers.py:223 build/serializers.py:262
+#: build/models.py:878 build/serializers.py:223 build/serializers.py:262
#: build/serializers.py:831 order/models.py:526 order/serializers.py:401
-#: order/serializers.py:544 part/serializers.py:1423 part/serializers.py:1789
+#: order/serializers.py:544 part/serializers.py:1442 part/serializers.py:1817
#: stock/models.py:665 stock/models.py:1477 stock/serializers.py:450
msgid "Quantity must be greater than zero"
msgstr "数量必须大于0"
-#: build/models.py:867 build/serializers.py:228
+#: build/models.py:883 build/serializers.py:228
#, fuzzy
#| msgid "Quantity must be greater than zero"
msgid "Quantity cannot be greater than the output quantity"
msgstr "数量必须大于0"
-#: build/models.py:924 build/serializers.py:533
+#: build/models.py:940 build/serializers.py:533
#, python-brace-format
msgid "Build output {serial} has not passed all required tests"
msgstr ""
-#: build/models.py:1286
+#: build/models.py:1302
#, fuzzy
#| msgid "Build Notes"
msgid "Build object"
msgstr "生产备注"
-#: build/models.py:1300 build/models.py:1558 build/serializers.py:210
+#: build/models.py:1316 build/models.py:1574 build/serializers.py:210
#: build/serializers.py:247 build/templates/build/build_base.html:102
#: build/templates/build/detail.html:34 common/models.py:2432
#: order/models.py:1247 order/models.py:1902 order/serializers.py:1306
@@ -1365,7 +1365,7 @@ msgstr "生产备注"
#: templates/js/translated/company.js:1808
#: templates/js/translated/model_renderers.js:230
#: templates/js/translated/order.js:304 templates/js/translated/part.js:961
-#: templates/js/translated/part.js:1811 templates/js/translated/part.js:3332
+#: templates/js/translated/part.js:1811 templates/js/translated/part.js:3341
#: templates/js/translated/pricing.js:381
#: templates/js/translated/pricing.js:474
#: templates/js/translated/pricing.js:522
@@ -1385,42 +1385,42 @@ msgstr "生产备注"
msgid "Quantity"
msgstr "数量"
-#: build/models.py:1301
+#: build/models.py:1317
#, fuzzy
#| msgid "Stock required for build order"
msgid "Required quantity for build order"
msgstr "生产订单所需的库存"
-#: build/models.py:1381
+#: build/models.py:1397
msgid "Build item must specify a build output, as master part is marked as trackable"
msgstr "生产项必须指定生产产出,因为主部件已经被标记为可追踪的"
-#: build/models.py:1390
+#: build/models.py:1406
#, python-brace-format
msgid "Allocated quantity ({q}) must not exceed available stock quantity ({a})"
msgstr "分配数量 ({q}) 不得超过可用库存数量 ({a})"
-#: build/models.py:1400 order/models.py:1853
+#: build/models.py:1416 order/models.py:1853
msgid "Stock item is over-allocated"
msgstr "库存物品分配过度!"
-#: build/models.py:1406 order/models.py:1856
+#: build/models.py:1422 order/models.py:1856
msgid "Allocation quantity must be greater than zero"
msgstr "分配数量必须大于0"
-#: build/models.py:1412
+#: build/models.py:1428
msgid "Quantity must be 1 for serialized stock"
msgstr "序列化库存的数量必须是 1"
-#: build/models.py:1473
+#: build/models.py:1489
#, fuzzy
#| msgid "Selected stock item not found in BOM"
msgid "Selected stock item does not match BOM line"
msgstr "在BOM中找不到选定的库存项"
-#: build/models.py:1545 build/serializers.py:811 order/serializers.py:1150
-#: order/serializers.py:1171 stock/serializers.py:544 stock/serializers.py:1019
-#: stock/serializers.py:1131 stock/templates/stock/item_base.html:10
+#: build/models.py:1561 build/serializers.py:811 order/serializers.py:1150
+#: order/serializers.py:1171 stock/serializers.py:544 stock/serializers.py:1025
+#: stock/serializers.py:1137 stock/templates/stock/item_base.html:10
#: stock/templates/stock/item_base.html:23
#: stock/templates/stock/item_base.html:194
#: templates/js/translated/build.js:1742
@@ -1435,19 +1435,19 @@ msgstr "在BOM中找不到选定的库存项"
msgid "Stock Item"
msgstr "库存项"
-#: build/models.py:1546
+#: build/models.py:1562
msgid "Source stock item"
msgstr "源库存项"
-#: build/models.py:1559
+#: build/models.py:1575
msgid "Stock quantity to allocate to build"
msgstr "分配到生产的数量"
-#: build/models.py:1567
+#: build/models.py:1583
msgid "Install into"
msgstr "安装到"
-#: build/models.py:1568
+#: build/models.py:1584
msgid "Destination stock item"
msgstr "目标库存项"
@@ -1511,9 +1511,9 @@ msgid "A list of build outputs must be provided"
msgstr "必须提供生产产出列表"
#: build/serializers.py:426 build/serializers.py:498 order/serializers.py:533
-#: order/serializers.py:641 order/serializers.py:1646 part/serializers.py:1086
+#: order/serializers.py:641 order/serializers.py:1646 part/serializers.py:1104
#: stock/serializers.py:472 stock/serializers.py:627 stock/serializers.py:723
-#: stock/serializers.py:1163 stock/serializers.py:1419
+#: stock/serializers.py:1169 stock/serializers.py:1425
#: stock/templates/stock/item_base.html:394
#: templates/js/translated/barcode.js:547
#: templates/js/translated/barcode.js:795 templates/js/translated/build.js:999
@@ -1559,7 +1559,7 @@ msgstr "已完成生产产出的仓储地点"
#: build/serializers.py:505 build/templates/build/build_base.html:151
#: build/templates/build/detail.html:62 order/models.py:910
#: order/models.py:2005 order/serializers.py:565 stock/admin.py:165
-#: stock/serializers.py:774 stock/serializers.py:1307
+#: stock/serializers.py:774 stock/serializers.py:1313
#: stock/templates/stock/item_base.html:427
#: templates/js/translated/barcode.js:252 templates/js/translated/build.js:2189
#: templates/js/translated/purchase_order.js:1308
@@ -1671,7 +1671,7 @@ msgstr "删除参数"
msgid "bom_item.part must point to the same part as the build order"
msgstr "bom_item.part 必须与生产订单指向相同的部件"
-#: build/serializers.py:817 stock/serializers.py:1032
+#: build/serializers.py:817 stock/serializers.py:1038
msgid "Item must be in stock"
msgstr "项目必须在库存中"
@@ -1728,44 +1728,45 @@ msgstr "可选项目"
msgid "Allocate optional BOM items to build order"
msgstr "分配可选的BOM项目来建立订单"
-#: build/serializers.py:1096 part/models.py:3895 part/models.py:4331
+#: build/serializers.py:1097 part/models.py:3895 part/models.py:4331
#: stock/api.py:745
msgid "BOM Item"
msgstr "BOM项"
-#: build/serializers.py:1105 templates/js/translated/index.js:130
+#: build/serializers.py:1106 templates/js/translated/index.js:130
msgid "Allocated Stock"
msgstr ""
-#: build/serializers.py:1110 part/admin.py:132 part/bom.py:173
-#: part/serializers.py:1441 part/templates/part/part_base.html:210
-#: templates/js/translated/bom.js:1202 templates/js/translated/build.js:2614
-#: templates/js/translated/part.js:709 templates/js/translated/part.js:2148
+#: build/serializers.py:1111 part/admin.py:132 part/bom.py:173
+#: part/serializers.py:798 part/serializers.py:1460
+#: part/templates/part/part_base.html:210 templates/js/translated/bom.js:1208
+#: templates/js/translated/build.js:2614 templates/js/translated/part.js:709
+#: templates/js/translated/part.js:2148
#: templates/js/translated/table_filters.js:170
msgid "On Order"
msgstr ""
-#: build/serializers.py:1115 part/serializers.py:1443
+#: build/serializers.py:1116 part/serializers.py:1462
#: templates/js/translated/build.js:2618
#: templates/js/translated/table_filters.js:360
msgid "In Production"
msgstr "正在生产"
-#: build/serializers.py:1120 part/bom.py:172 part/serializers.py:1454
+#: build/serializers.py:1121 part/bom.py:172 part/serializers.py:1473
#: part/templates/part/part_base.html:192
#: templates/js/translated/sales_order.js:1893
msgid "Available Stock"
msgstr "可用库存"
-#: build/tasks.py:149
+#: build/tasks.py:171
msgid "Stock required for build order"
msgstr "生产订单所需的库存"
-#: build/tasks.py:166
+#: build/tasks.py:188
msgid "Overdue Build Order"
msgstr "超时构建顺序"
-#: build/tasks.py:171
+#: build/tasks.py:193
#, python-brace-format
msgid "Build order {bo} is now overdue"
msgstr "生成订单 {bo} 现在已过期"
@@ -2069,29 +2070,35 @@ msgstr "订单所需部件"
msgid "Order Parts"
msgstr "订购商品"
-#: build/templates/build/detail.html:210
+#: build/templates/build/detail.html:205
+#, fuzzy
+#| msgid "Untracked stock has been fully allocated for this Build Order"
+msgid "Available stock has been filtered based on specified source location for this build order"
+msgstr "未跟踪的库存已完全分配给此生产订单"
+
+#: build/templates/build/detail.html:215
msgid "Incomplete Build Outputs"
msgstr "未完成的生产产出"
-#: build/templates/build/detail.html:214
+#: build/templates/build/detail.html:219
msgid "Create new build output"
msgstr "创建新构建输出"
-#: build/templates/build/detail.html:215
+#: build/templates/build/detail.html:220
msgid "New Build Output"
msgstr "新建构建输出"
-#: build/templates/build/detail.html:232 build/templates/build/sidebar.html:15
+#: build/templates/build/detail.html:237 build/templates/build/sidebar.html:15
#, fuzzy
#| msgid "Minimum Stock"
msgid "Consumed Stock"
msgstr "最低库存"
-#: build/templates/build/detail.html:244
+#: build/templates/build/detail.html:249
msgid "Completed Build Outputs"
msgstr "已完成构建输出"
-#: build/templates/build/detail.html:256 build/templates/build/sidebar.html:19
+#: build/templates/build/detail.html:261 build/templates/build/sidebar.html:19
#: company/templates/company/detail.html:229
#: company/templates/company/manufacturer_part.html:141
#: company/templates/company/manufacturer_part_sidebar.html:9
@@ -2107,15 +2114,15 @@ msgstr "已完成构建输出"
msgid "Attachments"
msgstr "附件"
-#: build/templates/build/detail.html:271
+#: build/templates/build/detail.html:276
msgid "Build Notes"
msgstr "生产备注"
-#: build/templates/build/detail.html:426
+#: build/templates/build/detail.html:434
msgid "Allocation Complete"
msgstr "分配完成"
-#: build/templates/build/detail.html:427
+#: build/templates/build/detail.html:435
#, fuzzy
#| msgid "Required stock has not been fully allocated"
msgid "All lines have been fully allocated"
@@ -2534,7 +2541,7 @@ msgid "Parts are templates by default"
msgstr ""
#: common/models.py:1456 part/admin.py:91 part/admin.py:431 part/models.py:1015
-#: templates/js/translated/bom.js:1633
+#: templates/js/translated/bom.js:1639
#: templates/js/translated/table_filters.js:330
#: templates/js/translated/table_filters.js:721
msgid "Assembly"
@@ -3625,7 +3632,7 @@ msgstr ""
msgid "Price break quantity"
msgstr ""
-#: common/models.py:2440 company/serializers.py:484 order/admin.py:42
+#: common/models.py:2440 company/serializers.py:486 order/admin.py:42
#: order/models.py:1321 order/models.py:2226
#: templates/js/translated/company.js:1813 templates/js/translated/part.js:1885
#: templates/js/translated/pricing.js:621
@@ -4146,7 +4153,7 @@ msgstr "选择商品"
#: company/models.py:495 company/templates/company/company_base.html:76
#: company/templates/company/manufacturer_part.html:90
-#: company/templates/company/supplier_part.html:145 part/serializers.py:497
+#: company/templates/company/supplier_part.html:145 part/serializers.py:505
#: stock/templates/stock/item_base.html:207
#: templates/js/translated/company.js:506
#: templates/js/translated/company.js:1108
@@ -4161,7 +4168,7 @@ msgid "Select manufacturer"
msgstr "选择制造商"
#: company/models.py:502 company/templates/company/manufacturer_part.html:101
-#: company/templates/company/supplier_part.html:153 part/serializers.py:507
+#: company/templates/company/supplier_part.html:153 part/serializers.py:515
#: templates/js/translated/company.js:351
#: templates/js/translated/company.js:1107
#: templates/js/translated/company.js:1302
@@ -4235,7 +4242,7 @@ msgstr ""
#: company/models.py:795 company/templates/company/company_base.html:81
#: company/templates/company/supplier_part.html:129 order/models.py:453
#: order/templates/order/order_base.html:136 part/bom.py:272 part/bom.py:310
-#: part/serializers.py:481 plugin/builtin/suppliers/digikey.py:25
+#: part/serializers.py:489 plugin/builtin/suppliers/digikey.py:25
#: plugin/builtin/suppliers/lcsc.py:26 plugin/builtin/suppliers/mouser.py:24
#: plugin/builtin/suppliers/tme.py:26 stock/templates/stock/item_base.html:224
#: templates/email/overdue_purchase_order.html:16
@@ -4252,7 +4259,7 @@ msgstr "供应商"
msgid "Select supplier"
msgstr "选择供应商"
-#: company/models.py:802 part/serializers.py:492
+#: company/models.py:802 part/serializers.py:500
msgid "Supplier stock keeping unit"
msgstr ""
@@ -4288,7 +4295,7 @@ msgid "Minimum charge (e.g. stocking fee)"
msgstr "最低收费(例如库存费)"
#: company/models.py:851 company/templates/company/supplier_part.html:160
-#: stock/admin.py:224 stock/models.py:785 stock/serializers.py:1317
+#: stock/admin.py:224 stock/models.py:785 stock/serializers.py:1323
#: stock/templates/stock/item_base.html:240
#: templates/js/translated/company.js:1636
#: templates/js/translated/stock.js:2387
@@ -4333,7 +4340,7 @@ msgstr ""
msgid "Date of last update of availability data"
msgstr ""
-#: company/serializers.py:153
+#: company/serializers.py:155
msgid "Default currency used for this supplier"
msgstr "该公司使用的默认货币"
@@ -4396,7 +4403,7 @@ msgstr ""
#: company/templates/company/company_base.html:86 order/models.py:898
#: order/models.py:1993 order/templates/order/return_order_base.html:131
#: order/templates/order/sales_order_base.html:144 stock/models.py:807
-#: stock/models.py:808 stock/serializers.py:1067
+#: stock/models.py:808 stock/serializers.py:1073
#: stock/templates/stock/item_base.html:405
#: templates/email/overdue_sales_order.html:16
#: templates/js/translated/company.js:502
@@ -4621,8 +4628,9 @@ msgstr ""
#: company/templates/company/manufacturer_part.html:119
#: company/templates/company/supplier_part.html:15 company/views.py:31
-#: part/admin.py:122 part/templates/part/part_sidebar.html:33
-#: templates/InvenTree/search.html:190 templates/navbar.html:48
+#: part/admin.py:122 part/serializers.py:802
+#: part/templates/part/part_sidebar.html:33 templates/InvenTree/search.html:190
+#: templates/navbar.html:48
msgid "Suppliers"
msgstr "供应商"
@@ -4724,7 +4732,7 @@ msgid "No supplier information available"
msgstr ""
#: company/templates/company/supplier_part.html:139 part/bom.py:279
-#: part/bom.py:311 part/serializers.py:491
+#: part/bom.py:311 part/serializers.py:499
#: templates/js/translated/company.js:349 templates/js/translated/part.js:1786
#: templates/js/translated/pricing.js:510
#: templates/js/translated/purchase_order.js:1851
@@ -4773,10 +4781,12 @@ msgstr ""
msgid "Update Part Availability"
msgstr ""
-#: company/templates/company/supplier_part_sidebar.html:5 part/stocktake.py:223
+#: company/templates/company/supplier_part_sidebar.html:5
+#: part/serializers.py:801 part/stocktake.py:223
#: part/templates/part/category.html:183
#: part/templates/part/category_sidebar.html:17 stock/admin.py:69
-#: stock/serializers.py:760 stock/templates/stock/location.html:170
+#: stock/serializers.py:760 stock/serializers.py:924
+#: stock/templates/stock/location.html:170
#: stock/templates/stock/location.html:184
#: stock/templates/stock/location.html:196
#: stock/templates/stock/location_sidebar.html:7
@@ -4838,7 +4848,7 @@ msgid "Label template file"
msgstr "标签模板文件"
#: label/models.py:143 part/models.py:3484 report/models.py:322
-#: templates/js/translated/part.js:2891
+#: templates/js/translated/part.js:2900
#: templates/js/translated/table_filters.js:481
msgid "Enabled"
msgstr "已启用"
@@ -6013,7 +6023,7 @@ msgid "Pending Shipments"
msgstr ""
#: order/templates/order/sales_order_detail.html:71
-#: templates/js/translated/bom.js:1271 templates/js/translated/filters.js:296
+#: templates/js/translated/bom.js:1277 templates/js/translated/filters.js:296
msgid "Actions"
msgstr ""
@@ -6143,10 +6153,10 @@ msgstr ""
msgid "Category Path"
msgstr "类别路径"
-#: part/admin.py:323 part/models.py:390 part/serializers.py:259
-#: part/serializers.py:373 part/templates/part/cat_link.html:3
-#: part/templates/part/category.html:23 part/templates/part/category.html:141
-#: part/templates/part/category.html:161
+#: part/admin.py:323 part/models.py:390 part/serializers.py:112
+#: part/serializers.py:265 part/serializers.py:381
+#: part/templates/part/cat_link.html:3 part/templates/part/category.html:23
+#: part/templates/part/category.html:141 part/templates/part/category.html:161
#: part/templates/part/category_sidebar.html:9
#: templates/InvenTree/index.html:36 templates/InvenTree/search.html:84
#: templates/InvenTree/settings/sidebar.html:47
@@ -6171,13 +6181,13 @@ msgstr ""
msgid "Part IPN"
msgstr ""
-#: part/admin.py:421 part/serializers.py:1220
+#: part/admin.py:421 part/serializers.py:1238
#: templates/js/translated/pricing.js:358
#: templates/js/translated/pricing.js:1024
msgid "Minimum Price"
msgstr ""
-#: part/admin.py:426 part/serializers.py:1235
+#: part/admin.py:426 part/serializers.py:1253
#: templates/js/translated/pricing.js:353
#: templates/js/translated/pricing.js:1032
msgid "Maximum Price"
@@ -6264,7 +6274,7 @@ msgid "This option must be selected"
msgstr ""
#: part/api.py:1541 part/models.py:895 part/models.py:3385 part/models.py:3831
-#: part/serializers.py:388 part/serializers.py:1076
+#: part/serializers.py:396 part/serializers.py:1094
#: part/templates/part/part_base.html:260 stock/api.py:733
#: templates/InvenTree/settings/settings_staff_js.html:300
#: templates/js/translated/notification.js:60
@@ -6272,12 +6282,17 @@ msgstr ""
msgid "Category"
msgstr "类别"
+#: part/api.py:1828
+msgid "Uses"
+msgstr ""
+
#: part/bom.py:170 part/models.py:100 part/models.py:938
#: part/templates/part/category.html:116 part/templates/part/part_base.html:367
msgid "Default Location"
msgstr "默认仓储地点"
-#: part/bom.py:171 templates/email/low_stock_notification.html:16
+#: part/bom.py:171 part/serializers.py:803
+#: templates/email/low_stock_notification.html:16
msgid "Total Stock"
msgstr ""
@@ -6300,7 +6315,8 @@ msgstr "商品类别"
msgid "Default location for parts in this category"
msgstr "此类别商品的默认仓储地点"
-#: part/models.py:106 stock/models.py:165 templates/js/translated/stock.js:2736
+#: part/models.py:106 stock/models.py:165 templates/js/translated/part.js:2810
+#: templates/js/translated/stock.js:2736
#: templates/js/translated/table_filters.js:239
#: templates/js/translated/table_filters.js:283
msgid "Structural"
@@ -6713,7 +6729,7 @@ msgstr ""
msgid "Test with this name already exists for this part"
msgstr ""
-#: part/models.py:3464 templates/js/translated/part.js:2870
+#: part/models.py:3464 templates/js/translated/part.js:2879
msgid "Test Name"
msgstr ""
@@ -6741,7 +6757,7 @@ msgstr ""
msgid "Is this test enabled?"
msgstr ""
-#: part/models.py:3489 templates/js/translated/part.js:2899
+#: part/models.py:3489 templates/js/translated/part.js:2908
#: templates/js/translated/table_filters.js:477
msgid "Required"
msgstr ""
@@ -6750,7 +6766,7 @@ msgstr ""
msgid "Is this test required to pass?"
msgstr ""
-#: part/models.py:3495 templates/js/translated/part.js:2907
+#: part/models.py:3495 templates/js/translated/part.js:2916
msgid "Requires Value"
msgstr ""
@@ -6758,7 +6774,7 @@ msgstr ""
msgid "Does this test require a value when adding a test result?"
msgstr ""
-#: part/models.py:3501 templates/js/translated/part.js:2914
+#: part/models.py:3501 templates/js/translated/part.js:2923
msgid "Requires Attachment"
msgstr ""
@@ -6986,327 +7002,345 @@ msgstr ""
msgid "Duplicate relationship already exists"
msgstr ""
-#: part/serializers.py:128 part/templates/part/category.html:122
-#: part/templates/part/category.html:207
+#: part/serializers.py:114 part/serializers.py:134
+#: part/templates/part/category.html:122 part/templates/part/category.html:207
#: part/templates/part/category_sidebar.html:7
msgid "Subcategories"
msgstr "子类别"
-#: part/serializers.py:172
+#: part/serializers.py:178
msgid "Results"
msgstr ""
-#: part/serializers.py:173
+#: part/serializers.py:179
msgid "Number of results recorded against this template"
msgstr ""
-#: part/serializers.py:197 part/serializers.py:215 stock/serializers.py:384
+#: part/serializers.py:203 part/serializers.py:221 stock/serializers.py:384
msgid "Purchase currency of this stock item"
msgstr ""
-#: part/serializers.py:260
+#: part/serializers.py:266
msgid "Number of parts using this template"
msgstr ""
-#: part/serializers.py:379
+#: part/serializers.py:387
#, fuzzy
#| msgid "Rejected"
msgid "No parts selected"
msgstr "已拒绝"
-#: part/serializers.py:389
+#: part/serializers.py:397
#, fuzzy
#| msgid "Set category"
msgid "Select category"
msgstr "设置类别"
-#: part/serializers.py:419
+#: part/serializers.py:427
msgid "Original Part"
msgstr ""
-#: part/serializers.py:420
+#: part/serializers.py:428
msgid "Select original part to duplicate"
msgstr ""
-#: part/serializers.py:425
+#: part/serializers.py:433
msgid "Copy Image"
msgstr ""
-#: part/serializers.py:426
+#: part/serializers.py:434
msgid "Copy image from original part"
msgstr ""
-#: part/serializers.py:432 part/templates/part/detail.html:277
+#: part/serializers.py:440 part/templates/part/detail.html:277
msgid "Copy BOM"
msgstr ""
-#: part/serializers.py:433
+#: part/serializers.py:441
msgid "Copy bill of materials from original part"
msgstr ""
-#: part/serializers.py:439
+#: part/serializers.py:447
msgid "Copy Parameters"
msgstr ""
-#: part/serializers.py:440
+#: part/serializers.py:448
msgid "Copy parameter data from original part"
msgstr ""
-#: part/serializers.py:446
+#: part/serializers.py:454
#, fuzzy
#| msgid "Company Notes"
msgid "Copy Notes"
msgstr "公司备注"
-#: part/serializers.py:447
+#: part/serializers.py:455
msgid "Copy notes from original part"
msgstr ""
-#: part/serializers.py:460
+#: part/serializers.py:468
msgid "Initial Stock Quantity"
msgstr ""
-#: part/serializers.py:462
+#: part/serializers.py:470
msgid "Specify initial stock quantity for this Part. If quantity is zero, no stock is added."
msgstr ""
-#: part/serializers.py:469
+#: part/serializers.py:477
msgid "Initial Stock Location"
msgstr ""
-#: part/serializers.py:470
+#: part/serializers.py:478
msgid "Specify initial stock location for this Part"
msgstr ""
-#: part/serializers.py:482
+#: part/serializers.py:490
msgid "Select supplier (or leave blank to skip)"
msgstr ""
-#: part/serializers.py:498
+#: part/serializers.py:506
msgid "Select manufacturer (or leave blank to skip)"
msgstr ""
-#: part/serializers.py:508
+#: part/serializers.py:516
msgid "Manufacturer part number"
msgstr ""
-#: part/serializers.py:515
+#: part/serializers.py:523
msgid "Selected company is not a valid supplier"
msgstr ""
-#: part/serializers.py:524
+#: part/serializers.py:532
msgid "Selected company is not a valid manufacturer"
msgstr ""
-#: part/serializers.py:535
+#: part/serializers.py:543
msgid "Manufacturer part matching this MPN already exists"
msgstr ""
-#: part/serializers.py:542
+#: part/serializers.py:550
msgid "Supplier part matching this SKU already exists"
msgstr ""
-#: part/serializers.py:815 part/templates/part/copy_part.html:9
+#: part/serializers.py:804
+#, fuzzy
+#| msgid "External Link"
+msgid "External Stock"
+msgstr "外部链接"
+
+#: part/serializers.py:806
+#, fuzzy
+#| msgid "Unallocate Stock"
+msgid "Unallocated Stock"
+msgstr "未分配库存"
+
+#: part/serializers.py:808
+#, fuzzy
+#| msgid "Part Stock"
+msgid "Variant Stock"
+msgstr "商品库存"
+
+#: part/serializers.py:833 part/templates/part/copy_part.html:9
#: templates/js/translated/part.js:471
msgid "Duplicate Part"
msgstr "复制部件"
-#: part/serializers.py:816
+#: part/serializers.py:834
msgid "Copy initial data from another Part"
msgstr ""
-#: part/serializers.py:822 templates/js/translated/part.js:102
+#: part/serializers.py:840 templates/js/translated/part.js:102
msgid "Initial Stock"
msgstr ""
-#: part/serializers.py:823
+#: part/serializers.py:841
msgid "Create Part with initial stock quantity"
msgstr ""
-#: part/serializers.py:829
+#: part/serializers.py:847
msgid "Supplier Information"
msgstr ""
-#: part/serializers.py:830
+#: part/serializers.py:848
msgid "Add initial supplier information for this part"
msgstr ""
-#: part/serializers.py:838
+#: part/serializers.py:856
msgid "Copy Category Parameters"
msgstr "复制类别参数"
-#: part/serializers.py:839
+#: part/serializers.py:857
msgid "Copy parameter templates from selected part category"
msgstr ""
-#: part/serializers.py:844
+#: part/serializers.py:862
#, fuzzy
#| msgid "Existing barcode found"
msgid "Existing Image"
msgstr "发现现有条码"
-#: part/serializers.py:845
+#: part/serializers.py:863
msgid "Filename of an existing part image"
msgstr ""
-#: part/serializers.py:862
+#: part/serializers.py:880
#, fuzzy
#| msgid "Part image not found"
msgid "Image file does not exist"
msgstr "未找到商品图像"
-#: part/serializers.py:1068
+#: part/serializers.py:1086
msgid "Limit stocktake report to a particular part, and any variant parts"
msgstr ""
-#: part/serializers.py:1078
+#: part/serializers.py:1096
msgid "Limit stocktake report to a particular part category, and any child categories"
msgstr ""
-#: part/serializers.py:1088
+#: part/serializers.py:1106
msgid "Limit stocktake report to a particular stock location, and any child locations"
msgstr ""
-#: part/serializers.py:1094
+#: part/serializers.py:1112
msgid "Exclude External Stock"
msgstr ""
-#: part/serializers.py:1095
+#: part/serializers.py:1113
#, fuzzy
#| msgid "Exclude stock items from this selected location"
msgid "Exclude stock items in external locations"
msgstr "从该选定的仓储地点排除库存项"
-#: part/serializers.py:1100
+#: part/serializers.py:1118
msgid "Generate Report"
msgstr ""
-#: part/serializers.py:1101
+#: part/serializers.py:1119
msgid "Generate report file containing calculated stocktake data"
msgstr ""
-#: part/serializers.py:1106
+#: part/serializers.py:1124
msgid "Update Parts"
msgstr ""
-#: part/serializers.py:1107
+#: part/serializers.py:1125
msgid "Update specified parts with calculated stocktake data"
msgstr ""
-#: part/serializers.py:1115
+#: part/serializers.py:1133
msgid "Stocktake functionality is not enabled"
msgstr ""
-#: part/serializers.py:1221
+#: part/serializers.py:1239
msgid "Override calculated value for minimum price"
msgstr ""
-#: part/serializers.py:1228
+#: part/serializers.py:1246
#, fuzzy
#| msgid "Uses default currency"
msgid "Minimum price currency"
msgstr "使用默认货币"
-#: part/serializers.py:1236
+#: part/serializers.py:1254
msgid "Override calculated value for maximum price"
msgstr ""
-#: part/serializers.py:1243
+#: part/serializers.py:1261
#, fuzzy
#| msgid "Uses default currency"
msgid "Maximum price currency"
msgstr "使用默认货币"
-#: part/serializers.py:1272
+#: part/serializers.py:1290
msgid "Update"
msgstr ""
-#: part/serializers.py:1273
+#: part/serializers.py:1291
msgid "Update pricing for this part"
msgstr ""
-#: part/serializers.py:1296
+#: part/serializers.py:1314
#, python-brace-format
msgid "Could not convert from provided currencies to {default_currency}"
msgstr ""
-#: part/serializers.py:1303
+#: part/serializers.py:1321
msgid "Minimum price must not be greater than maximum price"
msgstr ""
-#: part/serializers.py:1306
+#: part/serializers.py:1324
msgid "Maximum price must not be less than minimum price"
msgstr ""
-#: part/serializers.py:1632
+#: part/serializers.py:1660
msgid "Select part to copy BOM from"
msgstr ""
-#: part/serializers.py:1640
+#: part/serializers.py:1668
msgid "Remove Existing Data"
msgstr ""
-#: part/serializers.py:1641
+#: part/serializers.py:1669
msgid "Remove existing BOM items before copying"
msgstr ""
-#: part/serializers.py:1646
+#: part/serializers.py:1674
msgid "Include Inherited"
msgstr ""
-#: part/serializers.py:1647
+#: part/serializers.py:1675
msgid "Include BOM items which are inherited from templated parts"
msgstr ""
-#: part/serializers.py:1652
+#: part/serializers.py:1680
msgid "Skip Invalid Rows"
msgstr ""
-#: part/serializers.py:1653
+#: part/serializers.py:1681
msgid "Enable this option to skip invalid rows"
msgstr ""
-#: part/serializers.py:1658
+#: part/serializers.py:1686
msgid "Copy Substitute Parts"
msgstr ""
-#: part/serializers.py:1659
+#: part/serializers.py:1687
msgid "Copy substitute parts when duplicate BOM items"
msgstr ""
-#: part/serializers.py:1693
+#: part/serializers.py:1721
msgid "Clear Existing BOM"
msgstr ""
-#: part/serializers.py:1694
+#: part/serializers.py:1722
msgid "Delete existing BOM items before uploading"
msgstr ""
-#: part/serializers.py:1724
+#: part/serializers.py:1752
msgid "No part column specified"
msgstr ""
-#: part/serializers.py:1768
+#: part/serializers.py:1796
msgid "Multiple matching parts found"
msgstr ""
-#: part/serializers.py:1771
+#: part/serializers.py:1799
msgid "No matching part found"
msgstr ""
-#: part/serializers.py:1774
+#: part/serializers.py:1802
msgid "Part is not designated as a component"
msgstr ""
-#: part/serializers.py:1783
+#: part/serializers.py:1811
msgid "Quantity not provided"
msgstr ""
-#: part/serializers.py:1791
+#: part/serializers.py:1819
msgid "Invalid quantity"
msgstr ""
-#: part/serializers.py:1812
+#: part/serializers.py:1840
msgid "At least one BOM item is required"
msgstr ""
@@ -7542,7 +7576,7 @@ msgid "Validate BOM"
msgstr ""
#: part/templates/part/detail.html:283 part/templates/part/detail.html:284
-#: templates/js/translated/bom.js:1314 templates/js/translated/bom.js:1315
+#: templates/js/translated/bom.js:1320 templates/js/translated/bom.js:1321
msgid "Add BOM Item"
msgstr ""
@@ -7728,7 +7762,7 @@ msgstr ""
msgid "Allocated to Sales Orders"
msgstr ""
-#: part/templates/part/part_base.html:235 templates/js/translated/bom.js:1213
+#: part/templates/part/part_base.html:235 templates/js/translated/bom.js:1219
msgid "Can Build"
msgstr ""
@@ -9243,7 +9277,7 @@ msgstr ""
msgid "Where is this stock item located?"
msgstr ""
-#: stock/models.py:786 stock/serializers.py:1318
+#: stock/models.py:786 stock/serializers.py:1324
msgid "Packaging this stock item is stored in"
msgstr ""
@@ -9255,7 +9289,7 @@ msgstr ""
msgid "Serial number for this item"
msgstr ""
-#: stock/models.py:830 stock/serializers.py:1301
+#: stock/models.py:830 stock/serializers.py:1307
msgid "Batch code for this stock item"
msgstr ""
@@ -9371,7 +9405,7 @@ msgstr ""
msgid "Serialized stock cannot be merged"
msgstr ""
-#: stock/models.py:1639 stock/serializers.py:1207
+#: stock/models.py:1639 stock/serializers.py:1213
msgid "Duplicate stock items"
msgstr ""
@@ -9456,7 +9490,7 @@ msgstr ""
msgid "Enter serial numbers for new items"
msgstr "输入新项目的序列号"
-#: stock/serializers.py:473 stock/serializers.py:1164 stock/serializers.py:1420
+#: stock/serializers.py:473 stock/serializers.py:1170 stock/serializers.py:1426
msgid "Destination stock location"
msgstr "目标库存位置"
@@ -9539,81 +9573,82 @@ msgstr "在BOM中找不到选定的库存项"
msgid "No stock items selected"
msgstr "库存项已创建"
-#: stock/serializers.py:863 stock/templates/stock/location.html:165
+#: stock/serializers.py:863 stock/serializers.py:926
+#: stock/templates/stock/location.html:165
#: stock/templates/stock/location.html:213
#: stock/templates/stock/location_sidebar.html:5
msgid "Sublocations"
msgstr ""
-#: stock/serializers.py:1036
+#: stock/serializers.py:1042
msgid "Part must be salable"
msgstr ""
-#: stock/serializers.py:1040
+#: stock/serializers.py:1046
msgid "Item is allocated to a sales order"
msgstr ""
-#: stock/serializers.py:1044
+#: stock/serializers.py:1050
msgid "Item is allocated to a build order"
msgstr ""
-#: stock/serializers.py:1068
+#: stock/serializers.py:1074
msgid "Customer to assign stock items"
msgstr ""
-#: stock/serializers.py:1074
+#: stock/serializers.py:1080
msgid "Selected company is not a customer"
msgstr ""
-#: stock/serializers.py:1082
+#: stock/serializers.py:1088
msgid "Stock assignment notes"
msgstr ""
-#: stock/serializers.py:1092 stock/serializers.py:1346
+#: stock/serializers.py:1098 stock/serializers.py:1352
msgid "A list of stock items must be provided"
msgstr ""
-#: stock/serializers.py:1171
+#: stock/serializers.py:1177
msgid "Stock merging notes"
msgstr ""
-#: stock/serializers.py:1176
+#: stock/serializers.py:1182
msgid "Allow mismatched suppliers"
msgstr ""
-#: stock/serializers.py:1177
+#: stock/serializers.py:1183
msgid "Allow stock items with different supplier parts to be merged"
msgstr ""
-#: stock/serializers.py:1182
+#: stock/serializers.py:1188
msgid "Allow mismatched status"
msgstr ""
-#: stock/serializers.py:1183
+#: stock/serializers.py:1189
msgid "Allow stock items with different status codes to be merged"
msgstr ""
-#: stock/serializers.py:1193
+#: stock/serializers.py:1199
msgid "At least two stock items must be provided"
msgstr ""
-#: stock/serializers.py:1260
+#: stock/serializers.py:1266
#, fuzzy
#| msgid "Change"
msgid "No Change"
msgstr "更改"
-#: stock/serializers.py:1289
+#: stock/serializers.py:1295
msgid "StockItem primary key value"
msgstr ""
-#: stock/serializers.py:1308
+#: stock/serializers.py:1314
#, fuzzy
#| msgid "Stock item created"
msgid "Stock item status code"
msgstr "库存项已创建"
-#: stock/serializers.py:1336
+#: stock/serializers.py:1342
msgid "Stock transaction notes"
msgstr ""
@@ -11204,7 +11239,7 @@ msgid "The following parts are low on required stock"
msgstr ""
#: templates/email/build_order_required_stock.html:18
-#: templates/js/translated/bom.js:1668 templates/js/translated/build.js:2557
+#: templates/js/translated/bom.js:1674 templates/js/translated/build.js:2557
msgid "Required Quantity"
msgstr ""
@@ -11218,7 +11253,7 @@ msgid "Click on the following link to view this part"
msgstr ""
#: templates/email/low_stock_notification.html:18
-#: templates/js/translated/part.js:3209
+#: templates/js/translated/part.js:3218
msgid "Minimum Quantity"
msgstr ""
@@ -11601,62 +11636,68 @@ msgstr ""
msgid "No pricing available"
msgstr ""
-#: templates/js/translated/bom.js:1182 templates/js/translated/build.js:2596
+#: templates/js/translated/bom.js:1184 templates/js/translated/build.js:2622
+#, fuzzy
+#| msgid "External Link"
+msgid "External stock"
+msgstr "外部链接"
+
+#: templates/js/translated/bom.js:1188 templates/js/translated/build.js:2596
#: templates/js/translated/sales_order.js:1910
msgid "No Stock Available"
msgstr ""
-#: templates/js/translated/bom.js:1187 templates/js/translated/build.js:2600
+#: templates/js/translated/bom.js:1193 templates/js/translated/build.js:2600
msgid "Includes variant and substitute stock"
msgstr ""
-#: templates/js/translated/bom.js:1189 templates/js/translated/build.js:2602
+#: templates/js/translated/bom.js:1195 templates/js/translated/build.js:2602
#: templates/js/translated/part.js:1256
#: templates/js/translated/sales_order.js:1907
msgid "Includes variant stock"
msgstr ""
-#: templates/js/translated/bom.js:1191 templates/js/translated/build.js:2604
+#: templates/js/translated/bom.js:1197 templates/js/translated/build.js:2604
msgid "Includes substitute stock"
msgstr ""
-#: templates/js/translated/bom.js:1219 templates/js/translated/build.js:2587
+#: templates/js/translated/bom.js:1225 templates/js/translated/build.js:2587
msgid "Consumable item"
msgstr ""
-#: templates/js/translated/bom.js:1279
+#: templates/js/translated/bom.js:1285
msgid "Validate BOM Item"
msgstr ""
-#: templates/js/translated/bom.js:1281
+#: templates/js/translated/bom.js:1287
msgid "This line has been validated"
msgstr ""
-#: templates/js/translated/bom.js:1283
+#: templates/js/translated/bom.js:1289
msgid "Edit substitute parts"
msgstr ""
-#: templates/js/translated/bom.js:1285 templates/js/translated/bom.js:1480
+#: templates/js/translated/bom.js:1291 templates/js/translated/bom.js:1486
msgid "Edit BOM Item"
msgstr ""
-#: templates/js/translated/bom.js:1287
+#: templates/js/translated/bom.js:1293
msgid "Delete BOM Item"
msgstr ""
-#: templates/js/translated/bom.js:1307
+#: templates/js/translated/bom.js:1313
msgid "View BOM"
msgstr ""
-#: templates/js/translated/bom.js:1391
+#: templates/js/translated/bom.js:1397
msgid "No BOM items found"
msgstr ""
-#: templates/js/translated/bom.js:1651 templates/js/translated/build.js:2486
+#: templates/js/translated/bom.js:1657 templates/js/translated/build.js:2486
msgid "Required Part"
msgstr ""
-#: templates/js/translated/bom.js:1677
+#: templates/js/translated/bom.js:1683
msgid "Inherited from parent BOM"
msgstr ""
@@ -12043,33 +12084,33 @@ msgstr "数量"
msgid "Sufficient stock available"
msgstr ""
-#: templates/js/translated/build.js:2643
+#: templates/js/translated/build.js:2647
#, fuzzy
#| msgid "Minimum Stock"
msgid "Consumable Item"
msgstr "最低库存"
-#: templates/js/translated/build.js:2648
+#: templates/js/translated/build.js:2652
#, fuzzy
#| msgid "Stock Item"
msgid "Tracked item"
msgstr "库存项"
-#: templates/js/translated/build.js:2655
+#: templates/js/translated/build.js:2659
#: templates/js/translated/sales_order.js:2016
msgid "Build stock"
msgstr ""
-#: templates/js/translated/build.js:2660 templates/js/translated/stock.js:1829
+#: templates/js/translated/build.js:2664 templates/js/translated/stock.js:1829
msgid "Order stock"
msgstr ""
-#: templates/js/translated/build.js:2664
+#: templates/js/translated/build.js:2668
#: templates/js/translated/sales_order.js:2010
msgid "Allocate stock"
msgstr ""
-#: templates/js/translated/build.js:2668
+#: templates/js/translated/build.js:2672
#, fuzzy
#| msgid "Confirm stock allocation"
msgid "Remove stock allocation"
@@ -12983,64 +13024,64 @@ msgstr ""
msgid "Subscribed category"
msgstr ""
-#: templates/js/translated/part.js:2855
+#: templates/js/translated/part.js:2864
msgid "No test templates matching query"
msgstr ""
-#: templates/js/translated/part.js:2877 templates/js/translated/search.js:342
+#: templates/js/translated/part.js:2886 templates/js/translated/search.js:342
msgid "results"
msgstr ""
-#: templates/js/translated/part.js:2927 templates/js/translated/stock.js:1446
+#: templates/js/translated/part.js:2936 templates/js/translated/stock.js:1446
msgid "Edit test result"
msgstr ""
-#: templates/js/translated/part.js:2928 templates/js/translated/stock.js:1447
+#: templates/js/translated/part.js:2937 templates/js/translated/stock.js:1447
#: templates/js/translated/stock.js:1692
msgid "Delete test result"
msgstr ""
-#: templates/js/translated/part.js:2932
+#: templates/js/translated/part.js:2941
msgid "This test is defined for a parent part"
msgstr ""
-#: templates/js/translated/part.js:2948
+#: templates/js/translated/part.js:2957
msgid "Edit Test Result Template"
msgstr ""
-#: templates/js/translated/part.js:2962
+#: templates/js/translated/part.js:2971
msgid "Delete Test Result Template"
msgstr ""
-#: templates/js/translated/part.js:3041 templates/js/translated/part.js:3042
+#: templates/js/translated/part.js:3050 templates/js/translated/part.js:3051
msgid "No date specified"
msgstr ""
-#: templates/js/translated/part.js:3044
+#: templates/js/translated/part.js:3053
msgid "Specified date is in the past"
msgstr ""
-#: templates/js/translated/part.js:3050
+#: templates/js/translated/part.js:3059
msgid "Speculative"
msgstr ""
-#: templates/js/translated/part.js:3100
+#: templates/js/translated/part.js:3109
msgid "No scheduling information available for this part"
msgstr ""
-#: templates/js/translated/part.js:3106
+#: templates/js/translated/part.js:3115
msgid "Error fetching scheduling information for this part"
msgstr ""
-#: templates/js/translated/part.js:3202
+#: templates/js/translated/part.js:3211
msgid "Scheduled Stock Quantities"
msgstr ""
-#: templates/js/translated/part.js:3218
+#: templates/js/translated/part.js:3227
msgid "Maximum Quantity"
msgstr ""
-#: templates/js/translated/part.js:3263
+#: templates/js/translated/part.js:3272
msgid "Minimum Stock Level"
msgstr ""
@@ -14883,9 +14924,6 @@ msgstr "删除项目权限"
#~ msgid "Build to allocate parts"
#~ msgstr "生产以分配部件"
-#~ msgid "Untracked stock has been fully allocated for this Build Order"
-#~ msgstr "未跟踪的库存已完全分配给此生产订单"
-
#~ msgid "Untracked stock has not been fully allocated for this Build Order"
#~ msgstr "未跟踪的库存尚未完全分配给此生产订单"
diff --git a/InvenTree/machine/api.py b/InvenTree/machine/api.py
index 9448d2ea99..3bd2853467 100644
--- a/InvenTree/machine/api.py
+++ b/InvenTree/machine/api.py
@@ -144,7 +144,9 @@ class MachineRestart(APIView):
permission_classes = [permissions.IsAuthenticated]
- @extend_schema(responses={200: MachineSerializers.MachineRestartSerializer()})
+ @extend_schema(
+ request=None, responses={200: MachineSerializers.MachineRestartSerializer()}
+ )
def post(self, request, pk):
"""Restart machine by pk."""
machine = get_machine(pk)
diff --git a/InvenTree/order/serializers.py b/InvenTree/order/serializers.py
index 3405e7b8b8..90f9aa0a0d 100644
--- a/InvenTree/order/serializers.py
+++ b/InvenTree/order/serializers.py
@@ -5,7 +5,16 @@ from decimal import Decimal
from django.core.exceptions import ValidationError as DjangoValidationError
from django.db import models, transaction
-from django.db.models import BooleanField, Case, ExpressionWrapper, F, Q, Value, When
+from django.db.models import (
+ BooleanField,
+ Case,
+ ExpressionWrapper,
+ F,
+ Prefetch,
+ Q,
+ Value,
+ When,
+)
from django.utils.translation import gettext_lazy as _
from rest_framework import serializers
@@ -14,6 +23,8 @@ from sql_util.utils import SubqueryCount
import order.models
import part.filters
+import part.filters as part_filters
+import part.models as part_models
import stock.models
import stock.serializers
from common.serializers import ProjectCodeSerializer
@@ -375,6 +386,17 @@ class PurchaseOrderLineItemSerializer(InvenTreeModelSerializer):
- "total_price" = purchase_price * quantity
- "overdue" status (boolean field)
"""
+ queryset = queryset.prefetch_related(
+ Prefetch(
+ 'part__part',
+ queryset=part_models.Part.objects.annotate(
+ category_default_location=part_filters.annotate_default_location(
+ 'category__'
+ )
+ ).prefetch_related(None),
+ )
+ )
+
queryset = queryset.annotate(
total_price=ExpressionWrapper(
F('purchase_price') * F('quantity'), output_field=models.DecimalField()
diff --git a/InvenTree/part/api.py b/InvenTree/part/api.py
index 68d606a551..7b7ec1c7e5 100644
--- a/InvenTree/part/api.py
+++ b/InvenTree/part/api.py
@@ -1767,6 +1767,7 @@ class BomFilter(rest_filters.FilterSet):
part_active = rest_filters.BooleanFilter(
label='Master part is active', field_name='part__active'
)
+
part_trackable = rest_filters.BooleanFilter(
label='Master part is trackable', field_name='part__trackable'
)
@@ -1775,6 +1776,7 @@ class BomFilter(rest_filters.FilterSet):
sub_part_trackable = rest_filters.BooleanFilter(
label='Sub part is trackable', field_name='sub_part__trackable'
)
+
sub_part_assembly = rest_filters.BooleanFilter(
label='Sub part is an assembly', field_name='sub_part__assembly'
)
@@ -1814,6 +1816,22 @@ class BomFilter(rest_filters.FilterSet):
return queryset.filter(q_a | q_b).distinct()
+ part = rest_filters.ModelChoiceFilter(
+ queryset=Part.objects.all(), method='filter_part', label=_('Part')
+ )
+
+ def filter_part(self, queryset, name, part):
+ """Filter the queryset based on the specified part."""
+ return queryset.filter(part.get_bom_item_filter())
+
+ uses = rest_filters.ModelChoiceFilter(
+ queryset=Part.objects.all(), method='filter_uses', label=_('Uses')
+ )
+
+ def filter_uses(self, queryset, name, part):
+ """Filter the queryset based on the specified part."""
+ return queryset.filter(part.get_used_in_bom_item_filter())
+
class BomMixin:
"""Mixin class for BomItem API endpoints."""
@@ -1889,62 +1907,6 @@ class BomList(BomMixin, ListCreateDestroyAPIView):
return JsonResponse(data, safe=False)
return Response(data)
- def filter_queryset(self, queryset):
- """Custom query filtering for the BomItem list API."""
- queryset = super().filter_queryset(queryset)
-
- params = self.request.query_params
-
- # Filter by part?
- part = params.get('part', None)
-
- if part is not None:
- """
- If we are filtering by "part", there are two cases to consider:
-
- a) Bom items which are defined for *this* part
- b) Inherited parts which are defined for a *parent* part
-
- So we need to construct two queries!
- """
-
- # First, check that the part is actually valid!
- try:
- part = Part.objects.get(pk=part)
-
- queryset = queryset.filter(part.get_bom_item_filter())
-
- except (ValueError, Part.DoesNotExist):
- pass
-
- """
- Filter by 'uses'?
-
- Here we pass a part ID and return BOM items for any assemblies which "use" (or "require") that part.
-
- There are multiple ways that an assembly can "use" a sub-part:
-
- A) Directly specifying the sub_part in a BomItem field
- B) Specifying a "template" part with inherited=True
- C) Allowing variant parts to be substituted
- D) Allowing direct substitute parts to be specified
-
- - BOM items which are "inherited" by parts which are variants of the master BomItem
- """
- uses = params.get('uses', None)
-
- if uses is not None:
- try:
- # Extract the part we are interested in
- uses_part = Part.objects.get(pk=uses)
-
- queryset = queryset.filter(uses_part.get_used_in_bom_item_filter())
-
- except (ValueError, Part.DoesNotExist):
- pass
-
- return queryset
-
filter_backends = SEARCH_ORDER_FILTER_ALIAS
search_fields = [
diff --git a/InvenTree/part/filters.py b/InvenTree/part/filters.py
index f7303cc190..4d247529b9 100644
--- a/InvenTree/part/filters.py
+++ b/InvenTree/part/filters.py
@@ -107,7 +107,7 @@ def annotate_on_order_quantity(reference: str = ''):
)
-def annotate_total_stock(reference: str = ''):
+def annotate_total_stock(reference: str = '', filter: Q = None):
"""Annotate 'total stock' quantity against a queryset.
- This function calculates the 'total stock' for a given part
@@ -121,6 +121,9 @@ def annotate_total_stock(reference: str = ''):
# Stock filter only returns 'in stock' items
stock_filter = stock.models.StockItem.IN_STOCK_FILTER
+ if filter is not None:
+ stock_filter &= filter
+
return Coalesce(
SubquerySum(f'{reference}stock_items__quantity', filter=stock_filter),
Decimal(0),
@@ -216,9 +219,7 @@ def annotate_sales_order_allocations(reference: str = ''):
)
-def variant_stock_query(
- reference: str = '', filter: Q = stock.models.StockItem.IN_STOCK_FILTER
-):
+def variant_stock_query(reference: str = '', filter: Q = None):
"""Create a queryset to retrieve all stock items for variant parts under the specified part.
- Useful for annotating a queryset with aggregated information about variant parts
@@ -227,11 +228,16 @@ def variant_stock_query(
reference: The relationship reference of the part from the current model
filter: Q object which defines how to filter the returned StockItem instances
"""
+ stock_filter = stock.models.StockItem.IN_STOCK_FILTER
+
+ if filter:
+ stock_filter &= filter
+
return stock.models.StockItem.objects.filter(
part__tree_id=OuterRef(f'{reference}tree_id'),
part__lft__gt=OuterRef(f'{reference}lft'),
part__rght__lt=OuterRef(f'{reference}rght'),
- ).filter(filter)
+ ).filter(stock_filter)
def annotate_variant_quantity(subquery: Q, reference: str = 'quantity'):
@@ -281,6 +287,32 @@ def annotate_category_parts():
)
+def annotate_default_location(reference=''):
+ """Construct a queryset that finds the closest default location in the part's category tree.
+
+ If the part's category has its own default_location, this is returned.
+ If not, the category tree is traversed until a value is found.
+ """
+ subquery = part.models.PartCategory.objects.filter(
+ tree_id=OuterRef(f'{reference}tree_id'),
+ lft__lt=OuterRef(f'{reference}lft'),
+ rght__gt=OuterRef(f'{reference}rght'),
+ level__lte=OuterRef(f'{reference}level'),
+ parent__isnull=False,
+ )
+
+ return Coalesce(
+ F(f'{reference}default_location'),
+ Subquery(
+ subquery.order_by('-level')
+ .filter(default_location__isnull=False)
+ .values('default_location')
+ ),
+ Value(None),
+ output_field=IntegerField(),
+ )
+
+
def annotate_sub_categories():
"""Construct a queryset annotation which returns the number of subcategories for each provided category."""
subquery = part.models.PartCategory.objects.filter(
diff --git a/InvenTree/part/migrations/0109_auto_20230517_1048.py b/InvenTree/part/migrations/0109_auto_20230517_1048.py
index 01e3ad0026..d2ef071050 100644
--- a/InvenTree/part/migrations/0109_auto_20230517_1048.py
+++ b/InvenTree/part/migrations/0109_auto_20230517_1048.py
@@ -138,6 +138,8 @@ def update_parameter_values(apps, schema_editor):
class Migration(migrations.Migration):
+ atomic = False
+
dependencies = [
('part', '0108_auto_20230516_1334'),
]
diff --git a/InvenTree/part/models.py b/InvenTree/part/models.py
index c962ba3d81..b20eff7453 100644
--- a/InvenTree/part/models.py
+++ b/InvenTree/part/models.py
@@ -3428,6 +3428,13 @@ class PartTestTemplate(InvenTree.models.InvenTreeMetadataModel):
self.key = helpers.generateTestKey(self.test_name)
+ if len(self.key) == 0:
+ raise ValidationError({
+ 'test_name': _(
+ 'Invalid template name - must include at least one alphanumeric character'
+ )
+ })
+
self.validate_unique()
super().clean()
@@ -3445,7 +3452,9 @@ class PartTestTemplate(InvenTree.models.InvenTreeMetadataModel):
if tests.exists():
raise ValidationError({
- 'test_name': _('Test with this name already exists for this part')
+ 'test_name': _(
+ 'Test template with the same key already exists for part'
+ )
})
super().validate_unique(exclude)
diff --git a/InvenTree/part/serializers.py b/InvenTree/part/serializers.py
index 175c1b5036..f02ade9ed9 100644
--- a/InvenTree/part/serializers.py
+++ b/InvenTree/part/serializers.py
@@ -74,12 +74,14 @@ class CategorySerializer(InvenTree.serializers.InvenTreeModelSerializer):
'level',
'parent',
'part_count',
+ 'subcategories',
'pathstring',
'path',
'starred',
'url',
'structural',
'icon',
+ 'parent_default_location',
]
def __init__(self, *args, **kwargs):
@@ -99,13 +101,22 @@ class CategorySerializer(InvenTree.serializers.InvenTreeModelSerializer):
def annotate_queryset(queryset):
"""Annotate extra information to the queryset."""
# Annotate the number of 'parts' which exist in each category (including subcategories!)
- queryset = queryset.annotate(part_count=part.filters.annotate_category_parts())
+ queryset = queryset.annotate(
+ part_count=part.filters.annotate_category_parts(),
+ subcategories=part.filters.annotate_sub_categories(),
+ )
+
+ queryset = queryset.annotate(
+ parent_default_location=part.filters.annotate_default_location('parent__')
+ )
return queryset
url = serializers.CharField(source='get_absolute_url', read_only=True)
- part_count = serializers.IntegerField(read_only=True)
+ part_count = serializers.IntegerField(read_only=True, label=_('Parts'))
+
+ subcategories = serializers.IntegerField(read_only=True, label=_('Subcategories'))
level = serializers.IntegerField(read_only=True)
@@ -115,6 +126,8 @@ class CategorySerializer(InvenTree.serializers.InvenTreeModelSerializer):
child=serializers.DictField(), source='get_path', read_only=True
)
+ parent_default_location = serializers.IntegerField(read_only=True)
+
class CategoryTree(InvenTree.serializers.InvenTreeModelSerializer):
"""Serializer for PartCategory tree."""
@@ -277,11 +290,13 @@ class PartBriefSerializer(InvenTree.serializers.InvenTreeModelSerializer):
'pk',
'IPN',
'barcode_hash',
+ 'category_default_location',
'default_location',
'name',
'revision',
'full_name',
'description',
+ 'image',
'thumbnail',
'active',
'assembly',
@@ -307,6 +322,9 @@ class PartBriefSerializer(InvenTree.serializers.InvenTreeModelSerializer):
self.fields.pop('pricing_min')
self.fields.pop('pricing_max')
+ category_default_location = serializers.IntegerField(read_only=True)
+
+ image = InvenTree.serializers.InvenTreeImageSerializerField(read_only=True)
thumbnail = serializers.CharField(source='get_thumbnail_url', read_only=True)
# Pricing fields
@@ -603,6 +621,7 @@ class PartSerializer(
'allocated_to_build_orders',
'allocated_to_sales_orders',
'building',
+ 'category_default_location',
'in_stock',
'ordering',
'required_for_build_orders',
@@ -610,6 +629,7 @@ class PartSerializer(
'stock_item_count',
'suppliers',
'total_in_stock',
+ 'external_stock',
'unallocated_stock',
'variant_stock',
# Fields only used for Part creation
@@ -734,6 +754,12 @@ class PartSerializer(
)
)
+ queryset = queryset.annotate(
+ external_stock=part.filters.annotate_total_stock(
+ filter=Q(location__external=True)
+ )
+ )
+
# Annotate with the total 'available stock' quantity
# This is the current stock, minus any allocations
queryset = queryset.annotate(
@@ -751,6 +777,12 @@ class PartSerializer(
required_for_sales_orders=part.filters.annotate_sales_order_requirements(),
)
+ queryset = queryset.annotate(
+ category_default_location=part.filters.annotate_default_location(
+ 'category__'
+ )
+ )
+
return queryset
def get_starred(self, part) -> bool:
@@ -780,14 +812,18 @@ class PartSerializer(
allocated_to_sales_orders = serializers.FloatField(read_only=True)
building = serializers.FloatField(read_only=True)
in_stock = serializers.FloatField(read_only=True)
- ordering = serializers.FloatField(read_only=True)
+ ordering = serializers.FloatField(read_only=True, label=_('On Order'))
required_for_build_orders = serializers.IntegerField(read_only=True)
required_for_sales_orders = serializers.IntegerField(read_only=True)
- stock_item_count = serializers.IntegerField(read_only=True)
- suppliers = serializers.IntegerField(read_only=True)
- total_in_stock = serializers.FloatField(read_only=True)
- unallocated_stock = serializers.FloatField(read_only=True)
- variant_stock = serializers.FloatField(read_only=True)
+ stock_item_count = serializers.IntegerField(read_only=True, label=_('Stock Items'))
+ suppliers = serializers.IntegerField(read_only=True, label=_('Suppliers'))
+ total_in_stock = serializers.FloatField(read_only=True, label=_('Total Stock'))
+ external_stock = serializers.FloatField(read_only=True, label=_('External Stock'))
+ unallocated_stock = serializers.FloatField(
+ read_only=True, label=_('Unallocated Stock')
+ )
+ category_default_location = serializers.IntegerField(read_only=True)
+ variant_stock = serializers.FloatField(read_only=True, label=_('Variant Stock'))
minimum_stock = serializers.FloatField()
@@ -1387,6 +1423,7 @@ class BomItemSerializer(InvenTree.serializers.InvenTreeModelSerializer):
'available_stock',
'available_substitute_stock',
'available_variant_stock',
+ 'external_stock',
# Annotated field describing quantity on order
'on_order',
# Annotated field describing quantity being built
@@ -1456,6 +1493,8 @@ class BomItemSerializer(InvenTree.serializers.InvenTreeModelSerializer):
available_substitute_stock = serializers.FloatField(read_only=True)
available_variant_stock = serializers.FloatField(read_only=True)
+ external_stock = serializers.FloatField(read_only=True)
+
@staticmethod
def setup_eager_loading(queryset):
"""Prefetch against the provided queryset to speed up database access."""
@@ -1534,6 +1573,13 @@ class BomItemSerializer(InvenTree.serializers.InvenTreeModelSerializer):
)
)
+ # Calculate 'external_stock'
+ queryset = queryset.annotate(
+ external_stock=part.filters.annotate_total_stock(
+ reference=ref, filter=Q(location__external=True)
+ )
+ )
+
ref = 'substitutes__part__'
# Extract similar information for any 'substitute' parts
diff --git a/InvenTree/part/test_part.py b/InvenTree/part/test_part.py
index 98f9dc5410..369cada331 100644
--- a/InvenTree/part/test_part.py
+++ b/InvenTree/part/test_part.py
@@ -431,6 +431,29 @@ class TestTemplateTest(TestCase):
self.assertEqual(variant.getTestTemplates().count(), n + 1)
+ def test_key_generation(self):
+ """Test the key generation method."""
+ variant = Part.objects.get(pk=10004)
+
+ invalid_names = ['', '+', '+++++++', ' ', '<>$&&&']
+
+ for name in invalid_names:
+ template = PartTestTemplate(part=variant, test_name=name)
+ with self.assertRaises(ValidationError):
+ template.clean()
+
+ valid_names = [
+ 'Собранный щит',
+ '!! 123 Собранный щит <><><> $$$$$ !!!',
+ '----hello world----',
+ 'Olá Mundo',
+ '我不懂中文',
+ ]
+
+ for name in valid_names:
+ template = PartTestTemplate(part=variant, test_name=name)
+ template.clean()
+
class PartSettingsTest(InvenTreeTestCase):
"""Tests to ensure that the user-configurable default values work as expected.
diff --git a/InvenTree/report/api.py b/InvenTree/report/api.py
index 2b39a96e84..315c6b0159 100644
--- a/InvenTree/report/api.py
+++ b/InvenTree/report/api.py
@@ -17,31 +17,14 @@ import common.models
import InvenTree.helpers
import order.models
import part.models
+import report.models
+import report.serializers
from InvenTree.api import MetadataView
from InvenTree.exceptions import log_error
from InvenTree.filters import InvenTreeSearchFilter
from InvenTree.mixins import ListCreateAPI, RetrieveAPI, RetrieveUpdateDestroyAPI
from stock.models import StockItem, StockItemAttachment, StockLocation
-from .models import (
- BillOfMaterialsReport,
- BuildReport,
- PurchaseOrderReport,
- ReturnOrderReport,
- SalesOrderReport,
- StockLocationReport,
- TestReport,
-)
-from .serializers import (
- BOMReportSerializer,
- BuildReportSerializer,
- PurchaseOrderReportSerializer,
- ReturnOrderReportSerializer,
- SalesOrderReportSerializer,
- StockLocationReportSerializer,
- TestReportSerializer,
-)
-
class ReportListView(ListCreateAPI):
"""Generic API class for report templates."""
@@ -264,7 +247,12 @@ class ReportPrintMixin:
except Exception as exc:
# Log the exception to the database
- log_error(request.path)
+ if InvenTree.helpers.str2bool(
+ common.models.InvenTreeSetting.get_setting(
+ 'REPORT_LOG_ERRORS', cache=False
+ )
+ ):
+ log_error(request.path)
# Re-throw the exception to the client as a DRF exception
raise ValidationError({
@@ -287,8 +275,8 @@ class StockItemTestReportMixin(ReportFilterMixin):
ITEM_MODEL = StockItem
ITEM_KEY = 'item'
- queryset = TestReport.objects.all()
- serializer_class = TestReportSerializer
+ queryset = report.models.TestReport.objects.all()
+ serializer_class = report.serializers.TestReportSerializer
class StockItemTestReportList(StockItemTestReportMixin, ReportListView):
@@ -338,8 +326,8 @@ class BOMReportMixin(ReportFilterMixin):
ITEM_MODEL = part.models.Part
ITEM_KEY = 'part'
- queryset = BillOfMaterialsReport.objects.all()
- serializer_class = BOMReportSerializer
+ queryset = report.models.BillOfMaterialsReport.objects.all()
+ serializer_class = report.serializers.BOMReportSerializer
class BOMReportList(BOMReportMixin, ReportListView):
@@ -372,8 +360,8 @@ class BuildReportMixin(ReportFilterMixin):
ITEM_MODEL = build.models.Build
ITEM_KEY = 'build'
- queryset = BuildReport.objects.all()
- serializer_class = BuildReportSerializer
+ queryset = report.models.BuildReport.objects.all()
+ serializer_class = report.serializers.BuildReportSerializer
class BuildReportList(BuildReportMixin, ReportListView):
@@ -406,8 +394,8 @@ class PurchaseOrderReportMixin(ReportFilterMixin):
ITEM_MODEL = order.models.PurchaseOrder
ITEM_KEY = 'order'
- queryset = PurchaseOrderReport.objects.all()
- serializer_class = PurchaseOrderReportSerializer
+ queryset = report.models.PurchaseOrderReport.objects.all()
+ serializer_class = report.serializers.PurchaseOrderReportSerializer
class PurchaseOrderReportList(PurchaseOrderReportMixin, ReportListView):
@@ -434,8 +422,8 @@ class SalesOrderReportMixin(ReportFilterMixin):
ITEM_MODEL = order.models.SalesOrder
ITEM_KEY = 'order'
- queryset = SalesOrderReport.objects.all()
- serializer_class = SalesOrderReportSerializer
+ queryset = report.models.SalesOrderReport.objects.all()
+ serializer_class = report.serializers.SalesOrderReportSerializer
class SalesOrderReportList(SalesOrderReportMixin, ReportListView):
@@ -462,8 +450,8 @@ class ReturnOrderReportMixin(ReportFilterMixin):
ITEM_MODEL = order.models.ReturnOrder
ITEM_KEY = 'order'
- queryset = ReturnOrderReport.objects.all()
- serializer_class = ReturnOrderReportSerializer
+ queryset = report.models.ReturnOrderReport.objects.all()
+ serializer_class = report.serializers.ReturnOrderReportSerializer
class ReturnOrderReportList(ReturnOrderReportMixin, ReportListView):
@@ -489,8 +477,8 @@ class StockLocationReportMixin(ReportFilterMixin):
ITEM_MODEL = StockLocation
ITEM_KEY = 'location'
- queryset = StockLocationReport.objects.all()
- serializer_class = StockLocationReportSerializer
+ queryset = report.models.StockLocationReport.objects.all()
+ serializer_class = report.serializers.StockLocationReportSerializer
class StockLocationReportList(StockLocationReportMixin, ReportListView):
@@ -511,7 +499,57 @@ class StockLocationReportPrint(StockLocationReportMixin, ReportPrintMixin, Retri
pass
+class ReportSnippetList(ListCreateAPI):
+ """API endpoint for listing ReportSnippet objects."""
+
+ queryset = report.models.ReportSnippet.objects.all()
+ serializer_class = report.serializers.ReportSnippetSerializer
+
+
+class ReportSnippetDetail(RetrieveUpdateDestroyAPI):
+ """API endpoint for a single ReportSnippet object."""
+
+ queryset = report.models.ReportSnippet.objects.all()
+ serializer_class = report.serializers.ReportSnippetSerializer
+
+
+class ReportAssetList(ListCreateAPI):
+ """API endpoint for listing ReportAsset objects."""
+
+ queryset = report.models.ReportAsset.objects.all()
+ serializer_class = report.serializers.ReportAssetSerializer
+
+
+class ReportAssetDetail(RetrieveUpdateDestroyAPI):
+ """API endpoint for a single ReportAsset object."""
+
+ queryset = report.models.ReportAsset.objects.all()
+ serializer_class = report.serializers.ReportAssetSerializer
+
+
report_api_urls = [
+ # Report assets
+ path(
+ 'asset/',
+ include([
+ path(
+ '/', ReportAssetDetail.as_view(), name='api-report-asset-detail'
+ ),
+ path('', ReportAssetList.as_view(), name='api-report-asset-list'),
+ ]),
+ ),
+ # Report snippets
+ path(
+ 'snippet/',
+ include([
+ path(
+ '/',
+ ReportSnippetDetail.as_view(),
+ name='api-report-snippet-detail',
+ ),
+ path('', ReportSnippetList.as_view(), name='api-report-snippet-list'),
+ ]),
+ ),
# Purchase order reports
path(
'po/',
@@ -528,7 +566,7 @@ report_api_urls = [
path(
'metadata/',
MetadataView.as_view(),
- {'model': PurchaseOrderReport},
+ {'model': report.models.PurchaseOrderReport},
name='api-po-report-metadata',
),
path(
@@ -558,7 +596,7 @@ report_api_urls = [
path(
'metadata/',
MetadataView.as_view(),
- {'model': SalesOrderReport},
+ {'model': report.models.SalesOrderReport},
name='api-so-report-metadata',
),
path(
@@ -586,7 +624,7 @@ report_api_urls = [
path(
'metadata/',
MetadataView.as_view(),
- {'model': ReturnOrderReport},
+ {'model': report.models.ReturnOrderReport},
name='api-so-report-metadata',
),
path(
@@ -617,7 +655,7 @@ report_api_urls = [
path(
'metadata/',
MetadataView.as_view(),
- {'model': BuildReport},
+ {'model': report.models.BuildReport},
name='api-build-report-metadata',
),
path(
@@ -645,7 +683,7 @@ report_api_urls = [
path(
'metadata/',
MetadataView.as_view(),
- {'model': BillOfMaterialsReport},
+ {'model': report.models.BillOfMaterialsReport},
name='api-bom-report-metadata',
),
path('', BOMReportDetail.as_view(), name='api-bom-report-detail'),
@@ -671,7 +709,7 @@ report_api_urls = [
path(
'metadata/',
MetadataView.as_view(),
- {'report': TestReport},
+ {'report': report.models.TestReport},
name='api-stockitem-testreport-metadata',
),
path(
@@ -705,7 +743,7 @@ report_api_urls = [
path(
'metadata/',
MetadataView.as_view(),
- {'report': StockLocationReport},
+ {'report': report.models.StockLocationReport},
name='api-stocklocation-report-metadata',
),
path(
diff --git a/InvenTree/report/models.py b/InvenTree/report/models.py
index 269b38ee6c..7958ffb08d 100644
--- a/InvenTree/report/models.py
+++ b/InvenTree/report/models.py
@@ -7,6 +7,7 @@ import sys
from django.conf import settings
from django.core.cache import cache
+from django.core.exceptions import ValidationError
from django.core.validators import FileExtensionValidator
from django.db import models
from django.template import Context, Template
@@ -585,10 +586,7 @@ class ReturnOrderReport(ReportTemplateBase):
def rename_snippet(instance, filename):
"""Function to rename a report snippet once uploaded."""
- filename = os.path.basename(filename)
-
- path = os.path.join('report', 'snippets', filename)
-
+ path = ReportSnippet.snippet_path(filename)
fullpath = settings.MEDIA_ROOT.joinpath(path).resolve()
# If the snippet file is the *same* filename as the one being uploaded,
@@ -610,6 +608,40 @@ class ReportSnippet(models.Model):
Useful for 'common' template actions, sub-templates, etc
"""
+ def __str__(self) -> str:
+ """String representation of a ReportSnippet instance."""
+ return f'snippets/{self.filename}'
+
+ @property
+ def filename(self):
+ """Return the filename of the asset."""
+ path = self.snippet.name
+ if path:
+ return os.path.basename(path)
+ else:
+ return '-'
+
+ @staticmethod
+ def snippet_path(filename):
+ """Return the fully-qualified snippet path for the given filename."""
+ return os.path.join('report', 'snippets', os.path.basename(str(filename)))
+
+ def validate_unique(self, exclude=None):
+ """Validate that this report asset is unique."""
+ proposed_path = self.snippet_path(self.snippet)
+
+ if (
+ ReportSnippet.objects.filter(snippet=proposed_path)
+ .exclude(pk=self.pk)
+ .count()
+ > 0
+ ):
+ raise ValidationError({
+ 'snippet': _('Snippet file with this name already exists')
+ })
+
+ return super().validate_unique(exclude)
+
snippet = models.FileField(
upload_to=rename_snippet,
verbose_name=_('Snippet'),
@@ -626,19 +658,20 @@ class ReportSnippet(models.Model):
def rename_asset(instance, filename):
"""Function to rename an asset file when uploaded."""
- filename = os.path.basename(filename)
-
- path = os.path.join('report', 'assets', filename)
+ path = ReportAsset.asset_path(filename)
+ fullpath = settings.MEDIA_ROOT.joinpath(path).resolve()
# If the asset file is the *same* filename as the one being uploaded,
# delete the original one from the media directory
if str(filename) == str(instance.asset):
- fullpath = settings.MEDIA_ROOT.joinpath(path).resolve()
-
if fullpath.exists():
+ # Check for existing asset file with the same name
logger.info("Deleting existing asset file: '%s'", filename)
os.remove(fullpath)
+ # Ensure the cache is deleted for this asset
+ cache.delete(fullpath)
+
return path
@@ -652,7 +685,35 @@ class ReportAsset(models.Model):
def __str__(self):
"""String representation of a ReportAsset instance."""
- return os.path.basename(self.asset.name)
+ return f'assets/{self.filename}'
+
+ @property
+ def filename(self):
+ """Return the filename of the asset."""
+ path = self.asset.name
+ if path:
+ return os.path.basename(path)
+ else:
+ return '-'
+
+ @staticmethod
+ def asset_path(filename):
+ """Return the fully-qualified asset path for the given filename."""
+ return os.path.join('report', 'assets', os.path.basename(str(filename)))
+
+ def validate_unique(self, exclude=None):
+ """Validate that this report asset is unique."""
+ proposed_path = self.asset_path(self.asset)
+
+ if (
+ ReportAsset.objects.filter(asset=proposed_path).exclude(pk=self.pk).count()
+ > 0
+ ):
+ raise ValidationError({
+ 'asset': _('Asset file with this name already exists')
+ })
+
+ return super().validate_unique(exclude)
# Asset file
asset = models.FileField(
diff --git a/InvenTree/report/serializers.py b/InvenTree/report/serializers.py
index 362aa3519e..320c489a37 100644
--- a/InvenTree/report/serializers.py
+++ b/InvenTree/report/serializers.py
@@ -1,20 +1,13 @@
"""API serializers for the reporting models."""
+from rest_framework import serializers
+
+import report.models
from InvenTree.serializers import (
InvenTreeAttachmentSerializerField,
InvenTreeModelSerializer,
)
-from .models import (
- BillOfMaterialsReport,
- BuildReport,
- PurchaseOrderReport,
- ReturnOrderReport,
- SalesOrderReport,
- StockLocationReport,
- TestReport,
-)
-
class ReportSerializerBase(InvenTreeModelSerializer):
"""Base class for report serializer."""
@@ -24,7 +17,16 @@ class ReportSerializerBase(InvenTreeModelSerializer):
@staticmethod
def report_fields():
"""Generic serializer fields for a report template."""
- return ['pk', 'name', 'description', 'template', 'filters', 'enabled']
+ return [
+ 'pk',
+ 'name',
+ 'description',
+ 'template',
+ 'filters',
+ 'page_size',
+ 'landscape',
+ 'enabled',
+ ]
class TestReportSerializer(ReportSerializerBase):
@@ -33,7 +35,7 @@ class TestReportSerializer(ReportSerializerBase):
class Meta:
"""Metaclass options."""
- model = TestReport
+ model = report.models.TestReport
fields = ReportSerializerBase.report_fields()
@@ -43,7 +45,7 @@ class BuildReportSerializer(ReportSerializerBase):
class Meta:
"""Metaclass options."""
- model = BuildReport
+ model = report.models.BuildReport
fields = ReportSerializerBase.report_fields()
@@ -53,7 +55,7 @@ class BOMReportSerializer(ReportSerializerBase):
class Meta:
"""Metaclass options."""
- model = BillOfMaterialsReport
+ model = report.models.BillOfMaterialsReport
fields = ReportSerializerBase.report_fields()
@@ -63,7 +65,7 @@ class PurchaseOrderReportSerializer(ReportSerializerBase):
class Meta:
"""Metaclass options."""
- model = PurchaseOrderReport
+ model = report.models.PurchaseOrderReport
fields = ReportSerializerBase.report_fields()
@@ -73,7 +75,7 @@ class SalesOrderReportSerializer(ReportSerializerBase):
class Meta:
"""Metaclass options."""
- model = SalesOrderReport
+ model = report.models.SalesOrderReport
fields = ReportSerializerBase.report_fields()
@@ -83,7 +85,7 @@ class ReturnOrderReportSerializer(ReportSerializerBase):
class Meta:
"""Metaclass options."""
- model = ReturnOrderReport
+ model = report.models.ReturnOrderReport
fields = ReportSerializerBase.report_fields()
@@ -93,5 +95,30 @@ class StockLocationReportSerializer(ReportSerializerBase):
class Meta:
"""Metaclass options."""
- model = StockLocationReport
+ model = report.models.StockLocationReport
fields = ReportSerializerBase.report_fields()
+
+
+class ReportSnippetSerializer(InvenTreeModelSerializer):
+ """Serializer class for the ReportSnippet model."""
+
+ class Meta:
+ """Metaclass options."""
+
+ model = report.models.ReportSnippet
+
+ fields = ['pk', 'snippet', 'description']
+
+ snippet = InvenTreeAttachmentSerializerField()
+
+
+class ReportAssetSerializer(InvenTreeModelSerializer):
+ """Serializer class for the ReportAsset model."""
+
+ class Meta:
+ """Meta class options."""
+
+ model = report.models.ReportAsset
+ fields = ['pk', 'asset', 'description']
+
+ asset = InvenTreeAttachmentSerializerField()
diff --git a/InvenTree/report/templates/report/inventree_bill_of_materials_report.html b/InvenTree/report/templates/report/inventree_bill_of_materials_report.html
index f2dd287b5b..8f34911bfc 100644
--- a/InvenTree/report/templates/report/inventree_bill_of_materials_report.html
+++ b/InvenTree/report/templates/report/inventree_bill_of_materials_report.html
@@ -11,7 +11,7 @@ margin-top: 4cm;
{% endblock page_margin %}
{% block bottom_left %}
-content: "v{{ report_revision }} - {{ date.isoformat }}";
+content: "v{{ report_revision }} - {% format_date date %}";
{% endblock bottom_left %}
{% block bottom_center %}
diff --git a/InvenTree/report/templates/report/inventree_build_order_base.html b/InvenTree/report/templates/report/inventree_build_order_base.html
index 23b76f85b2..dfb177a9fa 100644
--- a/InvenTree/report/templates/report/inventree_build_order_base.html
+++ b/InvenTree/report/templates/report/inventree_build_order_base.html
@@ -74,7 +74,7 @@ margin-top: 4cm;
{% endblock style %}
{% block bottom_left %}
-content: "v{{ report_revision }} - {{ date.isoformat }}";
+content: "v{{ report_revision }} - {% format_date date %}";
{% endblock bottom_left %}
{% block header_content %}
@@ -119,13 +119,13 @@ content: "v{{ report_revision }} - {{ date.isoformat }}";
{% trans "Issued" %} |
- {% render_date build.creation_date %} |
+ {% format_date build.creation_date %} |
{% trans "Target Date" %} |
{% if build.target_date %}
- {% render_date build.target_date %}
+ {% format_date build.target_date %}
{% else %}
Not specified
{% endif %}
diff --git a/InvenTree/report/templates/report/inventree_order_report_base.html b/InvenTree/report/templates/report/inventree_order_report_base.html
index ceaf3edd7e..6f936681dc 100644
--- a/InvenTree/report/templates/report/inventree_order_report_base.html
+++ b/InvenTree/report/templates/report/inventree_order_report_base.html
@@ -12,7 +12,7 @@ margin-top: 4cm;
{% endblock page_margin %}
{% block bottom_left %}
-content: "v{{ report_revision }} - {{ date.isoformat }}";
+content: "v{{ report_revision }} - {% format_date date %}";
{% endblock bottom_left %}
{% block bottom_center %}
diff --git a/InvenTree/report/templates/report/inventree_slr_report.html b/InvenTree/report/templates/report/inventree_slr_report.html
index f10c74d318..f2e13ff843 100644
--- a/InvenTree/report/templates/report/inventree_slr_report.html
+++ b/InvenTree/report/templates/report/inventree_slr_report.html
@@ -11,7 +11,7 @@ margin-top: 4cm;
{% endblock page_margin %}
{% block bottom_left %}
-content: "v{{ report_revision }} - {{ date.isoformat }}";
+content: "v{{ report_revision }} - {% format_date date %}";
{% endblock bottom_left %}
{% block bottom_center %}
diff --git a/InvenTree/report/templates/report/inventree_test_report_base.html b/InvenTree/report/templates/report/inventree_test_report_base.html
index 3afcdb474b..4e25b4598f 100644
--- a/InvenTree/report/templates/report/inventree_test_report_base.html
+++ b/InvenTree/report/templates/report/inventree_test_report_base.html
@@ -10,7 +10,7 @@
}
{% block bottom_left %}
-content: "{{ date.isoformat }}";
+content: "{% format_date date %}";
{% endblock bottom_left %}
{% block bottom_center %}
@@ -133,7 +133,7 @@ content: "{% trans 'Stock Item Test Report' %}";
{% endif %}
| {{ test_result.value }} |
{{ test_result.user.username }} |
- {{ test_result.date.date.isoformat }} |
+ {% format_date test_result.date.date %} |
{% else %}
{% if test_template.required %}
{% trans "No result (required)" %} |
diff --git a/InvenTree/report/templatetags/report.py b/InvenTree/report/templatetags/report.py
index e66cc326a9..aea2105abb 100644
--- a/InvenTree/report/templatetags/report.py
+++ b/InvenTree/report/templatetags/report.py
@@ -410,7 +410,10 @@ def format_number(number, **kwargs):
except ValueError:
pass
- value = str(number)
+ # Re-encode, and normalize again
+ value = Decimal(number).normalize()
+ value = format(value, 'f')
+ value = str(value)
leading = kwargs.get('leading', None)
@@ -422,3 +425,37 @@ def format_number(number, **kwargs):
pass
return value
+
+
+@register.simple_tag
+def format_datetime(datetime, timezone=None, format=None):
+ """Format a datetime object for display.
+
+ Arguments:
+ datetime: The datetime object to format
+ timezone: The timezone to use for the date (defaults to the server timezone)
+ format: The format string to use (defaults to ISO formatting)
+ """
+ datetime = InvenTree.helpers.to_local_time(datetime, timezone)
+
+ if format:
+ return datetime.strftime(format)
+ else:
+ return datetime.isoformat()
+
+
+@register.simple_tag
+def format_date(date, timezone=None, format=None):
+ """Format a date object for display.
+
+ Arguments:
+ date: The date to format
+ timezone: The timezone to use for the date (defaults to the server timezone)
+ format: The format string to use (defaults to ISO formatting)
+ """
+ date = InvenTree.helpers.to_local_time(date, timezone).date()
+
+ if format:
+ return date.strftime(format)
+ else:
+ return date.isoformat()
diff --git a/InvenTree/report/tests.py b/InvenTree/report/tests.py
index ab9b68f83c..2296a2f5db 100644
--- a/InvenTree/report/tests.py
+++ b/InvenTree/report/tests.py
@@ -8,10 +8,12 @@ from pathlib import Path
from django.conf import settings
from django.core.cache import cache
from django.http.response import StreamingHttpResponse
-from django.test import TestCase
+from django.test import TestCase, override_settings
from django.urls import reverse
+from django.utils import timezone
from django.utils.safestring import SafeString
+import pytz
from PIL import Image
import report.models as report_models
@@ -153,6 +155,37 @@ class ReportTagTest(TestCase):
self.assertEqual(report_tags.multiply(2.3, 4), 9.2)
self.assertEqual(report_tags.divide(100, 5), 20)
+ @override_settings(TIME_ZONE='America/New_York')
+ def test_date_tags(self):
+ """Test for date formatting tags.
+
+ - Source timezone is Australia/Sydney
+ - Server timezone is America/New York
+ """
+ time = timezone.datetime(
+ year=2024,
+ month=3,
+ day=13,
+ hour=12,
+ minute=30,
+ second=0,
+ tzinfo=pytz.timezone('Australia/Sydney'),
+ )
+
+ # Format a set of tests: timezone, format, expected
+ tests = [
+ (None, None, '2024-03-12T22:25:00-04:00'),
+ (None, '%d-%m-%y', '12-03-24'),
+ ('UTC', None, '2024-03-13T02:25:00+00:00'),
+ ('UTC', '%d-%B-%Y', '13-March-2024'),
+ ('Europe/Amsterdam', None, '2024-03-13T03:25:00+01:00'),
+ ('Europe/Amsterdam', '%y-%m-%d %H:%M', '24-03-13 03:25'),
+ ]
+
+ for tz, fmt, expected in tests:
+ result = report_tags.format_datetime(time, tz, fmt)
+ self.assertEqual(result, expected)
+
class BarcodeTagTest(TestCase):
"""Unit tests for the barcode template tags."""
diff --git a/InvenTree/stock/serializers.py b/InvenTree/stock/serializers.py
index cae8460a41..8d062f6855 100644
--- a/InvenTree/stock/serializers.py
+++ b/InvenTree/stock/serializers.py
@@ -6,7 +6,7 @@ from decimal import Decimal
from django.core.exceptions import ValidationError as DjangoValidationError
from django.db import transaction
-from django.db.models import BooleanField, Case, Count, Q, Value, When
+from django.db.models import BooleanField, Case, Count, Prefetch, Q, Value, When
from django.db.models.functions import Coalesce
from django.utils.translation import gettext_lazy as _
@@ -20,6 +20,7 @@ import company.models
import InvenTree.helpers
import InvenTree.serializers
import InvenTree.status_codes
+import part.filters as part_filters
import part.models as part_models
import stock.filters
from company.serializers import SupplierPartSerializer
@@ -289,7 +290,14 @@ class StockItemSerializer(InvenTree.serializers.InvenTreeTagModelSerializer):
'location',
'sales_order',
'purchase_order',
- 'part',
+ Prefetch(
+ 'part',
+ queryset=part_models.Part.objects.annotate(
+ category_default_location=part_filters.annotate_default_location(
+ 'category__'
+ )
+ ).prefetch_related(None),
+ ),
'part__category',
'part__pricing_data',
'supplier_part',
@@ -886,6 +894,7 @@ class LocationSerializer(InvenTree.serializers.InvenTreeTagModelSerializer):
'pathstring',
'path',
'items',
+ 'sublocations',
'owner',
'icon',
'custom_icon',
@@ -911,13 +920,18 @@ class LocationSerializer(InvenTree.serializers.InvenTreeTagModelSerializer):
def annotate_queryset(queryset):
"""Annotate extra information to the queryset."""
# Annotate the number of stock items which exist in this category (including subcategories)
- queryset = queryset.annotate(items=stock.filters.annotate_location_items())
+ queryset = queryset.annotate(
+ items=stock.filters.annotate_location_items(),
+ sublocations=stock.filters.annotate_sub_locations(),
+ )
return queryset
url = serializers.CharField(source='get_absolute_url', read_only=True)
- items = serializers.IntegerField(read_only=True)
+ items = serializers.IntegerField(read_only=True, label=_('Stock Items'))
+
+ sublocations = serializers.IntegerField(read_only=True, label=_('Sublocations'))
level = serializers.IntegerField(read_only=True)
diff --git a/InvenTree/templates/InvenTree/settings/report.html b/InvenTree/templates/InvenTree/settings/report.html
index baf57c9bfc..683625bd74 100644
--- a/InvenTree/templates/InvenTree/settings/report.html
+++ b/InvenTree/templates/InvenTree/settings/report.html
@@ -15,6 +15,7 @@
{% include "InvenTree/settings/setting.html" with key="REPORT_ENABLE" icon="fa-file-pdf" %}
{% include "InvenTree/settings/setting.html" with key="REPORT_DEFAULT_PAGE_SIZE" icon="fa-print" %}
{% include "InvenTree/settings/setting.html" with key="REPORT_DEBUG_MODE" icon="fa-laptop-code" %}
+ {% include "InvenTree/settings/setting.html" with key="REPORT_LOG_ERRORS" icon="fa-exclamation-circle" %}
{% include "InvenTree/settings/setting.html" with key="REPORT_ENABLE_TEST_REPORT" icon="fa-vial" %}
{% include "InvenTree/settings/setting.html" with key="REPORT_ATTACH_TEST_REPORT" icon="fa-file-upload" %}
diff --git a/InvenTree/templates/js/translated/bom.js b/InvenTree/templates/js/translated/bom.js
index ebf1caec67..11d03c095e 100644
--- a/InvenTree/templates/js/translated/bom.js
+++ b/InvenTree/templates/js/translated/bom.js
@@ -1172,12 +1172,18 @@ function loadBomTable(table, options={}) {
var available_stock = availableQuantity(row);
+ var external_stock = row.external_stock ?? 0;
+
var text = renderLink(`${available_stock}`, url);
if (row.sub_part_detail && row.sub_part_detail.units) {
text += ` ${row.sub_part_detail.units}`;
}
+ if (external_stock > 0) {
+ text += makeIconBadge('fa-sitemap', `{% trans "External stock" %}: ${external_stock}`);
+ }
+
if (available_stock <= 0) {
text += makeIconBadge('fa-times-circle icon-red', '{% trans "No Stock Available" %}');
} else {
diff --git a/InvenTree/templates/js/translated/build.js b/InvenTree/templates/js/translated/build.js
index 97b9ba3095..a8026414b7 100644
--- a/InvenTree/templates/js/translated/build.js
+++ b/InvenTree/templates/js/translated/build.js
@@ -2618,6 +2618,10 @@ function loadBuildLineTable(table, build_id, options={}) {
icons += makeIconBadge('fa-tools icon-blue', `{% trans "In Production" %}: ${formatDecimal(row.in_production)}`);
}
+ if (row.external_stock > 0) {
+ icons += makeIconBadge('fa-sitemap', `{% trans "External stock" %}: ${row.external_stock}`);
+ }
+
return renderLink(text, url) + icons;
}
},
@@ -2730,6 +2734,7 @@ function loadBuildLineTable(table, build_id, options={}) {
allocateStockToBuild(build_id, [row], {
output: options.output,
+ source_location: options.location,
success: function() {
$(table).bootstrapTable('refresh');
}
diff --git a/InvenTree/templates/js/translated/part.js b/InvenTree/templates/js/translated/part.js
index 240734e958..ffcea223d3 100644
--- a/InvenTree/templates/js/translated/part.js
+++ b/InvenTree/templates/js/translated/part.js
@@ -2804,6 +2804,15 @@ function loadPartCategoryTable(table, options) {
title: '{% trans "Parts" %}',
switchable: true,
sortable: true,
+ },
+ {
+ field: 'structural',
+ title: '{% trans "Structural" %}',
+ switchable: true,
+ sortable: true,
+ formatter: function(value) {
+ return yesNoLabel(value);
+ }
}
]
});
diff --git a/InvenTree/users/models.py b/InvenTree/users/models.py
index 806f39586d..701b7e8105 100644
--- a/InvenTree/users/models.py
+++ b/InvenTree/users/models.py
@@ -717,7 +717,10 @@ def check_user_role(user, role, permission):
# First, check the cache
key = f'role_{user}_{role}_{permission}'
- result = cache.get(key)
+ try:
+ result = cache.get(key)
+ except Exception:
+ result = None
if result is not None:
return result
@@ -745,7 +748,11 @@ def check_user_role(user, role, permission):
break
# Save result to cache
- cache.set(key, result, timeout=3600)
+ try:
+ cache.set(key, result, timeout=3600)
+ except Exception:
+ pass
+
return result
diff --git a/contrib/packager.io/functions.sh b/contrib/packager.io/functions.sh
index a0509a504a..97dbd71027 100755
--- a/contrib/packager.io/functions.sh
+++ b/contrib/packager.io/functions.sh
@@ -183,7 +183,7 @@ function create_initscripts() {
${INIT_CMD} stop nginx
echo "# Setting up nginx to ${SETUP_NGINX_FILE}"
# Always use the latest nginx config; important if new headers are added / needed for security
- cp ${APP_HOME}/docker/production/nginx.prod.conf ${SETUP_NGINX_FILE}
+ cp ${APP_HOME}/contrib/packager.io/nginx.prod.conf ${SETUP_NGINX_FILE}
sed -i s/inventree-server:8000/localhost:6000/g ${SETUP_NGINX_FILE}
sed -i s=var/www=opt/inventree/data=g ${SETUP_NGINX_FILE}
# Start nginx
diff --git a/contrib/packager.io/nginx.prod.conf b/contrib/packager.io/nginx.prod.conf
new file mode 100644
index 0000000000..a78b9ebd0f
--- /dev/null
+++ b/contrib/packager.io/nginx.prod.conf
@@ -0,0 +1,67 @@
+
+server {
+
+ # Listen for connection on (internal) port 80
+ # If you are exposing this server to the internet, you should use HTTPS!
+ # In which case, you should also set up a redirect from HTTP to HTTPS, and listen on port 443
+ # See the Nginx documentation for more details
+ listen 80;
+
+ real_ip_header proxy_protocol;
+
+ location / {
+
+ proxy_set_header Host $http_host;
+ proxy_set_header X-Forwarded-By $server_addr:$server_port;
+ proxy_set_header X-Forwarded-For $remote_addr;
+ proxy_set_header X-Forwarded-Proto $scheme;
+ proxy_set_header X-Real-IP $remote_addr;
+ proxy_set_header CLIENT_IP $remote_addr;
+
+ proxy_pass_request_headers on;
+
+ proxy_redirect off;
+
+ client_max_body_size 100M;
+
+ proxy_buffering off;
+ proxy_request_buffering off;
+
+ # Do not touch this unless you have a specific reason - this and the docker-compose need to match
+ proxy_pass http://inventree-server:8000;
+ }
+
+ # Redirect any requests for static files
+ location /static/ {
+ alias /var/www/static/;
+ autoindex on;
+
+ # Caching settings
+ expires 30d;
+ add_header Pragma public;
+ add_header Cache-Control "public";
+ }
+
+ # Redirect any requests for media files
+ location /media/ {
+ alias /var/www/media/;
+
+ # Media files require user authentication
+ auth_request /auth;
+
+ # Content header to force download
+ add_header Content-disposition "attachment";
+ }
+
+ # Use the 'user' API endpoint for auth
+ location /auth {
+ internal;
+
+ proxy_pass http://inventree-server:8000/auth/;
+
+ proxy_pass_request_body off;
+ proxy_set_header Content-Length "";
+ proxy_set_header X-Original-URI $request_uri;
+ }
+
+}
diff --git a/docker/.env b/docker/.env
index 39ac250ccb..447ede63b4 100644
--- a/docker/.env
+++ b/docker/.env
@@ -43,7 +43,7 @@ INVENTREE_AUTO_UPDATE=True
# Image tag that should be used
INVENTREE_TAG=stable
-# Site URL - update this to match your host (and update the Caddyfile too!)
+# Site URL - update this to match your host
INVENTREE_SITE_URL="http://inventree.localhost"
COMPOSE_PROJECT_NAME=inventree
diff --git a/docker/Caddyfile b/docker/Caddyfile
index ad7b2c26ba..8e5e2f81a7 100644
--- a/docker/Caddyfile
+++ b/docker/Caddyfile
@@ -4,33 +4,51 @@
# - INVENTREE_SERVER: The internal URL of the Inventree container (default: http://inventree-server:8000)
(log_common) {
- log {
- output file /var/log/caddy/{args.0}.access.log
- }
+ log {
+ output file /var/log/caddy/{args[0]}.access.log
+ }
+}
+
+(cors-headers) {
+ header Allow GET,HEAD,OPTIONS
+ header Access-Control-Allow-Origin *
+ header Access-Control-Allow-Methods GET,HEAD,OPTIONS
+ header Access-Control-Allow-Headers Authorization,Content-Type,User-Agent
+
+ @cors_preflight{args[0]} method OPTIONS
+
+ handle @cors_preflight{args[0]} {
+ respond "" 204
+ }
}
# Change the host to your domain (this will serve at inventree.localhost)
{$INVENTREE_SITE_URL:inventree.localhost} {
- import log_common inventree
+ import log_common inventree
- encode gzip
+ encode gzip
- request_body {
- max_size 100MB
- }
+ request_body {
+ max_size 100MB
+ }
- handle_path /static/* {
- root * /var/www/static
- file_server
- }
+ handle_path /static/* {
+ import cors-headers static
- handle_path /media/* {
- forward_auth {$INVENTREE_SERVER:"http://inventree-server:8000"} {
- uri /auth/
- }
- root * /var/www/media
- file_server
- }
+ root * /var/www/static
+ file_server
+ }
- reverse_proxy {$INVENTREE_SERVER:"http://inventree-server:8000"}
+ handle_path /media/* {
+ import cors-headers media
+
+ root * /var/www/media
+ file_server
+
+ forward_auth {$INVENTREE_SERVER:"http://inventree-server:8000"} {
+ uri /auth/
+ }
+ }
+
+ reverse_proxy {$INVENTREE_SERVER:"http://inventree-server:8000"}
}
diff --git a/docker/docker-compose.yml b/docker/docker-compose.yml
index 7b948cf7ab..5fa1532481 100644
--- a/docker/docker-compose.yml
+++ b/docker/docker-compose.yml
@@ -4,7 +4,7 @@ version: "3.8"
# - PostgreSQL as the database backend
# - gunicorn as the InvenTree web server
# - django-q as the InvenTree background worker process
-# - nginx as a reverse proxy
+# - Caddy as a reverse proxy
# - redis as the cache manager (optional, disabled by default)
# ---------------------
diff --git a/docker/install_build_packages.sh b/docker/install_build_packages.sh
index ca7ea49ddf..358a256e7f 100644
--- a/docker/install_build_packages.sh
+++ b/docker/install_build_packages.sh
@@ -4,6 +4,7 @@
# Note that for postgreslql, we use the 13 version, which matches the version used in the InvenTree docker image
apk add gcc g++ musl-dev openssl-dev libffi-dev cargo python3-dev openldap-dev \
+ libstdc++ build-base linux-headers py3-grpcio \
jpeg-dev openjpeg-dev libwebp-dev zlib-dev \
sqlite sqlite-dev \
mariadb-connector-c-dev mariadb-client mariadb-dev \
diff --git a/docs/.gitignore b/docs/.gitignore
index ecbeb1b0ab..ea8649cfa3 100644
--- a/docs/.gitignore
+++ b/docs/.gitignore
@@ -10,6 +10,9 @@ env/
_build/
site/
+# Generated API schema files
+docs/api/schema/*.yml
+
# Temp files
releases.json
versions.json
diff --git a/docs/docs/api/api.md b/docs/docs/api/api.md
index 0d8b24b128..7f2c9328d0 100644
--- a/docs/docs/api/api.md
+++ b/docs/docs/api/api.md
@@ -17,6 +17,17 @@ The API is self-documenting, and the documentation is provided alongside any Inv
{% include 'img.html' %}
{% endwith %}
+### Schema Description
+ The API schema is also documented in the [API Schema](./schema.md) page.
+
+### Generating Schema File
+
+If you want to generate the API schema file yourself (for example to use with an external client, use the `invoke schema` command. Run with the `-help` command to see available options.
+
+```
+invoke schema -help
+```
+
## Authentication
Users must be authenticated to gain access to the InvenTree API. The API accepts either basic username:password authentication, or token authentication. Token authentication is recommended as it provides much faster API access.
diff --git a/docs/docs/api/schema.md b/docs/docs/api/schema.md
new file mode 100644
index 0000000000..441e977e2e
--- /dev/null
+++ b/docs/docs/api/schema.md
@@ -0,0 +1,40 @@
+---
+title: InvenTree API Schema
+---
+
+The InvenTree API is implemented using the [Django REST framework](https://www.django-rest-framework.org).
+The API schema as documented below is generated using the [drf-spectactular](https://github.com/tfranzel/drf-spectacular/) extension.
+
+## API Version
+
+This documentation is for API version: `171`
+
+!!! tip "API Schema History"
+ We track API schema changes, and provide a snapshot of each API schema version in the [API schema repository](https://github.com/inventree/schema/).
+
+## API Schema File
+
+The API schema file is available for download, and can be used for generating client libraries, or for testing API endpoints.
+
+## API Schema Documentation
+
+API schema documentation is split into the following categories:
+
+| Category | Description |
+| --- | --- |
+| [Authorization and Authentication](./schema/auth.md) | Authorization and Authentication |
+| [Background Task Management](./schema/background-task.md) | Background Task Management |
+| [Barcode Scanning](./schema/barcode.md) | Barcode Scanning |
+| [Bill of Materials](./schema/bom.md) | Bill of Materials |
+| [Build Order Management](./schema/build.md) | Build Order Management |
+| [Company Management](./schema/company.md) | Company Management |
+| [Label Printing](./schema/label.md) | Label Printing |
+| [External Machine Management](./schema/machine.md) | External Machine Management |
+| [External Order Management](./schema/order.md) | External Order Management |
+| [Parts and Part Categories](./schema/part.md) | Parts and Part Categories |
+| [Plugin Functionality](./schema/plugins.md) | Plugin Functionality |
+| [Report Generation](./schema/report.md) | Report Generation |
+| [Settings Management](./schema/settings.md) | Settings Management |
+| [Stock and Stock Locations](./schema/stock.md) | Stock and Stock Locations |
+| [User Management](./schema/user.md) | User Management |
+| [General](./schema/general.md) | General API endpoints |
diff --git a/docs/docs/api/schema/auth.md b/docs/docs/api/schema/auth.md
new file mode 100644
index 0000000000..62c8b50103
--- /dev/null
+++ b/docs/docs/api/schema/auth.md
@@ -0,0 +1,7 @@
+---
+title: Authorization and Authentication
+---
+
+The *Authorization and Authentication* section of the InvenTree API schema is documented below.
+
+[OAD(./docs/docs/api/schema/auth.yml)]
diff --git a/docs/docs/api/schema/background-task.md b/docs/docs/api/schema/background-task.md
new file mode 100644
index 0000000000..b1d5ad0b92
--- /dev/null
+++ b/docs/docs/api/schema/background-task.md
@@ -0,0 +1,7 @@
+---
+title: Background Task Management
+---
+
+The *Background Task Management* section of the InvenTree API schema is documented below.
+
+[OAD(./docs/docs/api/schema/background-task.yml)]
diff --git a/docs/docs/api/schema/barcode.md b/docs/docs/api/schema/barcode.md
new file mode 100644
index 0000000000..c0f5cab2bf
--- /dev/null
+++ b/docs/docs/api/schema/barcode.md
@@ -0,0 +1,7 @@
+---
+title: Barcode Scanning
+---
+
+The *Barcode Scanning* section of the InvenTree API schema is documented below.
+
+[OAD(./docs/docs/api/schema/barcode.yml)]
diff --git a/docs/docs/api/schema/bom.md b/docs/docs/api/schema/bom.md
new file mode 100644
index 0000000000..cdfd1ff9c2
--- /dev/null
+++ b/docs/docs/api/schema/bom.md
@@ -0,0 +1,7 @@
+---
+title: Bill of Materials
+---
+
+The *Bill of Materials* section of the InvenTree API schema is documented below.
+
+[OAD(./docs/docs/api/schema/bom.yml)]
diff --git a/docs/docs/api/schema/build.md b/docs/docs/api/schema/build.md
new file mode 100644
index 0000000000..3de0e521c6
--- /dev/null
+++ b/docs/docs/api/schema/build.md
@@ -0,0 +1,7 @@
+---
+title: Build Order Management
+---
+
+The *Build Order Management* section of the InvenTree API schema is documented below.
+
+[OAD(./docs/docs/api/schema/build.yml)]
diff --git a/docs/docs/api/schema/company.md b/docs/docs/api/schema/company.md
new file mode 100644
index 0000000000..924d899ad4
--- /dev/null
+++ b/docs/docs/api/schema/company.md
@@ -0,0 +1,7 @@
+---
+title: Company Management
+---
+
+The *Company Management* section of the InvenTree API schema is documented below.
+
+[OAD(./docs/docs/api/schema/company.yml)]
diff --git a/docs/docs/api/schema/general.md b/docs/docs/api/schema/general.md
new file mode 100644
index 0000000000..5da17b815d
--- /dev/null
+++ b/docs/docs/api/schema/general.md
@@ -0,0 +1,7 @@
+---
+title: General API Endpoints
+---
+
+The *General API Endpoints* section of the InvenTree API schema is documented below.
+
+[OAD(./docs/docs/api/schema/general.yml)]
diff --git a/docs/docs/api/schema/label.md b/docs/docs/api/schema/label.md
new file mode 100644
index 0000000000..d4bc47e57c
--- /dev/null
+++ b/docs/docs/api/schema/label.md
@@ -0,0 +1,7 @@
+---
+title: Label Printing
+---
+
+The *Label Printing* section of the InvenTree API schema is documented below.
+
+[OAD(./docs/docs/api/schema/label.yml)]
diff --git a/docs/docs/api/schema/machine.md b/docs/docs/api/schema/machine.md
new file mode 100644
index 0000000000..2fbadd41e6
--- /dev/null
+++ b/docs/docs/api/schema/machine.md
@@ -0,0 +1,7 @@
+---
+title: External Machine Management
+---
+
+The *External Machine Management* section of the InvenTree API schema is documented below.
+
+[OAD(./docs/docs/api/schema/machine.yml)]
diff --git a/docs/docs/api/schema/order.md b/docs/docs/api/schema/order.md
new file mode 100644
index 0000000000..7f6c8fdfd7
--- /dev/null
+++ b/docs/docs/api/schema/order.md
@@ -0,0 +1,7 @@
+---
+title: External Order Management
+---
+
+The *External Order Management* section of the InvenTree API schema is documented below.
+
+[OAD(./docs/docs/api/schema/order.yml)]
diff --git a/docs/docs/api/schema/part.md b/docs/docs/api/schema/part.md
new file mode 100644
index 0000000000..67c73eb0fb
--- /dev/null
+++ b/docs/docs/api/schema/part.md
@@ -0,0 +1,7 @@
+---
+title: Parts and Part Categories
+---
+
+The *Parts and Part Categories* section of the InvenTree API schema is documented below.
+
+[OAD(./docs/docs/api/schema/part.yml)]
diff --git a/docs/docs/api/schema/plugins.md b/docs/docs/api/schema/plugins.md
new file mode 100644
index 0000000000..ee0263cffa
--- /dev/null
+++ b/docs/docs/api/schema/plugins.md
@@ -0,0 +1,7 @@
+---
+title: Plugin Functionality
+---
+
+The *Plugin Functionality* section of the InvenTree API schema is documented below.
+
+[OAD(./docs/docs/api/schema/plugins.yml)]
diff --git a/docs/docs/api/schema/report.md b/docs/docs/api/schema/report.md
new file mode 100644
index 0000000000..dfad6d74be
--- /dev/null
+++ b/docs/docs/api/schema/report.md
@@ -0,0 +1,7 @@
+---
+title: Report Generation
+---
+
+The *Report Generation* section of the InvenTree API schema is documented below.
+
+[OAD(./docs/docs/api/schema/report.yml)]
diff --git a/docs/docs/api/schema/settings.md b/docs/docs/api/schema/settings.md
new file mode 100644
index 0000000000..4a6d4f4337
--- /dev/null
+++ b/docs/docs/api/schema/settings.md
@@ -0,0 +1,7 @@
+---
+title: Settings Management
+---
+
+The *Settings Management* section of the InvenTree API schema is documented below.
+
+[OAD(./docs/docs/api/schema/settings.yml)]
diff --git a/docs/docs/api/schema/stock.md b/docs/docs/api/schema/stock.md
new file mode 100644
index 0000000000..7b961e4b5b
--- /dev/null
+++ b/docs/docs/api/schema/stock.md
@@ -0,0 +1,7 @@
+---
+title: Stock and Stock Locations
+---
+
+The *Stock and Stock Locations* section of the InvenTree API schema is documented below.
+
+[OAD(./docs/docs/api/schema/stock.yml)]
diff --git a/docs/docs/api/schema/user.md b/docs/docs/api/schema/user.md
new file mode 100644
index 0000000000..e0ebba2770
--- /dev/null
+++ b/docs/docs/api/schema/user.md
@@ -0,0 +1,7 @@
+---
+title: User Management
+---
+
+The *User Management* section of the InvenTree API schema is documented below.
+
+[OAD(./docs/docs/api/schema/user.yml)]
diff --git a/docs/docs/assets/images/report/template-editor.png b/docs/docs/assets/images/report/template-editor.png
new file mode 100644
index 0000000000..20b8e8bbfe
Binary files /dev/null and b/docs/docs/assets/images/report/template-editor.png differ
diff --git a/docs/docs/assets/images/report/template-table.png b/docs/docs/assets/images/report/template-table.png
new file mode 100644
index 0000000000..36ec1164fd
Binary files /dev/null and b/docs/docs/assets/images/report/template-table.png differ
diff --git a/docs/docs/concepts/units.md b/docs/docs/concepts/units.md
index d65d122bc5..7b26ae445f 100644
--- a/docs/docs/concepts/units.md
+++ b/docs/docs/concepts/units.md
@@ -34,6 +34,15 @@ Scientific notation is also supported, and can be used to represent very large o
!!! tip "Case Sensitive"
Support for scientific notation is case sensitive. For example, `1E3` is a valid value, but `1e3` is not.
+### Feet and Inches
+
+Shorthand notation is supported for feet and inches. For example, the following values would all be considered *valid*:
+
+- `3'`: `3 feet`
+- `6"` : `6 inches`
+
+However, note that compound measurements (e.g. `3'6"`) are not supported.
+
### Case Sensitivity
The pint library is case sensitive, and units must be specified in the correct case. For example, `kg` is a valid unit, but `KG` is not. In particular, you need to pay close attention when using SI prefixes (e.g. `k` for kilo, `M` for mega, `n` for nano, etc).
@@ -48,7 +57,7 @@ The [unit of measure](../part/part.md#units-of-measure) field for the [Part](../
### Supplier Part
-The [supplier part](../part/part/#supplier-parts) model uses real-world units to convert between supplier part quantities and internal stock quantities. Unit conversion rules ensure that only compatible unit types can be supplied
+The [supplier part](../part/part.md/#supplier-parts) model uses real-world units to convert between supplier part quantities and internal stock quantities. Unit conversion rules ensure that only compatible unit types can be supplied
### Part Parameter
diff --git a/docs/docs/extend/plugins/tags.md b/docs/docs/extend/plugins/tags.md
index ebcfdc3502..c7853e0baa 100644
--- a/docs/docs/extend/plugins/tags.md
+++ b/docs/docs/extend/plugins/tags.md
@@ -8,7 +8,7 @@ Several models in InvenTree can be tagged with arbitrary tags. Tags are useful f
Tags are shared between all models that can be tagged.
The following models can be tagged:
-- [Parts](../../part/part.md) and [Supplier Parts](../../order/company#supplier-parts)/[Manufacturer Part](../../order/company#manufacturer-parts)
+- [Parts](../../part/part.md) and [Supplier Parts](../../order/company.md#supplier-parts)/[Manufacturer Part](../../order/company.md#manufacturer-parts)
- [Stock Items](../../stock/stock.md#stock-item) / [Stock Location](../../stock/stock.md#stock-location)
diff --git a/docs/docs/part/create.md b/docs/docs/part/create.md
index 0eab451789..46750fbd67 100644
--- a/docs/docs/part/create.md
+++ b/docs/docs/part/create.md
@@ -64,6 +64,6 @@ If the *Add Supplier Data* option is checked, then supplier part and manufacture
The following alternative methods for creating parts are supported:
-- [Via the REST API](../../api/api)
-- [Using the Python library](../../api/python)
-- [Within the Admin interface](../../settings/admin)
+- [Via the REST API](../api/api.md)
+- [Using the Python library](../api/python/python.md)
+- [Within the Admin interface](../settings/admin.md)
diff --git a/docs/docs/part/notification.md b/docs/docs/part/notification.md
index 48d0bffde9..27aed5a9cd 100644
--- a/docs/docs/part/notification.md
+++ b/docs/docs/part/notification.md
@@ -7,7 +7,7 @@ title: Part Notifications
Users can select to receive notifications when certain events occur.
!!! warning "Email Configuration Required"
- External notifications require correct [email configuration](../../start/config/#email-settings). They also need to be enabled in the settings under notifications`.
+ External notifications require correct [email configuration](../start/config.md#email-settings). They also need to be enabled in the settings under notifications`.
!!! warning "Valid Email Address"
Each user must have a valid email address associated with their account to receive email notifications
@@ -50,7 +50,7 @@ Any users who are subscribed to notifications for the part in question will rece
### Build Order Notification
-When a new [Build Order](../../build/build/) is created, the InvenTree software checks to see if any of the parts required to complete the order are low on stock.
+When a new [Build Order](../build/build.md) is created, the InvenTree software checks to see if any of the parts required to complete the order are low on stock.
If there are any parts with low stock, a notification is generated for any users subscribed to notifications for the part being built.
diff --git a/docs/docs/part/trackable.md b/docs/docs/part/trackable.md
index 55aba96f89..4810c0a94c 100644
--- a/docs/docs/part/trackable.md
+++ b/docs/docs/part/trackable.md
@@ -2,7 +2,7 @@
title: Trackable Parts
---
-Denoting a part as *Trackble* changes the way that [stock items](../../stock/stock) associated with the particular part are handled in the database. A trackable part also has more restrictions imposed by the database scheme.
+Denoting a part as *Trackble* changes the way that [stock items](../stock/stock.md) associated with the particular part are handled in the database. A trackable part also has more restrictions imposed by the database scheme.
## Stock Tracking
diff --git a/docs/docs/releases/0.1.5.md b/docs/docs/releases/0.1.5.md
index 593c68cc39..1199a8e317 100644
--- a/docs/docs/releases/0.1.5.md
+++ b/docs/docs/releases/0.1.5.md
@@ -24,7 +24,7 @@ Refer to the [build documentation](../build/build.md#overdue-builds) for more in
### Stock Item Expiry
-[#1202](https://github.com/inventree/InvenTree/pull/1202) introduces the concept of an *Expiry Date* for Stock Items. For further information, refer to the [expiry documentation](../../stock/expiry).
+[#1202](https://github.com/inventree/InvenTree/pull/1202) introduces the concept of an *Expiry Date* for Stock Items. For further information, refer to the [expiry documentation](../stock/expiry.md).
### Stock Ownership
diff --git a/docs/docs/releases/0.2.1.md b/docs/docs/releases/0.2.1.md
index 036e03ec7b..c992bd7db6 100644
--- a/docs/docs/releases/0.2.1.md
+++ b/docs/docs/releases/0.2.1.md
@@ -14,7 +14,7 @@ title: Release 0.2.1
!!! warning "Configuration Required"
Refer to the [email configuration
- options](../../start/config/#email-settings).
+ options](../start/config.md#email-settings).
### Manufacturer Parts
diff --git a/docs/docs/releases/0.6.0.md b/docs/docs/releases/0.6.0.md
index 90a0971499..5edd0d2d97 100644
--- a/docs/docs/releases/0.6.0.md
+++ b/docs/docs/releases/0.6.0.md
@@ -54,7 +54,7 @@ PR [#2119](https://github.com/inventree/InvenTree/pull/2119) adds the ability to
### SSO Support
-PR [#2017](https://github.com/inventree/InvenTree/pull/2017) adds support for SSO (single sign on) authentication. SSO integration requires configuration by the system administrator. Refer to the [SSO documentation](../settings/sso) for further information.
+PR [#2017](https://github.com/inventree/InvenTree/pull/2017) adds support for SSO (single sign on) authentication. SSO integration requires configuration by the system administrator. Refer to the [SSO documentation](../settings/SSO.md) for further information.
### BOM Substitution
@@ -74,7 +74,7 @@ PR [#2208](https://github.com/inventree/InvenTree/pull/2208) provides notificati
### MFA Support
-PR [#2221](https://github.com/inventree/InvenTree/pull/2221) adds support for MFA (multi factor authentication). This enables admins to require all users to enable MFA as a second auth step. Refer to the [documentation](../settings/mfa) for further information.
+PR [#2221](https://github.com/inventree/InvenTree/pull/2221) adds support for MFA (multi factor authentication). This enables admins to require all users to enable MFA as a second auth step. Refer to the [documentation](../settings/MFA.md) for further information.
### Stock Item Forms
PR [#2198](https://github.com/inventree/InvenTree/pull/2198) provides a major refactor of stock item forms, for creating and editing stock items. These forms have been migrated to the REST API, providing a much more responsive user experience.
diff --git a/docs/docs/report/bom.md b/docs/docs/report/bom.md
index f6f2864e01..13de616082 100644
--- a/docs/docs/report/bom.md
+++ b/docs/docs/report/bom.md
@@ -40,7 +40,7 @@ margin-top: 4cm;
{% endblock %}
{% block bottom_left %}
-content: "v{{report_revision}} - {{ date.isoformat }}";
+content: "v{{report_revision}} - {% format_date date %}";
{% endblock %}
{% block bottom_center %}
diff --git a/docs/docs/report/build.md b/docs/docs/report/build.md
index f1b138f5eb..ab6b740d7e 100644
--- a/docs/docs/report/build.md
+++ b/docs/docs/report/build.md
@@ -186,7 +186,7 @@ margin-top: 4cm;
{% endblock %}
{% block bottom_left %}
-content: "v{{report_revision}} - {{ date.isoformat }}";
+content: "v{{report_revision}} - {% format_date date %}";
{% endblock %}
{% block header_content %}
@@ -230,13 +230,13 @@ content: "v{{report_revision}} - {{ date.isoformat }}";
{% trans "Issued" %} |
- {% render_date build.creation_date %} |
+ {% format_date build.creation_date %} |
{% trans "Target Date" %} |
{% if build.target_date %}
- {% render_date build.target_date %}
+ {% format_date build.target_date %}
{% else %}
Not specified
{% endif %}
diff --git a/docs/docs/report/helpers.md b/docs/docs/report/helpers.md
index 6aa5475e23..b275ede4b9 100644
--- a/docs/docs/report/helpers.md
+++ b/docs/docs/report/helpers.md
@@ -64,7 +64,7 @@ To return an element corresponding to a certain key in a container which support
{% endraw %}
```
-## Formatting Numbers
+## Number Formatting
The helper function `format_number` allows for some common number formatting options. It takes a number (or a number-like string) as an input, as well as some formatting arguments. It returns a *string* containing the formatted number:
@@ -78,7 +78,33 @@ The helper function `format_number` allows for some common number formatting opt
{% endraw %}
```
-## Rendering Currency
+## Date Formatting
+
+For rendering date and datetime information, the following helper functions are available:
+
+- `format_date`: Format a date object
+- `format_datetime`: Format a datetime object
+
+Each of these helper functions takes a date or datetime object as an input, and returns a *string* containing the formatted date or datetime. The following additional arguments are available:
+
+| Argument | Description |
+| --- | --- |
+| timezone | Specify the timezone to render the date in. If not specified, uses the InvenTree server timezone |
+| format | Specify the format string to use for rendering the date. If not specified, uses ISO formatting. Refer to the [datetime format codes](https://docs.python.org/3/library/datetime.html#format-codes) for more information! |
+
+### Example
+
+A simple example of using the date formatting helper functions:
+
+```html
+{% raw %}
+{% load report %}
+Date: {% format_date my_date timezone="Australia/Sydney" %}
+Datetime: {% format_datetime my_datetime format="%d-%m-%Y %H:%M%S" %}
+{% endraw %}
+```
+
+## Currency Formatting
The helper function `render_currency` allows for simple rendering of currency data. This function can also convert the specified amount of currency into a different target currency:
diff --git a/docs/docs/report/report.md b/docs/docs/report/report.md
index e82ac5ead6..1bd05c3c6d 100644
--- a/docs/docs/report/report.md
+++ b/docs/docs/report/report.md
@@ -117,6 +117,7 @@ So, if you are writing a template which has custom formatting, (or any other sec
```html
{% raw %}
+{% load l10n %}
|